الأربعاء، 19 سبتمبر 2012

برمجة sniffer بواسطة البايثون (الجزء الثاني )

بسم الله الرحمن الرحيم

في الجزء الأول  شرحت كيفية تأسيس القابس الخام "Raw Socket" , و الأن سنبدأ في التعامل مع البيانات المستقبلة من القابس .

في حالة القابس الخام يترك للمبرمج التعامل مع برتوكولات الشبكة , و التعامل مع بنية الحزم لكل برتوكول , وسنبدأ بالبرتوكول IP .


قائمة مكونات حزمة برتوكول IP (الإصدارة الرابعة ) بالترتيب الموجود على الصورة :
  • version              : إصدارة برتوكول IP بطول 4 بت (4 bits)
  • Headers len      : طول بيانات برتوكول IP بوحدة word ( تساوي 32 بت ) بطول 4 بت .
  • Type of service : يستخدم هذا الحقل لإعطاء التعليمات للموجهات على الشبكة (Router) .
  • Total length      : طول حزمة IP يشمل البيانات المرسلة بوحدة البايت (bytes) بطول 16 بت .
  • identification    : يستخدم هذا الحقل في حالة تقسيم البيانات كقيمة دليلة على أن الحزم تنمي لنفس مجموعة البيانات المقسمة بطول 16 بت 
  • Bit flags            : تستخدم هذه للدلالة على تقسيم البيانات من عدمه كالتالي :


    البت الأول في هذا الحقل يحمل القيمة صفر دائما , البت الثاني يحمل القيمة صفر في حالة تقسيم البيانات على أكثر من حزمة IP و القيمة واحد في حالة عدم التقسيم , البت الأخير يحمل القيمة صفر في حالة كانت الحزمة المرسلة الأخيرة في سلسلة الحزم المقسمة و القيمة الصفر في حالة وجود المزيد من الحزم .

    • fragment offset : تحمل هذه القيمة تسلسل الحزمة ( في حالة تقسيم البيانات) في سلسلة البيانات بطول 16 بت .
    • Time to live       : يحمل هذا الحقل قيمة يتم إنقاصها بمعدل واحد خلال مرورها من موجه (Router) و في حالة وصول القيمة لصفر يتم إنهاء حياة الحزمة و إلغاءها و يبلغ طول هذا الحقل 8 Bits .
    • protocol            : هذا الحقل يحدد البرتوكول الذي يعمل في الطبقة العليا كمثال (TCP -UDP )
    • header checksum : يستخدم هذا المجموع للتأكد من عدم حدوث تغير لقيم البرتوكول أثناء النقل , ويتم أستخدام خورازمية CRC ( في حالة برتوكول IP يكون قيمة التحقق هو مجموع جميع قيم حقول برتوكول IP ).
    • Source IP : عنوان الأي بي الخاص بالحاسوب المصدر بطول 32 بت .
    • Destination IP: عنوان الأي بي الخاص بالوجهة الحزمة بطول 32 بت .
    • Options : هذه الحقول أختيارية ويجب أن يتم الأتفاق عليها بين الوجهة و المصدر ولن أتطرق لها في هذا الموضوع . 
    • Data : البيانات المرسلة .

    الأن بعد أن فهمنا تركيب حزمة برتوكول IP سنعدل مثالنا في الجزء الأول لكي يطبع عنوان الأي بي الخاص بوجهة الحزمة .

    عندما ألقنا نظرة على تركيب الحزمة نجد بأن حقل عنوان الوجهة يبدأ على بعد 12 بايت و يتكون من أربع بتات , لذا سنتعامل مع الحزم المستقبلة كمصفوفة حروف ASCII :

    import socket

    sos=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_TCP)

    while 1:

            data=sos.recv(1245)

            print "%d.%d.%d.%d" %(ord(data[12]),ord(data[13]),ord(data[14]),ord(data[15]))


    قمنا في هذا المثال بأستخدام الوظيفة البرمجية ord التي تحول حروف ASCII إلى أعداد صحيحة :

    ord(data[15]

    يبدو هذا المثال مفيداُ فقط كمثال توضيحي و لكن لتعامل بشكل أسهل و أكثر أحترافية مع حزم البيانات في الشبكة من الأفضل أستخدام المكتبة البرمجية struct .

    توفر هذه المكتبة البرمجية صيغ تمكن من تحويل بين صيغ البيانات بكل سهولة و سوف أتطرق لها في الجزء الثالث ( أن شاء الله ) .






    ليست هناك تعليقات:

    إرسال تعليق