السبت، 10 ديسمبر 2016

جميع دوارة بايثون علي قناتي الشخصية

السلام عليكم ورحمة الله وبركاتة

هذه هي اهم الدورات المتوفرة علي قناتي الخاصة بلغة بايثون

هذه هي دورة بايثون الخاصة با اﻻساسيات المهمه في اللغة

وبعد اﻻطﻻع علي البلاي لست الخاصة بالدورة  من  هنا


اليكم دورة التعامل مع بايثون الثانية وفيها oop الخاص با اللغة مشروح بصورة جميلة




وبعد اﻻطلاع علي البلاي لست الخاصة بالدورة من هنا

اليكم دورة التعامل مع pyqt4 و sqlite3



وبعد اﻻطلاع علي البلاي لست الخاص بالدورة من هنا

ننتقل الي دورة بايثون جانغو


والبلاي لست الخاصة بالدورة من هنا  

مقدمة لمكتبة urllip

مقدمة لمكتبة urllip

إن وحدة urllip في بايثون 3 عبارة عن عن محموعة من الوحدات التي يمكننا إستخدامها للتعامل مع الروابط ، وإذا كنت قادم من بايثون 2 ستجد أن بايثون 2 لديها urllip و urllip2  أما في بايثون 3 أصبحوا عبارة عن حزمة واحدة تحت إسم urllip ويتكون الإصدار الحالي من :
  • urllib.request
  • urllib.error
  • urllib.parse
  • urllib.rebotparser
سنقوم بتغطية كل جزء ماعدا urllib.error 

urllib.request

تستخدم هذه الوحدة أساسا لفتح وجلب الروابط ، دعونا نقوم ببعض الأمثلة لنرى مالذي يمكننا فعله مع وظيفة urlopen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>>>import urllib.request
>>> url = urllib.request.urlopen('https://www.google.com/')
 >>>url.geturl()
>>>url.info()
lt;http.client.HTTPMessage object at 0x7fddc2de04e0
>>> header = url.info()
>>>header.as_string()
('Date: Fri, 24 Jun 2016 18:21:19 GMT\n'
'Expires: -1\n'
'Cache-Control: private, max-age=0\n'
'Content-Type: text/html; charset=ISO-8859-1\n'
'P3P: CP="This is not a P3P policy! See '
'Server: gws\n'
'X-XSS-Protection: 1; mode=block\n'
'X-Frame-Options: SAMEORIGIN\n'
'Set-Cookie: '
'NID=80=tYjmy0JY6flsSVj7DPSSZNOuqdvqKfKHDcHsPIGu3xFv41LvH_Jg6LrUsDgkPrtM2hmZ3j9V76pS4K_
cBg7pdwueMQfr0DFzw33SwpGex5qzLkXUvUVPfe9g699Qz4cx9ipcbU3HKwrRYA; '
'expires=Sat, 24-Dec-2016 18:21:19 GMT; path=/; domain=.google.com; HttpOnly\n'
'Alternate-Protocol: 443:quic\n'
'Alt-Svc: quic=":443"; ma=2592000; v="34,33,32,31,30,29,28,27,26,25"\n'
'Accept-Ranges: none\n'
'Vary: Accept-Encoding\n'
'Connection: close\n'
'\n')
>>> url.getcode()
200
قمنا بإستدعاء وجدتنا وقمنا أيضا بفتح موقع google وأصبح لدينا كائن HTTPResponse نستطيع التعامل معه ، الأمر الأول الذي قمنا به هو تنفيذ geturl للحصول على رابط وهي مفيدة لمعرفة ما إذا تم إعادة توجيهنا إلى رابط أخر أم لا .
بعد ذلك قمنا بإستدعاء  info والذي سيعرض بيانات وصفية حول الصفحة مثل معلومات حول headers وهكذا يمكننا تعيين نتيجة هذا الأخير لمتغير headers ثم نقوم بمناداة as_string وهذا سيقوم بعرض header المستقبل من موقع قوقل ، يمكننا أيضا الحصول على رمز الإستجابة الخاص ب HTTP بإستدعائنا ل getcode وفي حالتنا هذه هو عبارة عن 200 وهذا يعني نجاح العملية .
إذا كنت تريد الإطلاع على كود HTML الخاص بالصفحة يمكنك مناداة طريقة READ على متغير url الذي قمنا بإنشاءه، لن أقوم بعرض الناتج لأنه سيكون كبير نوعا ما ولكن يمكنك تجربته لتتأكد.
يرجى أيضا الـتأكد من أن كائن الطلب الإفتراضي هو GET مالم يتم تحديد خيارات البيانات .

تحميل ملف 

أهم إستخدامات حزمة  urllib هو تحميل الملفات فدعونا نارى بعض الأمثلة لتحقيق ذلك
1
2
3
4
5
6
7
>>> import urllib.request
>>>response = urllib.request.urlopen(url)
>>> data = response.read()
>>> with open('/home/mike/Desktop/test.zip', 'wb') as fobj:
... fobj.write(data)
...
هنا قمنا بفتح الرابط الذي يقودنا إلى الملف المطلوب للتحميل ثم نقوم بقراءة البيانات وبالتالي تتم عملية التحميل .
هناك طريقة أخرى لتحقيق نفس العملية وهي بإستخدام urlretrieve :
1
2
3
4
5
>>> import urllib.request
>>> urllib.request.urlretrieve(url, '/home/mike/Desktop/blog.zip')
('/home/mike/Desktop/blog.zip',
 <http.client.HTTPMessage object at 0x7fddc21c2470>)
هذه الطريقة ستقوم بنسخ كائن الشبكة إلى الملف المحلي ويتم تسمية الملف المنسوخ عشوائيا ويتم نسخه على دليل مؤقت إلا في حالة إستخدام خيارات خاصة لتجعله يقوم بحفظ الملف في دليل معين :
1
2
3
4
5
6
>>> import urllib.request
>>> tmp_file, header = urllib.request.urlretrieve(url)
>>> with open('/home/mike/Desktop/test.zip', 'wb') as fobj:
...     with open(tmp_file, 'rb') as tmp:
...         fobj.write(tmp.read())
وكما ترى فإنه في الأخير يقوم بعرض عنوان الدليل التي حفظ الملف عليه بالإضافة إلى معلومات رأس الطلب .

تحديد وكيل المستخدم الخاص بك

عندما تقوم بزيارة موقع ما من خلال المتصفح فإن هذالإخير يخبر الموقع من هو ، وهذا مايسمى بسلسلة user-agent ، مكتبة بايثون urllip تقوم بتحديد نفسها ك : Python-urllib/x.y حيث أن X و Y رقم إصدار بايثون الرئيسي والثانوي ، بعض المواقع لن تتعرف على سلسلة وكيل المستخدم وستتصرف بطريقة غريبة أو لن تعمل على الإطلاق .
لحسن الحظ يمكن إعداد سلسلة وكيل المستخدم خاص بك :
1
2
3
4
5
6
7
8
>>> import urllib.request
>>> user_agent = ' Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0'
>>> headers = {'User-Agent': user_agent}
>>> request = urllib.request.Request(url, headers=headers)
>>> with urllib.request.urlopen(request) as response:
...     with open('/home/mdriscoll/Desktop/user_agent.html', 'wb') as out:
...         out.write(response.read())
هنا قمنا بتعيين وكيل مستخدم لموزيلا فايرفوكس وقمنا بتعيين الموقع الذي نريد منه إختبار وكيل المستخدم الخاص بنا ، بعد ذلك قمنا بتعيين طلب بإستخدام رابطنا والرأس ومررناه إلى urlopen وأخير قمنا بحفظ الناتج وإذا قمت بفتح ملف الذي يحتوي على الناتج ستجد أننا قمنا بتغيير سلسلة وكيل المستخدك بنجاح .
حاول أن تجرب تغيير وكيل المستخدم عدة مرات مع هذا الكود حتى تفهم ألية العمل .

urllib.parse

تعتبر مكتبة urllib.parse هي الواجهة القياسية لتفكيك سلاسل الروابط و إعادة ربطهم مرة أخرى ويمكن أيضا إستخدامها لتحويل الروابط النسبية إلى روابط مطلقة ، دعونا نأخذ مثال عن تحليل الرابط يحتوي على علامة إستفهام
1
2
3
4
5
6
7
8
9
10
>>> from urllib.parse import urlparse
>>> result = urlparse('https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa')
>>> result
ParseResult(scheme='https', netloc='duckduckgo.com', path='/', params='', query='q=python+stubbing&t=canonical&ia=qa', fragment='')
>>> result.netloc
'duckduckgo.com'
>>> result.geturl()
'https://duckduckgo.com/?q=python+stubbing&t=canonical&ia=qa'
>>> result.port
None
قمنا بإستدعاء وظيفة urlparse ومررناها إلى رابط يحتوي على علامة إستفهام والتي نسأل من خلالها على python stubbing وكان الناتج عبارة عن كائن ParseResult والذي يكمن إستخدامه للمزيد من المعلومات عن الرابط (رقم المنفذ،مكان السبكة،المسار إلخ…).

تقديم نموذج ويب 

هذه الوحدة أيضا تحتوي على طريقة urlencode وهي جيدة لتمرير البيانات إلى عناوين الروابط ، والإستخدام الشائع لمكتبة urllib.parse هو تقديم نماذج الويب ، فدعونا نكتشف كيفية عمل محرك بحث ل duckduckgo خاص ببايثون
1
2
3
4
5
6
7
8
9
10
>>> import urllib.request
>>> import urllib.parse
>>> data = urllib.parse.urlencode({'q': 'Python'})
>>> data
'q=Python'
>>> full_url = url + '?' + data
>>> response = urllib.request.urlopen(full_url)
>>> with open('/home/mike/Desktop/results.html', 'wb') as f:
...     f.write(response.read())
مثال واضح وصريح ففي الأساس نريد تقديم إستعلام ل  duckduckgo بإنفسنا بإستخدام بايثون بدلا من المتصفح ولفعل ذلك نحتاج إلى بناء سلسلة إستفهام بإستخدام urlencode ثم نقوم بجمع كل ذلك لنشكل رابط مؤهل تماما ثم نقوم بإستخدام urllib.request لتقديم نموذج الويب بعد ذلك نقوم بالإستيلاء على النتيجة وحفظها .

إلى هنا نكون قد وصلنا إلى مرحلة ينبغي لك أن تكون قادرا على التعامل مع حزمة  urllib ، فقد تعلمنا كيفية تحميل ملف ، تقديم نموذج ويب ، تغيير عميل المستخدم وهذا ا يعني ان المكتبة تقوم بهذه الوظائف فقط بل على العكس هناك العديد من المهام التي يمكن لها أن تقوم بها .

ما هو جانغو ؟

ماهو جانغو ؟


في الأيام الأولى لشبكة الانترنيت كان مطوري المواقع يقومون بكتابة كل صفحة من الموقع على حدى بأيديهم ثم يقومون برفعها الى السيرفر وحتى عملية التحديث (محتوى،تحرير أكواد html،تصميم الخ…) تتم بنفس العملية، بعد ذلك أصبحث تلك المواقع تكبر وتنمو بشكل متسارع و أصبح عدد المستخدمين أكبر وأكبر مما أصبحت عملية انشاء وتحديث المواقع عملية مملة وشاقة ومستهلكة للوقت والجهد معا .
ولكن المشكلة لم تدم طويلا حيث قام مجموعة من المطورين في المركز الوطني لتطبيقات الحوسبة الفائقة أين تم تطوير متصفح موزايك أول متصفح ذو واجهة رسومية بحل المشكلة بالسماح لسيرفرات الويب التعامل مع البرامج الخارجية التي تستطيع توليد صفحات HTML دينامكية وقاموا بتسمية هذا البروتوكول CGI والذي قام بتغيير شبكة الانترنيت الى الأبد.

إنه من الصعب أن نتخيل مالذي سنقوم به من دون بروتوكول CGI فبدلا من معالجة ملفات HTML كأنك تعالج ملف عادي
على القرص الصلب يسمح لك هذا البروتوكول بالتفكير في ملفاتك كانها موارد تم توليدها بشكل ديناميكي ، ويعني تطوير بروتوكول CGI بداية الجيل الاول من المواقع الدينامكية .
مع كل هذا ايجابيات بروتوكل CGI إلا أنه عان من بعض المشاكل بحيث كانت السكريبتات التي تعمل عليه بحاجة الى القيام بالكثير من عمليات تكرار الأكواد وكان من الصعب عليها إعادة استخدام التعليمات البرمجية  وكان ذلك يشكل تحدي كبير بالنسبة للمطورين الاوائل.
قامت لغة PHP بتصحيح العديد من تلك المشاكل — وكأنها جاءت لتقذ العالم من عاصفة رعدية مميتة —
وتعتبر حاليا لغة PHP اللغة الأكثر الشعبية في مجال تطوير المواقع الدينامكية ومن مميزاتها انها سهلة الاستعمال و التعلم .
وطبعا للغة PHP سلبيات أيضا ومن أهم سلبياتها هو كثرة الثغرات الأمنية الموجودة في المواقع وذلك راجع الى عدة أسباب منها سهولة تعلم اللغة و بالتالي ظهور العديد من المخربين وعادة مايجد المطورين أنفسهم مجبرين على تعلم الحماية أيضا.
من أجل ذلك ظهرت العديد من الأطر العملية لتطوير الويب وهو مايسمى بالجيل الثالث ومن بين تلك الأطر : جانغو ، روبي  اون ريلز  و تتزايد شعبيتهم يوم بعد يوم خاصة هذه الأيام ، وأنت تعلم اخي الكريم ان أهمية شبكة الأنترنيت قد تصاعدت في الأونة الأخيرة ومع ظهور هذه الأدوات الجديدة في تطوير الويب يزيد شغف المطورين بالقيام بالكثير من الأعمال وظهور الجديد يوم بعد يوم.
الى هنا جاء جانغو لتلبية تلك الطموحات وهو  عبارة عن إطار عمل مجاني ومفتوح المصدر مكتوب بلغة بايثون  صمم من أجل المساهمة في تطوير صفحات ويب دينامكية وتطبيقات الويب وهو يحتوي على مجموعة من المكونات التي تساعدنا على تطوير المواقع بطريقة سريعة وسهلةوفي وقت قصير للغاية.
ويتبع جانغو  أسلوب MVC وهو أحد نماذج معمارية البرمجيات و أصدر جانغو سنة 2003 وفي سنة 2008 تم إنشاء مؤسسة جانغو التي تتولى تطويره ومن أهم أهدافه هو تسهيل تصميم المواقع المعقدة والتي تعتمد على قواعد البيانات

لماذا نقوم بإستخدام جانغوا؟

لماذا نقوم بإستخدام إطار عمل؟

هناك العدبد من اطارات العمل الخاصة بتطوير المواقع بمختلف لغات البرمجة فلماذا نقوم باستخدام جانغو بدلا من الإطارات الأخرى ؟
هناك عدة أسباب تجعلنا نختار جانغوا ومن بين تلك الأسباب :
  • سهولة التعلم.
  • جودة التطبيقات المنتجة.
  • سرعة التطوير.
  • حماية نسبية للموقع .
  • سهولة صيانة الموقع مع الوقت .
عندما نريد إنشاء موقع الكتروني نحتاج الى مجموعة من المكونات من بينها وسيلة للتعامل مع مصادقة المستخدم (التسجيل،تسجيل الدخول،تسجيل الحروج ) لوحة تحكم بالموقع ، تحميل الملفات والكثير من الوسائل المعروفة في المواقع الدينامكية .
لحسن حظك لاحظ مجموعة من المطورين أن تطوير برامج الويب يواجه بعض المشاكل عند بناء المواقع الالكترونية لذلك قاموا بالتعاون وأطلقوا أطر عمل (جانغو واحد من تلك الاطر) والتي تحتوي على مجموعة كبيرة من المكونات التي يمكننا استخدامها لتوفير الوقت والجهد .
ماذا يحدث عندما يطلب احد موقعك الالكتروني من الخادم الخاص بك؟
عندما يأتي طلب الى سيرفر ويب يقوم بتمريرها الى جانغو حيث يقوم بمحاولة معرفة ماهو المطلوب فعلا من الطلب حيث يقوم أولا بأخذ عنوان صفحة الويب  ويحاول معرفة ما يجب القيام به وتتم هذه الخطوة بواسطة الدالة urlresolver (لا حظ أن عنوان موقع يسمي url أي uniform resource locator وبالتالي اسم الدالة urlresolver والتي تعني محلل الروابط تبدو منطقية ) وهي ليست ذكية بما يكفي فكل ماتقوم به هي اخذ مجموعة من قوائم النماذج وتحاول مطابقتها مع الرابط ، حيث يقوم جانغوا بالتحقق من النماذج من الاعلى الى الاسفل واذا وجد اي تطابق يقوم بتمرير الطلب الى الدالة المطلوبة والتي تسمى View
يقوم ساعي البريد بالمشي خلال الشارع ويتحقق من ارقام البيوت حتى يجد الرقم المناسب عندئذ يقوم بوضع الرسالة عند الرقم المطابق والدالة urlresolver تقوم بنفس العمل .
بالعودة الى الدلة View والتي تقوم بجميع الاعمال المهمة حيث يمكننا إلقاء نظرة على قاعدة المعطيات من أجل البحث عن المعلومات فلربما يريد المستخدم تغيير بعض المعلومات مثل تغيير وصف حالته حيث تقوم الدالة View بالتحقق من اذا كان لهذا المستخدم الصلاحية للقيام بتلك العملية بعد ذلك تقوم بتغيير الوصف وترجع لنا رسالة “تم” ثم تقوم بتوليد الرد ويقوم جانعو بإرسال رسالة الى متصفح المستخدم.
طبعا تغيير الوصف عملية بسيطة ولكن مازال الطريق طويلا امامنا للتعرف على جميع العمليات فكل مانريد معرفته الان هو ألية العمل فقط .
سأكتفي في هذه التدوينة بهذا التعريف المتواضع لجانغوا وسنكتشف الكثير بحول الله في المواضيع القادمة وفي الدرس القادم سنعرف على طريقة تثبيت جانغو للبدأ في العمل .

شرح urls في جانغو

عناوين جانغو

نحن على وشك بناء صفحة ويب الأولى بالنسبة لنا: صفحة رئيسية لبلوق الخاص بك! ولكن أولا، دعونا نتعلم قليلا عن جانغو عناوين المواقع.
في الدرس الثالث تحدثت عن urls ولكن لم اتعمق فيه بشكل واضح لهذا اليكم هذه التدوينة اشرح فيها "urls" 

ما هو عنوان URL؟

وعنوان الموقع هو مجرد عنوان على شبكة الإنترنت. يمكنك ان ترى URL كل مرة تقوم بزيارة موقع على شبكة الانترنت - كان مرئيا في شريط عنوان المتصفح الخاص بك. (نعم! 127.0.0.1:8000 هو عنوان! و https://djangogirls.org هو أيضا URL).
رابط
كل صفحة على شبكة الإنترنت تحتاج URL الخاص بها. بهذه الطريقة يعرف طلبك ما ينبغي أن تظهر للمستخدم الذي يفتح هذا العنوان. في جانغو نستخدم ما يسمى URLconf (التكوين URL). URLconf هو عبارة عن مجموعة من الأنماط التي  سوف نحاول أن تتطابق مع عنوان URL المطلوب للعثور عليه.

كيف  تعمل عناوين urls في جانغو؟

دعونا نفتح mysite/urls.py الملف في محرر التعليمات البرمجية الاختيار ونرى ما يبدو مثل:
مع mysite / urls.py
 
 """
mysite URL Configuration [...]
 """ 
from django.conf.urls import url  
from django.contrib import admin 
urlpatterns = [ url( r'^admin/' , admin.site.urls), ] 

كما ترون لدينا عدة اسطر
في السطر اﻻول هو مجرد تعليق من جانقو يشرح كيفية استخدام الملف
في السطرين الثاني والثالث قمنا بعملية استدعاء ملف conf الموجود داخل مكتبة جانقو ,ومن conf استدعينا كلاس اسمه urls ومنه استدعينا دالة اسمها urls

ناتي الي السطر اﻻهم :
urlpatterns = [ url( r'^admin/' , admin.site.urls), ]
urlpatterns هو عباره لست 
url()   هي عباره عن صف داخل لست 
ويحتوي هذا الصف علي ثلاث متغيرات 
اول متغير هو 
r'^admin/' 
r'^$'
وعلامة ^ تعني بداية الرابط
وعلامة $ تعني نهاية الرابط ويتم كتابة عنوان الصفحة بينهما  
هو اسم الرابط الذي سيظهر عند زيارة الصفحة كما شاهدنا في الدرس الثالث

admin.site.urls
هو اسم الموديول الموجود فيه لوحة التحكم 
اما المتغير الثالث الذي لم نشرحه في الفيديو هو 
name='admin'
هو اسم الرابط او اسم الموديول وهو اختياري يمكن كتابته او يمكن تخطيه

blog.urls

إنشاء ملف فارغ جديد اسمه blog/urls.py . حسنا! إضافة هذه الأسطر الأولين:
بلوق / urls.py
 from django.conf.urls import url from . import views 
نحن هنا بصدد استيراد وظيفة جانغو url وكل من views من blog التطبيق. (لا يوجد لدينا أي بعد، ولكننا لن نصل الى ذلك في دقيقة واحدة!)
بعد ذلك، يمكننا أن نضيف لدينا أول نمط URL:
بلوق / urls.py
 urlpatterns = [ url( r'^$' , views.post_list, name= 'post_list' ), ] 
كما ترون، نحن إسندنا الآن view واسمها هو post_list إلى ^$ URL. 


إذا كنت تريد أن تعرف المزيد عن جانغو URLconfs، والنظر في الوثائق الرسمية: https://docs.djangoproject.com/en/1.9/topics/http/urls/
الأحد، 31 يوليو 2016

تعرف على مكتبة Scapy

مرحبا بالجميع في هذا الدليل الجد المتواضع حول مكتبة Scapy وهو دليل موجه للمبتدئين والذي لا علاقة لهم بهذا المكتبة لا من قريب ولا من بعيد لذلك لا داعي إلى القلق حول صعوية الدليل .
سنحناول جاهدين في الجزء الاول من هذا الدليل تعريف هذه المكتبة بالشكل البسيط ، من يقف وراءها ، تاريخها و .مجالات إستخدامها .
الفئة المستهدفة من هذا الدليل هم مهندسوا الشبكات و أمن المعلومات بالدرجة الأولى ولكن هذا لا يعني أن الفئات الأخرى ستكون مقصية بل على العكس الكل مرحب به
لماذا Scapy 
تعتبر مكتبة Scapy مكتبة تفاعلية قوية في مجالها وهو التعامل مع حزم الشبكات المختلفة حيث بإمكانها إعادة صياغة و فك شفرات الحزم لمجموعة واسعة من البروتوكولات المختلفة بعد ذلك تقوم بإرسالهم إلى الشبكة أو إلتقاطها ، القيام بعملية تطابق بين الطلبيات والردود والكثير من الأمور ، كما يمكن لهذه المكتبة القيام بمعظم عمليات الخاصة يالشبكات المختلفة مثل : المسح ، تتبع مسار الشبكة، فحص الوحدات، الهجوم أو إكتشاف الشبكات ،كما يمكن لها أن تقوم بما يقارب 85% من عمليات برنامج nmap،tcpdump والكثير من عمليات الهجوم المختلفة .
كما يمكن لهذه المكتبة القيام بعمليات محددة لا يمكن لمعظم البرامج القيام بها مثل : إرسال حزم غير صحيحة ، حقن الإيطار 802.11، فك تشفير voip على القنوات المشفرة ب WEP .
يبدوا أن الامر ممتع أليس كذلك ؟ لهذا قررت أن أكتب  دليل بسيط عن هذه المكتبة يكون مناسبا للمبتدئين يكون مرجع لي ولزوار الموقع المهتمين بتطوير برامج بهذه المكتبة الرائعة .
وقبل أن نبدأ أريد أن أعرج على أهم النقاط التي سنتناولها في هذا الدليل :
* تثبيت مكتبة سكابي (بالإضافة إلى ادوات أخرى مساعدة )
* إنشاء حزمة
* إرسال وإستقبال حزمة
* الأوامر اﻷساسية لمكتبة سكابي
* إلتقاط الحزمة المارة بالشبكة وتحليلها
* أمثلة متنوعة
أرجوا ان تكونو مستعدين للبدء في تثبيت مكتبة سكابي وإنشاء بعض الحزم .
تثبيت مكتبة سكابي 
سأتناول كيفية تثبيت سكابي على اوبنتو فقط وللإطلاع على كيفية تثبيتها على الأنظمة الاخرى يرجى زيارة الموقع التالي :
http://www.secdev.org/projects/scapy/doc/installation.html
ملاحظة : لمن يعمل على توزيعة كالي لينكس سيجد هذه المكتبة مثبتة مسبقا .
قد ترغب أيضا في تثبيت برنامج wireshark حتى نقوم بتحليل الحزم المنشأة (هذا الدليل لا يتضمن شرح wireshark)
الشرط الأساسي لتشغيل مكتبة سكابي هو :
* تثبيت نسخة بايثون 2.5
* تحميل وتثبيت مكتبة سكابي
* (إختياري) تثبيت بعض البرامج والأدوات المساعدة لتنفيذ بعض المزايا الجيدة
* تشغيل سكابي بصلاحيات الجذر
تثبيت بايثون 2.5
الوثائق الرسمية Scapy تنصح ببايثون 2.5 لتشغيل سكابي 2.x فأنا اعمل على بايثون 2.7 ولم تحدث معي أي مشاكل وإذا كنت تريد معرفة نسخة البايثون المثبتة على نظامك أكتب الامر التالي :
1
2
pyarab@ubuntu:~$ python -V
Python 2.7.3
وإذا كانت هناك نسخة أقل من 2.5 فأكتب الامر التالي لتثبيت بايثون :
1
pyarab@ubuntu:~$ sudo apt-get install python
تحميل وتثبيت Scapy
بمجرد حصولك على بايثون عليك الحصول علىscapy ولعمل ذلك توجد طريقتين ولكنني سأتكلم عن الطريقة التي إستخدمتها :
1
pyarab@ubuntu:~$ sudo apt-get install python-scapy
تثبيت برامج إضافية من أجل مميزات خاصة (إختياري )
بعد تثبيت مكتبة scapy يمكنك التأكد من نجاح العملية من خلال الأمر التالي :
1
2
3
4
5
6
7
8
pyarab@ubuntu:~$ sudo scapy
INFO: Can't import python gnuplot wrapper . Won't be able to plot.
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
To exit out of Scapy, just type:
Welcome to Scapy (2.2.0)
>>> exit()
يمكنك الملاحظة أنه بمجرد تشغيلscapy قد تظهر بعض رسائل الأخطاء عن عدم وجود بعض المكونات ، مكتبةscapy يمكنها القيام بالعديد من الأمور المميزة منها توفير خرائط والرسوم البيانية ثلاثية الأبعاد ولكننا بحاجة إلى حزم إضافية لتوفير جميع تلك المميزات :
1
2
pyarab@ubuntu :~$ sudo apt-get install tcpdump graphviz imagemagick python-gnuplot python-
crypto python-pyx
تشغيل مكتبةscapy مع صلاحيات الجذر
هذه خطوة سهلة وربما قد تكون قد فعلتها :
1
~$ sudo scapy
وستكون النتيجة :
1
2
3
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
>>>
إلى هنا نكود قد إنتهينا من عملية تثبيت وتهيئة مكتبة scapy وسننتقل الان إلى ما هو أهم من هذه الخطوة وأي مشاكل تم مصادفتها في هذه الخطوة أرجوا إبلاغنا .
إنشاء حزمة
حان وقت الجد فدعونا نتلاعب قليلا ونقوم بإنشاء أول حزمة ، وربما تكون تتسأل الأن ألا يجب ان نتعرف علىscapy اولا ، ربما تكون على حق ولكن انا أرى أن التعلم يأتي بالعمل والتجريب وسأحاول ان أشرح كل مثال على حدى وكل ما صادفنا شيء جديد سنقوم بالتكلم عنه .
إذن الحزمة الأولى ستكون عبارة عن حزمة بروتوكول ICMP مع الرسالة المشهورة “مرحبا بالعالم ” .
ملاحظة : عنوان الانترنيت IP المستخدم في هذا الدرس ينتمي إلى الشبكة المحلية لذلك عليك أن تقوم بالتعديل مايناسب شبكك المحلية حتى تضمن وصول الحزمة إلى الجهاز المناسب.
1
2
3
4
5
Welcome to Scapy (2.2.0)
>>> send(IP(dst="192.168.1.100")/ICMP()/"HelloWorld")
.
Sent 1 packets.
>>>
دعونا الأن نقوم بشرح الامر السابق
  1. send هنا نقوم بإخبار Scapy أننا بصدد إرسال حزمة واحدة
  2. ip نوع الحزمة التي نريد وهذه الحالة نريد حزمة عنوان الأنترنيت
  3. (dst=”192.168.1.100”) عنوان المستقبل وفي حالتنا هو الراوتر
  4. /ICMP() تريد إنشاء حزمة icmp مع القيم الأفتراضية الخاصة ب Scapy
ويمكننا رؤية الحزمة المرسلة و الرد الخاص يها بواسطة برنامج  tcpdump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pyarab@ubuntu:~$ sudo tcpdump -i wlan0 -nnvvXSs 0 -c2 icmp
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:02:21.822237 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto ICMP (1), length 50)
192.168.1.100 > 192.168.1.1: ICMP echo request, id 0, seq 0, length 30
0x0000: 4500 0032 0001 0000 4001 f714 c0a8 0164 E..2....@......d
0x0010: c0a8 0101 0800 5834 0000 0000 5468 6973 ......X4....This
0x0020: 2069 7320 616e 2049 434d 5020 7061 636b .is.an.ICMP.pack
0x0030: 6574 et
18:02:21.823074 IP (tos 0x0, ttl 254, id 49099, offset 0, flags [none], proto ICMP (1), length 50)
192.168.1.1 > 192.168.1.100: ICMP echo reply, id 0, seq 0, length 30
0x0000: 4500 0032 bfcb 0000 fe01 7949 c0a8 0101 E..2......yI....
0x0010: c0a8 0164 0000 6034 0000 0000 5468 6973 ...d..`4....This
0x0020: 2069 7320 616e 2049 434d 5020 7061 636b .is.an.ICMP.pack
0x0030: 6574 et
2 packets captured
2 packets received by filter
0 packets dropped by kernel
من خلال برنامج tcpdump يمكننا أن نرى ان الحزمة أرسلت من العنوان 192.168.1.100 لتتجه إلى العنوان 192.168.1.1 وهو طلب ICMP يحتوي على البيانات التالية ‘Hello world’
إرسال وإستقبال الحزم
سنقوم الأن بإرسال وإستقبال بعض الحزم من خلال Scapy .
هناك ثلاثة دالات أساسية للقيام بهذه المهمة :
  • sr() دالة لإرسال الحزم وإستقبال الردود المستقبلة من طرف المرسل إلية وحتى الردود الغير المستقبلة وهي تعمل على الطبقة الثالثة
  • sr1() تقوم هذه الدالة بعرض حزمة واحدة و التي تم الرد عليها ولا تقوم بعرض الرسالات الغير المجابة وهي تعمل على الطبقة الثالثة.
ملاحظة src() وsrc1() يجب أن يتم إستخدامهم في الطبقة الثالثة من طبقات osi (IP, ARP, etc.)
  • srp() تقوم هذه الدالة بنفس العمل ولكن على الطبقة الثانية من طبقات osi
مثال عن الدالة SR1
ستقوم بإرسال حزمة TCP إلى المنفذ 80
1
2
3
4
5
>>> h=sr1(IP(dst="192.168.1.100")/TCP(dport=80))
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
  1. 192.168.1.100 عنوان المستقبل
  2. حزمة TCP خاصة بالمنفذ 80
  3. حصلنا على حزمتين في الرد
سنقوم الأن بإكتشاف على ما تحتوي حزمة الرد
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> h.show()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 44
id= 5055
flags=
frag= 0L
ttl= 254
proto= tcp
chksum= 0x2557
src= 192.168.1.1
dst= 192.168.1.100
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 4081483776L
ack= 1
dataofs= 6L
reserved= 0L
flags= SA
window= 2800
chksum= 0x9600
urgptr= 0
options= [('MSS', 1400)]
###[ Padding ]###
load= 'A\x10'
<pre>
تقوم دالة Show على المتغير H بعرض هيكل الحزمة التي تلقيناها من المستقبل للحزمة التي أرسلناها وكما شاهدتم إنها حزمة IP وعنوان المصدر والمستقبل هو 192.168.1.100و 192.168.1.1 على التوالي .
قام المستقبل بالرد بإستخدام المنفذ 80 أما المصدر قام بإستقبال الرد عبر المنفذ 20 ftp_data .
كما يمكننا الملاحظة أن الأعلام SYN(S) و ACK(A) تم تعيينهم أيضا في الرد  وتعني (flags= SA) أن المنفذ 80 مفتوح.
مثال عن الدالة SR
سنقوم بإرسال حزمة TCP إلى المنفذ 80
1
2
3
4
5
>>>> ans,unans = sr(IP(dst="192.168.1.1")/TCP(dport=80))
Begin emission:
....Finished to send 1 packets.
*
Received 5 packets, got 1 answers, remaining 0 packets
تم إستقبال 5 حزم ورد واحد .
وكا سبق لنا و أن ذكرنا فإن الدالة SR تقوم بإرجاع كل من الحزم التي الرد عليها و التي لم يرد عليها يمكننا تخزينهم في متغيرين ans و unans.
حسنا دعونا نطلع على مايحتويه الرد من معلومات :
1
2
3
4
>>> ans
<Results: TCP:1 UDP:0 ICMP:0 Other:0>
>>> ans.summary()
IP / TCP 192.168.1.102:ftp_data > 192.168.1.1:http S ==> IP / TCP 192.168.1.1:http > 192.168.1.102:ftp_data SA / Padding
عند كتابة إسم المتغيير الأول ans يقوم بإعطائنا نتائج رد الحزمة المستقبل والتي تحتوي على معلومات من بينها أن الرد يحتوي على حزمة TCP واحدة تم إستقبالها ولمزيد من التفاصيل نقوم بإستخدام summary()
ملاحظة : الدالة show لا تعمل مع الدالة SR
 تعيين Timeout للحزم
timeout يستخدم لتحديد عدد الثواني لإنتضار الرد، قم بنخيل سينارويو بحيث نقوم بإرسال حزمة TCP على المنفذ80 إلى جهاز غير متصل بالشبكة وعدم تعيينا لTimeout ، في هذه الحالة سنقوم بالإنتظار ولتجنب هذه الحالة سنقوم بتعيين timeout .
قم بإرسال حزمة TCP على المنفذ 80 إلى جهاز لا يمكن الوصول إليه وبدون نحديد قيمة Timeout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> ans,unans = sr(IP(dst="10.0.0.99")/TCP(dport=80))
Begin emission:
WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
...........................................................^C
Received 6 packets, got 0 answers, remaining 1 packets
>>> ans,unans = sr(IP(dst="10.0.0.99")/TCP(dport=80),timeout=10)
Begin emission:
.....WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
...
Received 8 packets, got 0 answers, remaining 1 packets
<
إستخدام scapy داخل برنامج بايثون
يمكننا أيضا إستعمال مكتبة scapy داخل برامج بايثون وليس فقط على الطرفية وذلك عبر إستدعاء المكتبة داخل البرنامج
1
2
3
4
5
6
#! /usr/bin/python
from scapy.all import *
ans,unans = sr(IP(dst="10.0.0.1")/TCP(dport=80))
ans.summary()
إلى هنا أكون قد إنتهيت من هذا الدليل والذي سيتبعه دروس أخرى حول هذه المكتبة أرجوا لكم الإستفادة .
عربي باي