zaraki_kenpache

اشترك معنا لبرمجة جدار ناري firewall باستخدام c#

20 ردود في هذا الموضوع

السلام وعليكم ورحمة الله وبركاته
سوف احاول معكم باذن الله ان نبرمج جدار ناري واسبقكم بالعلم بانيني برمجته والحمدلله نجحت ولان البرمجة في الطبقة الفيزيائية  والتعامل مع الحزم والبروتوكولات صعبة ومعقدة وتستلزم الوقت لذا فكرت ان تكون محاضرة على شكل نقاش وقد يلزم اكثر من شهر
شروط المشاركة
-التواجد يوميا في اي وقت تحب لاني ساشارك مرة في كل يوم مما يتيح للمشترك الاشتراك في اي وقت من اليوم و عدد المشاركين من 5 الى 10 وسيتم الاختيار على الخبرة والتواجد فيرجى كتابة  الخبرة وعدد الايام التي يمكن التواجد في المنتدى(باختصار)
-ان تكون مستعمل للغة c# 2008 لاني سوف استعملها في الشرح ويجب عدم كتابة كود باي للغة اخرى
-عدم استخدام اللون الاحمر لاني سوف استخدمه
-يرجى من القراء ان لايدرجوا اي تعليقات او اسئلة  فقط المشاركين يمكنهم المشاركة مرة يوميا لانها تلزمنا الكثير من الوقت ولن تنفعنا التعمق في كل تفصيل وعلى المشارك كتابة تعليق واحد فقط واذا اراد الاكثر فليعدل التعليق وليس تعليق جديد

-تطبيق كل ما نتوصل اليه عمليا في حاسبوبك

-وان كانت عندك اي مشكلة او اسئلة جانبية فيرجى السؤال على الخاص لا ختصار الموضوع

ولان نفتح ابواب الاشتراك

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ

 

﴿ قَالُوا يَا ذَا الْقَرْنَيْنِ إِنَّ يَأْجُوجَ وَمَأْجُوجَ

مُفْسِدُونَ فِي الْأَرْضِ فَهَلْ نَجْعَلُ لَكَ خَرْجًا

عَلَىٰ أَن تَجْعَلَ بَيْنَنَا وَبَيْنَهُمْ سَدًّا

 

سورة الكهف – الآية 94

 

الدرس الاول

ما هو الجدار الناري وما هو انواعه؟

الجدار الناري هو اما جهاز او برنامج يقوم ب حماية شبكة محلية او حاسب شخصي ويمنع البرامج من استخدام الحزم بحرية

ويمكن تصنيف انواعه الى الى صنفين خير صورة من الف كلمة

post-257301-0-66093500-1378860252_thumb.

 

personal firewall

هو برنامج يعمل في حاسوب الشخصي وهو ما سنقوم ببرمجته ويقوم على اساس packet filter  وهو ترشيح او سيطرة المرور على الحزم وسنقوم بشرح تفصيلي عن الحزم فيما بعد ومثال على هذا النوع windows firewall

network firewall

هو عبارة عن جهاز يتم ارفاقه بلشبكة ويكون تعامله كما صنعته الشركة المصنعة ولها انواع فمنها تعمل على مستوى الحزم في اسفل الطبقات ومنها من تتعامل مع البرامج في اعلى الطبقات وسنقوم بشرح الطبقات في دروس القادمة وهذا النوع ليس من ضمن شرحنا

كيف سيعمل برنامجنا ؟

سيعمل برنامجنا على اساس منع بعض ال IP من المرور من والى الجهاز وسنشرح الIP  في دروس القادمة

تم تعديل بواسطه zaraki_kenpache
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس الثاني

شرح بسيط عن بعض مفاهيم الشبكات

Packets

(الحزم) وهي البيانات التي يتم نقلها عن اتصال اي حاسوبين

 

الIP

هو عبارة عن رقم تسلسلي فريد لكل جهاز يتصل بشبكة محلية او عالمية لكي نستطيع تميز الاجهزة داخل الشبكة وهو نوعان IPv4 و IPv6 وسيتعامل برنامجنا مع فيرجن 4 الذي يتكون من اربعة ارقام وكل رقم يبدا من الصفر الى 255 ولهذا ايضا اربع تصنيفات لا يهم ذكرها و سنقوم بدراسة مكثفة عنه لانه جزء من الحزم

 

Port

(المنفذ)عندما يتصل اي جهازين يحتاجان الى معرفة الIP و ايضا يجب ان يتفقا على منفذ مخصص لهما مثلا كل المتصفحات متفقة على منفذ 80 او 8080 الخاص ب بروتوكول http

 

Protocols

(الاتفاقيات) مثلا اذا قمنا باتصال حاسوبين احدهم ويندوز والاخر ماكنتوش كيف سيفهم احدهما الاخر وقد صمم كل نضام من قبل مبرمجين مختلفين وشركة مختلفة

فهنا ظهر مفهوم الاتفاقيات حيث يتفقون على طريقة لكي يتواصلو .ومن اشهر الاتفاقيات IP حيث يكون الاساس للانترنت واختصاره (Internet Protocol) وايضا بروتوكول اخر وهو TCP/IP حيث سيكون الاساس لشرح الطبقات

 

*99% من اختصار حرف ال P  هو Protocol

 

Layers

(الطبقات) سوف نشرح الطبقات في بروتوكول TCP/IP التي تقوم المنظمة الدولية للمعايير (ISO) واختصارها The International Standards Organization التي تقوم بتطويرها وسندرس طبقات iso وناخذ TCP/IP كمثال وكل من له معرفة بسيطة عن الشبكات يعلم مقدما كل هذه المعلومات ولكن اذكرها حتى يشارك اي مبرمج في هذا العمل

 

 

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس الثالث Layers الطبقات

عندما تمر الحزمة في كل حاسب يتم تغييرواضافات عليها في طبقات مخصصة لذلك التغيير وهناك سبع طبقات ويمكن دمج ثلاث الطبقات العليا معا فيمكن القول بان هناك خمس طبقات

post-257301-0-16700100-1378863504_thumb.

كما في الصورة والتي هي عبارة عن طبقات TCP/IP

application layer وهنا مثال على هذه الطبقة HTTP وافهمها انت على انها المتصفحات ك فايرفوكس وكروم واكسبلورر طبعا كلها تطبيقات تعمل علىHTTP في هذه الطبقة تصنع الحزمة وترسلها من هنا وايضا تستلمها

presentation and session layerهما ايضا شبيها ب application layer وادمجهما معا في الفهم

Transport layer ويعني النقل وهنا يعمل الشهيران في النقل TCP و UDP والفرق بينهما الاول يسلمك تقرير التسليم مثل الرسائل الجوال ولا تضيع اي حزمة والثاني لا يخبرك باي تقرير ويستعمل في البيانات الضخمة لسرعى الارسال والاستلام وفي هذه الطبقة يضاف بوتوكول النقل

Network Layer وهنا يعمل محبوبنا ال IP حيث يتم اضافته الى الحزمة

data link layer و physical layer  في هذه الطبقات المنخفضة يتم تحويل الحزمة الى 1 و0 لغة الحديد التي يفهمها ويرسلها الى الحاسوب الثاني وتكون العملية معاكسة في حاسوب الثاني حيث تتكون الحزمة من 0 و1 الى حزمة مفهومة وترتفع مع وجود الاضافات وربما تنتهي في طبقة العليا (المتصفح)

 

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس الرابع IP Datagaram

سنبدا الشرح الحقيقي

الحزمة في طبقة network والتي يعمل فيها محبوبنا IP حيث قلنا يتم اضافته في هذه الطبقة وتكون الحزمة هنا مكونة من البيانات+IP

وفي برنامجنا لا علاقة لنا ب بيانات الحزمة ولا نغيير فيها شيئا ولكن في قسم IP علينا معرفة مكوناته بلكامل والاستفادة منها لكي نسمح او نمنع من مرورها والان انظر جيدا الى هذه الصورة

post-257301-0-98309600-1378866444_thumb.

والان يجب ان تعرف بان IP ليس مجرد اربع خانات من الارقام كما قلنا سابقا لان في طبقة network يتم اضافة header الى ال data كما في الصورة وتلك الاربع خانات ليس الا جزء بسيط من هذا البروتوكولوعلينا الان شرح المكونات

Version (VER) وهو اربع بتات اما يساوي 0100 اي 4 نفهم بان الIP من نوع IPv4 واما يساوي 0110 اي 6 وهنا نوعه IPv6

Header length (HLEN) طول البيانات التي تم اضافتها وهي ايضا اربعة بت ويتم فيها تحديد طول ال header زذلك لضربه ب 4 واصغر قيمة هي 0000*4=0  واعلى قيمة تساوي 1111*4=60

وللذي لا يعرف ال binary اذكر له كل القيم ل 4 بت

0000 =  0  =   0

0001=   1  =   1

0010=   2  =   2

0011=  3  =    3

0100=  4  =    4

0101=  5  =    5

0110=  6   =   6

0111=  7   =   7

1000=  8   =   8

1001=   9   =  9

1010=   10  = A

1011=  11  =  B

1100=  12  =  C

1101=  13  =  D

1110=  14  =  E

1111=  15  =  F

 

 Total length طول ال IP datagram+header

 

 Identification:تحديد اوتعرفة الحزمة عند تجزئتها اثناء عبور من مختلف الشبكات

Flags يحدد ما إذا كان يمكن أو لا يمكن تجزئتة الحزمة

Fragmentation offsetهو المؤشر الذي يدل على كمية التجزئة البيانات في الحزمة الأصلية (إذا كانت مجزأة).

 

Time To Live (TTL) :(العمر)يحدد عدد المرات التي نريد منها ان تسافر الحزمة عبر الويترات ويتم النقص من العدد حتى يصبح مساويا ب صفر فتمسح الحزمة لانه لا يوجد مستقبل(حاسوب المستقبل للحزمة)ربما خطا في IP وهذا يمنع من الحزمة من السفر عبر الشبكات الى الابد

 

Protocol يتم تحديد البروتوكول المستعمل الذي عمل في الطبقة الاعلى (Transpro Layer) هل هو TCP او UDP .....

 Header Checksum:وهي عملية لتاكد من سلامة الحزمة من التجزئة وعوامل اخرى التي تحول كمودمات واحهزة اخرى مثلا يسجل بان مجموع كل البتات التي تساوي 1 يساوي عدد زوجي فاذا تححق مرة بان العدد فردي فيعلم بان الحزمة قد اتلفت ولا تقل لي ماذا لو تغير 2 بت فيكون العدد زوجي ايضا انا قلت مثلا ولا اعلم طريقة كيفية المعرفة بلتفصيل

Source IP address:قيمة الIP المرسل مثلا  192.168.1.12

Destination IP address:قيمة الIP المستلم (المرسل اليه) مثلا 192.168.1.13

Options (الخيارات) يعطي المزيد من الوظائف مثلا السيطرة على التوجيه، وتوقيت، وإدارة، والمحاذاة واعمال مستقبلية حيث هناك فراغ لا يستخدم لاحتياجات مستقبلية

 

 

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس الخامس

ما اللذي سنفعله وكيف سنفعله؟

سوف نقوم بحجب موقع معين من الحاسب وذلك بمعرفة ال ip الخاص بلموقع وندخل هذا ال IP الى جدول الحجب ونقرا جميع ال IP لكل حزمة واذا كان مساويا بهذا الIP يجب منع الحزمة من المرور وستقوم بمنع ال IP في طبقة network كما في هذه الصورة

post-257301-0-20672700-1378940989_thumb.

 

كيف سنفعل هذا ؟

افتح قرص c وبعدها windows وبعدها System 32 وشاهد ملف ndishc

C:\Windows\System32\ndishc

هذا الملف هو ما يتحكم بكل ال adapter (كارت الانترنت)

افتح الcontrol panel وبعدها Network and Internet وبعدها Network and Sharing Center وبعدها change adapter setting لمشهادة كافة الكروت التي تعمل في حاسوبك

Control Panel\Network and Internet\Network and Sharing Center

ولكل Adapter في الحاسوب له index خاص به ويبدا من 0 الى عدد الكروت في الحاسب

اولا علينا معرفة index الخاص ب الكارت المستخدم في حاسوبك

ولكن عندنا مشكلة وهي بان ملف ndishc اللذي يتحكم بلكروت مشفر ولا يمكن التعامل معه برمجيا وذلك لاغراض امنية وايضا اقوى اللغات البرمجيه لايمكن ان تتعامل مع هذا الملف فقط هناك بعض الاوامر الموجودة في اللغات مثل سي شارب وبهذا الاوامر يمكن فقط الاستماع او النظر الى الحزم ولا يمكن التلاعب بها ولا حتى منعها من المرور

مالحل؟

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

ما هو winpkflt؟ في الدرس القادم إن شاء الله

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس السادس

winpkflt / هي اداة برمجها مبرمجون محترفون لتتعامل مع كروت الانترنت وبهذه الاداة يمكن قراة الحزم والسيطرة على مرورها

اولا قم بتزيل winpkflt من ن هنا وكلمةالسر هي arabteam  لفك الضغط firewallwinpkflt.rar

او من ميديا فيير http://www.mediafire.com/download/d22er0zcejivkwc/firewallwinpkflt.rar

او من موقع الشركة
http://winpkfilter.software.informer.com/3.0/

او من softonic http://winpkfilter.en.softonic.com/

 

ومن ثم قم بتثبيت البرنامج

 

وبعدها افتح الامداد C:\Program Files\WinpkFilter

وهنا لدينا كل ما يلزم

افتح فولدر semples نرى اللغات اللتي يمكن البرمجة من خلالها ونرى للغتنا csharp بين اللغات وفيها امثلة ثلاثة وهنا نجد 90 % من برنامجنا والان ناتي لنجرب البرنامج بدون اي للغة

ارجع الى C:\Program Files\WinpkFilter وافتح فولدر bin (واختر نظامك 32 او 64)وشغل listadapters  لدينا مشكلة البرنامج يعمل ويختفي فورا

الحل افتح C:\Users\Scs\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories وشغل Command Prompt الشاشة السوداء

ويمكن الضط على مفتاحى window+r  وستطهر شاشة run واكتب cmd واضغط enter

وبعد فتح الشاشة السوداء قم بفتح البرنامج عن طريق هذه الشاشة ب كتابة الامر التالي   "C:\Program Files\WinpkFilter\bin\i386\listadapters.exe"  وا ضغط انتر 

او قم بسحب برنامج listadapters بلماوس و ضعه على شاشة السوداء واضغط enter و ستضهر لك هذه الكتابات وان لم تظهر لديك خطا في تثبيت winpkflt

post-257301-0-90703000-1379026216_thumb.

 

ما هذه؟ انها كروت الانترنت في حاسوبك مع الخصائص

والان نفتح برنامج الاخر packetsniffer ولا تنفع الطريقتين لفتح البرنامج لان البرنامج يحتاج الى parameters (ارقام اخرى ) لكي يعمل

افتح الشاشة السوداء

cd يعني افتح الفولدر

cd.. يعني الرجوع الى فولدر السابق واكتب هذه الاوامر الى ان تصل الى الفولدر اللذي فيه البرنامج

او اكتب الامر التالي

cd C:\Program Files\WinpkFilter\bin\i386

وبععدها انتر لتصل الى القولدر الذي يتضمن البرامج الخاصة بلنظام 32

 و 64

C:\Program Files\WinpkFilter\bin\amd64

________________________

بعد ما دخلت الفولدر اكتب اس البرنامج مع هذه الارقام

packetsniffer.exe 1 100

1=index الخاص ب كارت الانترنت لا اتوقع لديك اكثر من 5 كروت جرب حتى تجدد او تعرف اسم الكارت الشغال من listadaptersبرنامج السابق ويكون الindex يساوي ناقص واحد فان كان الكارت الثالث يعمل في جهازك سيكون الindex مساويا ب 2

100=عدد الحزم التي سيقوم البرنامج بشمها sniffer

واضغت انتر واعمل واعمل انعاش refresh لصفحة في المتصفح  ان كنت الان تشاهد  فقط النقاط قمت باختيار كارت الخاطئ اغلق الشاشة وابدا من جديد

نعم انه الان يرى جميع الحزم التي تمر من خلال الكارت

__________________________________

برنامج الاخر wwwcensor

اافتح الشاشة السوداء وافتح الفولدر اللذي فيه هذا البرنامج كالسابق

واكتب wwwcensor.exe 1 facebook

1 indexe of adapter

facebook اي كلمة

وافتح المتصفح وافتح الفيس بوك طبعا لن تجد الفيسبوك جرب اي كلمة موجودة في لينك اي موقع

________________________________________

وكل هذه البرامج موجودة ومع الكود قم بتجربنها على c# واقرا الكود ما استطعت فهمه

الى درس القادم

تم تعديل بواسطه zaraki_kenpache
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس السابع

سوف الان نبرمج lstadapters مع فورم حيث عند تحميل البرنامج يقوم بقراة جميع الكروت ويضعها في combobox

قم بنسخ المكتبات ndisapi.dll و ndisapi.lib من C:\Program Files (x86)\WinpkFilter\kernel\bin\dll

فولدر amd64 لنظام 64

فولدر i386 لنظام 32

وانسخها في C:\Windows\System32 لكي يعمل البرنامج في اي مكان

والان افتح بروجيكت جديد في C# وضع combo box في الفورم

وبعدها انتقل الى solution explorer  واضغط على اسم البرنامج ب كليك الايمن واختر Add ومن Existing items

وفي مربع الاختيار اذهب الى هذا الامتداد

C:\Program Files (x86)\WinpkFilter\samples\CSharp\listadapters

واختر ndisapi.cs و win32api.cs واضغط موافق

وارجع الى الفورم واضغط دبل كليك في مكان فارغ في الفورم لكي تصل الى دالة load مع الحدث

انسخ هذا الكود وضعه في Form1_Load

private void Form1_Load(object sender, EventArgs e)        {            try            {                OSVERSIONINFO verInfo = OSVERSIONINFO.GetVersion();                uint nMTUDec = Ndisapi.GetMTUDecrement();                uint dwAdapterStartupMode = Ndisapi.GetAdaptersStartupMode();                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");                TCP_AdapterList AdList = new TCP_AdapterList();                GCHandle.Alloc(AdList);                if ((Ndisapi.IsDriverLoaded(hNdisapi)))                {                    bool result = Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref AdList);                    for (int i = 0; i < AdList.m_nAdapterCount; i++)                    {                        string sq = Encoding.ASCII.GetString(AdList.m_szAdapterNameList, (int)(i * 256), 256);                        string szFriendlyName = Ndisapi.ConvertAdapterName(AdList.m_szAdapterNameList, i * 256, (uint)verInfo.dwPlatformId, (uint)verInfo.dwMajorVersion);                        Console.WriteLine("{0}) {1}", i, szFriendlyName);                        comboBox1.Items.Add(szFriendlyName);                    }                }                Ndisapi.CloseFilterDriver(hNdisapi);            }            catch (Exception ex)            {                MessageBox.Show(ex.ToString());            }        }

من اين هذا الكود ؟  لقد قمت بنسخه من C:\Program Files (x86)\WinpkFilter\samples\CSharp\listadapters\Program.cs وقمت ببعض التعديلات

ما هي التعديلات؟ البرنامج الاصلي يقوم بطبع ال adapter في الشاشة السوداء فبدلا من الطباعة قمت باضافة ما يطبعه البرنامج الى الكومبوبوكس

شرح الكود؟ بعد التنفيذ

 

والان نفذ الكود لديك اخطاء

اول خطا  Unsafe code may only appear if compiling with /unsafe  
unsafe بمعنى غير امن , يا كومبايلر طبعا كودي غير امن لانه بيستعمل مكاتب غريبة

كيف نعالج الخطا؟  اذهب ال solution explorer واضغت على اسم البرنامج ومن ثم Properties فتظهر لك خصائص البرنامج في تاب Build ضع علامة صح امام خيار allow unsafe code

 

نفذ ثانية ايضا خطا

The type or namespace name 'OSVERSIONINFO' could not be found (are you missing a using directive or an assembly reference?)    \
اللاداة المستخدمة غير موجودة في مكاتبنا اذا عليك كتابة هذا الكود في البداية

using Win32APISPace;

نفذ ثانية ايضا خطا ثالث

The name 'Ndisapi' does not exist in the current context  

الاداة Ndisap غير موجودة نفس الحل قم باضافة هذا الكود في البداية

using NdisapiSpace;

نفذ ثانية الخطا الرابع

The name 'GCHandle' does not exist in the current context
كما في السابق اضف هذا الكود الى الة البداية

using System.Runtime.InteropServices;

والان مبروك لديك كل الadapter في الكمبوبوكس

 

شرح الكود

لماذا قمنا اضافة الثلاث اسطر في بداية البرنامج؟

الجواب/ من يتذكر ndishc.dll من الدرس الخامس الذي هو موجود في C:\Windows\System32

علينا استعمال Ndisap بدلا منها لانها مشفرة لذا علينا اضافة هذه الاكواد لكي نستطيع استعمال الادوات اللازمة

try و catch ادوات برمجية لسيطرى علة الاكود وفي الغالب لديكم فكرة عن هذه الاداة

OSVERSIONINFO ؟ قم بلضغت عليها بكليك الايمن واختر Go To Definition  ستجد ان لها 6 متغيرات و دالة واحدة اسمها  GetVersion() التي ترجع قيمة من نوعOSVERSIONINFO

وهذه الدالة موجودة اصلا في اللغة نستعملها للوصول الى بعض الخصائص لحاسوبك

 

Ndisapi.GetMTUDecrement(); قم بلضغت عليها بكايك الايمن واختر Go To Definition  ستجد ان لها 34 متغيرات من نوع public const uint القيم الثابته التي نحتاجها مثلا اول واحدة ADAPTER_NAME_SIZE التي تخبرنا بان اسم الadapter حجمه يساوي256 بت

ولكل المتغيرات تعليق بلون الاخضر يشرح لك لماذا هو موجود عليك قرأتها جميعا

وللمعلومات كل هذه المتغييرات والدوال موجودة في ملف ndisapi.cs التي اظفناها في project solution

 

IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");

intPtr نوع من البيانات الموجودة في اللغة

hNdisapi اسم اخترناه يمكنك تغييره

Ndisapi المكتبة السابقة

OpenFilterDriver دالة في مكتبة السابقة تفتحح لك الدرايف اللذي يتعامل مع الادابتر(كارت الانترنت)

NDISRD الدرايف اللذي سنفتحه

 

TCP_AdapterList AdList = new TCP_AdapterList();

TCP_AdapterList AdList دالة موجودة مكتبة ndisapi.cs وفيها 6 متغييرات ونحتاجها لانها معلومات   بروتوكول TCP/IP   هل تتذكره

قم بقراة 6 متغييرات مثلا الاول m_nAdapterCount عدد ال adapter  التي تتعامل ب tcp/ip

AdList اسم اخترناه

 

GCHandle.Alloc(AdList)؟

اداة للوصول الى اماكن في الميموري التي لا يمكن ادارتها لمزيد من المعلومات اضغط هنا

 

if ((Ndisapi.IsDriverLoaded(hNdisapi)))

IsDriverLoaded قم بلضغت عليها بكايك الايمن واختر Go To Definition الان يجب ان تعلم في مكتبة هي وما هي الباراميتر parameters اللذي نحتاجه لكي تعمل الدالة وهذه الدالة تخبرنا هل الدرايف تم تحميله لانه في ميموري لا يمكن ادارته ولكننا سنديره
hNdisapi الباراميتر اللذي نحتاجه في الدالة السابقة وهو عبارة عن متغيير من نوع intptr قمنا بانشاءه سابقا

 

for (int i = 0; i < AdList.m_nAdapterCount; i++)  لوب يعمل عدد المرات المساوية بعدد الكروت الان عرفت القيمة الموجودة في AdList.m_nAdapterCount كيف جاءت القيمة في هذا المتغير؟

GCHandle هو من وضع الكثير من القيم فيAdList اللذي وصل الى تلك الاماكن وقرأة المعلومات عن الادابتر ووضعها في AdList اللذي هو من نوع TCP_AdapterList اللذي يوجد فيه 6 متغييرات هل تتذكر الحمدلله

string sq = Encoding.ASCII.GetString(AdList.m_szAdapterNameList, (int)(i * 256), 256);؟

sq متغيير من نوع سترنغ

Encoding.=عكس التشفير (ارجاع التشفير الى القيمة الاصلية)

ASCII=كلنا سمعنا عن الاسكي وهي الحروف التي على كيبوردك فمثلا حرف a يساوي65 واللذي يساوي 1000001

GetString =اخذها من السترنغ

AdList.m_szAdapterNameList ما سرحنا سابقا متتغير موجود في AdList. وتحمل قيمة 1000001

(int)(i * 256) رقم الاول من البايت الموجود في  AdList.m_szAdapterNameList

256 عدد البايتات لفك التشفير عنها

يمنكك حذف هذا الكود فقط لم امسحه لانه موجود في المكان اللذي نسخت الكود منه .يمكنك عرض هذه المعلومات في كومبوبوكس اخر

 

string szFriendlyName = Ndisapi.ConvertAdapterName(AdList.m_szAdapterNameList, i * 256, (uint)verInfo.dwPlatformId, (uint)verInfo.dwMajorVersion);؟

ConvertAdapterName يحوال اسم الادابتر من البايت الى سترنغ وجميع الباراميتر  عليك معرفتها سابقا فقط go to definition

 

comboBox1.Items.Add(i.ToString()+") "+szFriendlyName); اضافة الى كومبوبوكس

 

ولن اعطيكم الرنامج لان عليك عمل جميع الخطوات لاستفادة اكثر وهذه صورة البرنامج بعد التنفيذ

post-257301-0-88875200-1379208685.png

 

 

 

 

 

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس الثامن

في البرنامج السابق فقط قمنا بوضع جميع ال interface في ال combobox والان عند اختيار اي ادابتر يجب اظهار خصائصه

 

قم باضافة 7 ليست بوكس مع 7 لابل  Label الى البرنامج السابق كما في الصورة

 

post-257301-0-16193100-1379288848_thumb.

 

واضغط مرتين على كومبوبوكس للوصول الى حدث comboBox1_SelectedIndexChanged

وانسخ هذا الكود

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)        {            int indexofadapter = comboBox1.SelectedIndex;            try            {                OSVERSIONINFO verInfo = OSVERSIONINFO.GetVersion();                uint nMTUDec = Ndisapi.GetMTUDecrement();                uint dwAdapterStartupMode = Ndisapi.GetAdaptersStartupMode();                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");                TCP_AdapterList AdList = new TCP_AdapterList();                GCHandle.Alloc(AdList);                if ((Ndisapi.IsDriverLoaded(hNdisapi)))                {                    bool result = Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref AdList);                    int i = indexofadapter;                                            string sq = Encoding.ASCII.GetString(AdList.m_szAdapterNameList, (int)(i * 256), 256);                        string szFriendlyName = Ndisapi.ConvertAdapterName(AdList.m_szAdapterNameList, i * 256, (uint)verInfo.dwPlatformId, (uint)verInfo.dwMajorVersion);                        textBox1.Text = i.ToString();                        textBox2.Text = szFriendlyName.ToString();                        textBox3.Text = sq;                        textBox4.Text = String.Format(                            "{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}",                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 1],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 2],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 3],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 4],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 5]                            );                        textBox5.Text = String.Format("0x{0:X8}", AdList.m_nAdapterMediumList[i]);                        textBox6.Text = String.Format("{0}", AdList.m_usMTU[i]);                        // Set tunnel mode for the selected network iunterface                        ADAPTER_MODE mode = new ADAPTER_MODE();                        mode.hAdapterHandle = AdList.m_nAdapterHandle[i];                        Ndisapi.GetAdapterMode(hNdisapi, ref mode);                        textBox7.Text = String.Format("0x{0:X8}", mode.dwFlags);                                    }                else                {                }                Ndisapi.CloseFilterDriver(hNdisapi);            }            catch (Exception ex)            {                Console.WriteLine(ex.ToString());            }        }

الان عند اختيار الادابتر تظهر جميع خصائصه لن نستفيد من هذه الخصائص في برنامجنا فقط نحتاج ال index لادابتر الشغال في حاسوبك

 

شرح الكود

int indexofadapter = comboBox1.SelectedIndex; نعرف int ويحتوي على ال index المختار في ال combobox وجميعنا نعلم باننا اضفنا جميع اسماء الكروت الى الكومبوبوكس تسلسلا لذل ال index في الكومبو بوكس مساوي لindex لاسم الادابتر

 

وعندما نختار الاول يكون الاندكس 0 وهو كارت الاول لذل  نستخدم 0 لعرض الخصائص

 

OSVERSIONINFO verInfo = OSVERSIONINFO.GetVersion();

                uint nMTUDec = Ndisapi.GetMTUDecrement();
                uint dwAdapterStartupMode = Ndisapi.GetAdaptersStartupMode();

                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");

                TCP_AdapterList AdList = new TCP_AdapterList();
                GCHandle.Alloc(AdList);

كل الكود معاد قد تم شرحه سابقا فقط نعرف 2 من نوع uint ونساويهم  بالخصائص الموجودة في مكتبة Ndisapi هل تذكر ما قلت في درس السابع (عليك قرأتها جميعا ) وهاتان القيمتانNdisapi.GetMTUDecrement وNdisapi.GetAdaptersStartupMode هما ما نستخدمه من المكتبة ونستفاد من هذه الدوال حتى لانرى الكود ولا نعلم كيف صنع

الاولى تهئ القيمة لكي تاخذ خاصية والاخرى خاصية ثانية حتى انا لا اعلم كيف تعمل بلضبط

 

GCHandle.Alloc(AdList); شرحناها بانها تصل الى اماكن في الميموري يصعب ادارتها ولكنها وصلت

 

(Ndisapi.IsDriverLoaded(hNdisapi) دالة تخبرنا هل المكتبة قامت بعملها

 

bool result = Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref AdList); اهم كود في لالبرنامج وتضع جميع الخصائص في array خاص كل ما علينا فعله هو اضهار هذه الخصائص في التكست بوكس السبعة باستخدام الاندكس  لانك الان تستطيع طبع جميع الخصائص لجميع الادابتر لان كل القيم الان موجودة في ذلك array

 

 

Ndisapi.GetTcpipBoundAdaptersInfo تقول هاتي الخصائص من hNdisapi

hNdisapi مؤشر ponter قمنا بتعريفه لفتح درايف المكتبة

AdList  هو reference (مصدر)للميموري الذي يوضع فيه الخصائص(نعم هذا هو الarray الخاص )

 

Ndisapi.GetTcpipBoundAdaptersInfoوهذه الدالة ترجع قيمة من نوع bool وتساوي true اذا نجحت عملية نقا الخصائص و false للفشل

 

 

int i = indexofadapter; لكثرة استخدام الاندكس استبدلته ب i

 

واذا كتبت  AdList وبعدها نقطة  ستظهر جميع الخصائص الموجودة في ال Array  وهي 6 قيم كما في الصورة

 

post-257301-0-06733200-1379291142_thumb.

 

علينا وضعها جميعا في التكت بوكس التي اضفناها الى الفورم ولكن يجب تعديل بعضها  لانها بقيمة Hexa اي 1 و0 على شكل احرف وارقام وقد شرحت الباينريbinary في الدرس الرابع واذكرك بمثال 1010 يساوي 10 ويساوي a ال hexa

 

string sq = Encoding.ASCII.GetString(AdList.m_szAdapterNameList, (int)(i * 256), 256); نحول الخاصية الاولى من الاسكيASCII وهي ايضا قيم من نوع هيكسا ولكنها تتحول الى احرف الكيبورد مثلا 1100001 تساوي 97 وتساوي 61 في ال hexa وتساوي حرف a الاسكي

و 98 حرف b

و 99 حرف c

.

.

و 122 حرف z

الان قيمة خاصية AdList.m_szAdapterNameList موجودة في سترنغ sq ،حولها الى تكست بوكس

 

 

 

 string szFriendlyName = Ndisapi.ConvertAdapterName(AdList.m_szAdapterNameList, i * 256, (uint)verInfo.dwPlatformId, (uint)verInfo.dwMajorVersion); خاصية AdList.m_szAdapterNameList في سترنغ szFriendlyName

 

textBox1.Text = i.ToString(); قيمة الاندكس عندما حولناه الى i

 

 

textBox2.Text = szFriendlyName.ToString(); تحويل الخاصية الى تكست بوكس

 

textBox3.Text = sq;تحويل الخاصية الى تكست بوكس

 

textBox4.Text = String.Format(
                            "{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}",
                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH],
                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 1],
                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 2],
                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 3],
                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 4],
                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 5]
                            ); تحويل الخاصية الى تكست بوكس بعد تحويلها الى الهيكسا، X تدل على الهيكسا في string format و AdList.m_czCurrentAddress تعني الماك MAC ولان الماك يتكون من 6 ارقام هيكسا وبينهم علامة :  علينا تعديلها كما في الكود

 

وللمزيد من المعلومات عن string format اضغط هنا

 

textBox5.Text = String.Format("0x{0:X8}", AdList.m_nAdapterMediumList);تحويل الخاصية الى تكست بوكس ايضا من الهيكسا

 

textBox6.Text = String.Format("{0}", AdList.m_usMTU);;تحويل الخاصية بدون هيكسا انظر كيف هي في التكست بوكس

 

 

ADAPTER_MODE mode = new ADAPTER_MODE();
                        mode.hAdapterHandle = AdList.m_nAdapterHandle;
                        Ndisapi.GetAdapterMode(hNdisapi, ref mode);

                        textBox7.Text = String.Format("0x{0:X8}", mode.dwFlags); تحويل الخاصية الى هيكسا

 

صورة البرنامج بعد التنفيذ

post-257301-0-05022000-1379292736_thumb.

 

 

 

 

 

 

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس التاسع

 

والان سنقوم بصنع packet sniffer  وهو برنامج موجود مع winpackfltr وقد نفذنا البرنامج سابقا في درس السادس وكان اسم البرنامج packetsniffer.exe واللذي يقوم بعرض ip  لجميع الحزم الصادرة والمستلمة والملف من نوع console سنحوله الى فورم (اقرا الكود الموجود في C:\Program Files (x86)\WinpkFilter\samples\CSharp\packetsniffer)المسمة ب Program.cs وسوف القب هذا املف ب الجاسوس ههههههه

 

اولا نصصم البرنامج السابق لاختيار الادابتر الشغال في الحاسوب وبعد اختيار الادابتر نضغط start button لكي يبدا العرض في listview وايضا اضف listbox لاظهار الحالة 

كما في الصورة

post-257301-0-50355100-1379637573_thumb.

ولان البرنامج يتعامل مع الادابتر باستمرار (ينظر الى الحزم باستمرار) فلا يمكن اضافة اي شى الى listview والحل يمكن في ال thread حيث ينظر الى الحزم باستمرار مع اضافتها الى ال listview

ارجوا ان استوعبتو الفكرة باننا نقسم برنامجنا الى اثنين من ال  thread احدهم الاساسي للبرنامج والثاني يقوم بمراقبة الحزم والاثنين يعملان مع لانه من المستحيل المراقبة و التعامل مع الفورم في ثريد واحد وسنستعمل invoke لاضافة اي ip الى listview

 

 

لتعريف ثريد اكتب الكود التالي ويجب اضافة using System.Threading; في بداية البرنامج

public Thread programThread;

ونعرف function من نوع unsafe (سنشرحها لاحقا) ونسمي ال function  ب (كل العمل) allwork وهذا هو الكود

unsafe void allwork(){}

ومن الاسم نعلم بان كل العمل سيكون في هذا ال function .

 

والان كيف ستعمل ال allwork function بثريد مختلف عن ثريد البرنامج ؟نستعمل الثريد اللذي عرفناه سابقا كما في الكود اللذي سيكون داخل زر Start

programThread = new Thread(new ThreadStart(allwork));programThread.Start();

ما معنى unsafe ؟لقد قمنا سابقا في درس السابع بتغيير خصائص البرنامج الى allow unsafe code و unsafe تعني (غير امن) وهي اي بيانات تقراها من مكاتب غريبة او من الاجهزة فلا يعلم او يتاكد الكومبايلر من انواع البيانات وتوافقها مع انواع البيانات والمتغيرات في اللغة لذا هذه ال function من نوع unsafe

 

ولا تضغط مرتين على زر start لان سيكون هنالك ثريد اخر يعمل بنفس الكود ويمكن اصلاح هذا الخطا بعدم السماح لليوسر بلضغط ثانية ولك باستخدام خاصية الامكانية للبوتن كما في الكود

Buttton1.Enable=False;

على زر stop نقوم بايقاف الثريد ونمكن زر Start من العمل ثانية كما في الكود

programThread.Suspend();Button1.enable=True;

نستكمل غدا لا تنسى ادرس الجاسوس جيدا جيدا لان سيكون allwork

تم تعديل بواسطه zaraki_kenpache
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس العاشر

الان سندرس كود program.cs الموجود داخل C:\Program Files (x86)\WinpkFilter\samples\CSharp\packetsniffer واللذي لقبناه سابقا ب الجاسوس

وها هو الكود

/*************************************************************************//*				Copyright (c) 2000-2010 NT Kernel Resources.		     *//*                           All Rights Reserved.                        *//*                          http://www.ntkernel.com                      *//*                           [email protected]                         *//*                                                                       *//* Module Name:  PacketSniffer main module                               *//*                                                                       *//* Abstract: Defines the entry point for the console application         *//*                                                                       *//*************************************************************************/using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.IO;using System.Threading;using System.Net;using NdisapiSpace;using Win32APISPace;namespace PacketSniffer{    class Program    {        unsafe void Run(uint iIndex, uint iCount, bool bPromisc)        {            try            {                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");                if (Ndisapi.IsDriverLoaded(hNdisapi))                {                    // Retrieve adapter list                    TCP_AdapterList adList = new TCP_AdapterList();                    Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref adList);                    uint dwOldHwFilter = 0;                    if (bPromisc)                    {                        if (!Ndisapi.GetHwPacketFilter(hNdisapi, adList.m_nAdapterHandle[iIndex], ref dwOldHwFilter))                            Console.WriteLine("Failed to get current packet filter from the network interface.");                        else                            Console.WriteLine("Succeded to get current packet filter from the network interface. dwOldHwFilter = {0}", dwOldHwFilter);                        if (!Ndisapi.SetHwPacketFilter(hNdisapi, adList.m_nAdapterHandle[iIndex], 0x00000020/*NDIS_PACKET_TYPE_PROMISCUOUS*/))                            Console.WriteLine("Failed to set promiscuous mode for the network interface.");                        else                            Console.WriteLine("Succeded to set promiscuous mode for the network interface.");                    }                    // Set listen mode for the selected network interface                    ADAPTER_MODE mode = new ADAPTER_MODE();                    if(bPromisc)                        mode.dwFlags = Ndisapi.MSTCP_FLAG_SENT_LISTEN | Ndisapi.MSTCP_FLAG_RECV_LISTEN | Ndisapi.MSTCP_FLAG_FILTER_DIRECT | Ndisapi.MSTCP_FLAG_LOOPBACK_BLOCK;                    else                        mode.dwFlags = Ndisapi.MSTCP_FLAG_SENT_LISTEN | Ndisapi.MSTCP_FLAG_RECV_LISTEN;                    mode.hAdapterHandle = adList.m_nAdapterHandle[iIndex];                    Ndisapi.SetAdapterMode(hNdisapi, ref mode);                    // Allocate and initialize packet structures                    ETH_REQUEST Request = new ETH_REQUEST();                    INTERMEDIATE_BUFFER PacketBuffer = new INTERMEDIATE_BUFFER();                    IntPtr PacketBufferIntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(PacketBuffer));                    win32api.ZeroMemory(PacketBufferIntPtr, Marshal.SizeOf(PacketBuffer));                    Request.hAdapterHandle = adList.m_nAdapterHandle[iIndex];                    Request.EthPacket.Buffer = PacketBufferIntPtr;                    ETHER_HEADER* pEthHeader = null;                    IPHeader* pIpHeader = null;                    TcpHeader* pTcpHeader = null;                    UdpHeader* pUdpHeader = null;                    while (iCount > 0)                    {                        if (Ndisapi.ReadPacket(hNdisapi, ref Request))                        {                            --iCount;                            PacketBuffer = (INTERMEDIATE_BUFFER)Marshal.PtrToStructure(PacketBufferIntPtr, typeof(INTERMEDIATE_BUFFER));                            if (PacketBuffer.m_dwDeviceFlags == Ndisapi.PACKET_FLAG_ON_SEND)                                Console.WriteLine("\nMSTCP --> Interface");                            else                                Console.WriteLine("\nInterface --> MSTCP");                            Console.WriteLine("Packet size = {0}", PacketBuffer.m_Length);                            pEthHeader = (ETHER_HEADER*)((byte*)PacketBufferIntPtr + (Marshal.OffsetOf(typeof(INTERMEDIATE_BUFFER), "m_IBuffer")).ToInt32());                            Console.WriteLine(                                "\tETHERNET {0:X2}{1:X2}{2:X2}{3:X2}{4:X2}{5:X2} --> {6:X2}{7:X2}{8:X2}{9:X2}{10:X2}{11:X2}",                                pEthHeader->source.b1,                                pEthHeader->source.b2,                                pEthHeader->source.b3,                                pEthHeader->source.b4,                                pEthHeader->source.b5,                                pEthHeader->source.b6,                                pEthHeader->dest.b1,                                pEthHeader->dest.b2,                                pEthHeader->dest.b3,                                pEthHeader->dest.b4,                                pEthHeader->dest.b5,                                pEthHeader->dest.b6                                );                            if (ntohs(pEthHeader->proto) == ETHER_HEADER.ETH_P_IP)                            {                                pIpHeader = (IPHeader*)((byte*)pEthHeader + Marshal.SizeOf(typeof(ETHER_HEADER)));                                IPAddress src_addr = new IPAddress(pIpHeader->Src);                                IPAddress dst_addr = new IPAddress(pIpHeader->Dest);                                Console.WriteLine("\tIP {0} --> {1} PROTOCOL: {2}", src_addr.ToString(), dst_addr.ToString(), pIpHeader->P);                                if (pIpHeader->P == IPHeader.IPPROTO_TCP)                                    pTcpHeader = (TcpHeader*)((byte*)pIpHeader + ((pIpHeader->IPLenVer) & 0xF) * 4);                                else                                    pTcpHeader = null;                                if (pIpHeader->P == IPHeader.IPPROTO_UDP)                                    pUdpHeader = (UdpHeader*)((byte*)pIpHeader + ((pIpHeader->IPLenVer) & 0xF) * 4);                                else                                    pUdpHeader = null;                                if (pUdpHeader != null)                                {                                    Console.WriteLine("\tUDP SRC PORT: {0} DST PORT: {1}",                                        ntohs(pUdpHeader->th_sport),                                        ntohs(pUdpHeader->th_dport)                                        );                                }                                if (pTcpHeader != null)                                {                                    Console.WriteLine("\tTCP SRC PORT: {0} DST PORT: {1}",                                        ntohs(pTcpHeader->th_sport),                                        ntohs(pTcpHeader->th_dport)                                        );                                }                            }                            if (ntohs(pEthHeader->proto) == ETHER_HEADER.ETH_P_RARP)                                Console.WriteLine("\tReverse Addr Res packet");                            if (ntohs(pEthHeader->proto) == ETHER_HEADER.ETH_P_ARP)                                Console.WriteLine("\tAddress Resolution packet");                        }                        else                        {                            Console.Write(".");                            System.Threading.Thread.Sleep(100);                        }                    }                    Marshal.FreeHGlobal(PacketBufferIntPtr);                    if(bPromisc)                        Ndisapi.SetHwPacketFilter(hNdisapi, adList.m_nAdapterHandle[iIndex], dwOldHwFilter);                }                else                    Console.WriteLine("Driver not loaded.");                Ndisapi.CloseFilterDriver(hNdisapi);            }            catch (Exception ex)            {                Console.WriteLine(ex.ToString());            }        }        static void Main(string[] args)        {            bool bPromisc = false;            if (args.Length < 2)            {                Console.WriteLine("Command line syntax:\n\tPacketSniffer.exe index num [-promisc]\n\tindex - network interface index.\n\tnum - number or packets to capture\n\t-promisc - optional parameter. \n\tWhen specified network interface is switched to the promiscuous mode.\n\tYou can use ListAdapters to determine correct index.\n");                return;            }            if (args.Length == 3)            {                if (args[2].Equals("-promisc"))                    bPromisc = true;            }            (new Program()).Run(uint.Parse(args[0]) - 1, uint.Parse(args[1]), bPromisc);        }        unsafe ushort ntohs(ushort netshort)        {            ushort hostshort = (ushort)(((netshort >> 8) & 0x00FF) | ((netshort << 8) & 0xFF00));            return hostshort;        }        unsafe ushort htons(ushort hostshort)        {            return ntohs(hostshort);        }    }}

نضرة سريعة على الكود نرى ثلاث function الاولى في سطر 28 اسمها run وايضا الثانية في سطر194 والثالثة في سطر200 والاساسية Main في سطر175

 

الثلاث الاولى من نوع unsafe و run هو من نوع program

كل العمل في run و الاخريات  ntohsوhtons ترجعان قيمة من نوع ushort
 

نبدا كما يبدا الكومبايلر من الدالة الرئيسية main  في سطر 175

كما تعلمون البرنامج ياخذ ثلاث parameter عند التنفيذ الاول index والثاني عدد الحزمات المراد رؤيتها والثالث اختياري المسمى بbPromisc

وقد نفذنا البرنامج في درس الثالث وكتبنا   packetsniffer.exe 1 100  ومعناه الادابتر 1  و100 حزمة وبامكانك ادخال الخيار الثالث وسيكون كالتالي

 packetsniffer.exe 1 100 - bPromisc

نرجع الى سطر 175 تعريف الدالة الرئيسية والتي تبدا اولا في التنفيذ

 

177 القيمة الافتراضية ل bPromisc وهي true

179 الى 183  اذا قيمة الparameter اقل من اثنان معناها انك لم تدخل الاندكس والعدد المطلوب للحزم فيعطيك رسالة ب البارامتر الصحيحة ويخبرك بان الثالث اختياري

كما في الصورة

post-257301-0-48279900-1379639264_thumb.

واذا ادخلنا جميع البارامتر بصورة صحيحة يقرا لنا ما نريده من حزم كما في الصورة

post-257301-0-84379300-1379640022_thumb.

ادخلنا الاندكس 4 لانه الشغال عندي وقمت بادخال 3 لكي يقرأ 3 حزم فقط

 

185 الى 189 اذا ادخلت القيمة -promisc كما فعلنا سابقا فحول القيمة الى true

 

191 نداء الى run لكي يبدا العمل ويعطيه البارامتر الثلاث الاندكس -1 وعدد الحزم وقيمة promisc  لا تنسى الاندكس ناقص واحد كما ترون انا سوف اعمل على نفس الادابتر وادخلت 4 وحوله الى ثلاثة لانه يبدا من الصفر

 

30  try لسيطرة على الاخطاء وتكملتها من 169 الى 172 catch والتي ستطبع الخطا

 

32 تحميل الدرايفNDISRD

33 هل تم تحميل الدرايف ماعدا ذلك في سطر 165 طبع بان الدرايف لم يحمل

36 تعريف الادابتر باسم aList وهذا الادابتر ما زال بحاجة الى اندكس

37 تعريف الدرايف NDISRD وادابتر aList ل مكتبة Ndisapi الخاصة ب winpackfltr

38 تعريف متغيير من نوع uint ومساووي ب صفر uint يعني int يحتوي على موجب فقط

40 اذا bPromisc يساوي true

42 تحقق اذا يتم القراة من الادابتر من الاندكس المختار
43 طبع فشل القراة من الادابتر
45 طبع النجاح القراة

54 MODE حالة البرنامج هنا نعرفه(مهم مهم مهم مهم)

56 اذا ادخلت Promisc- مع البارامتر يكون ال MODE على حالة SENT_LISTEN و RECV_LISTEN وFILTER_DIRECT وLOOPBACK_BLOCK
المهم هنا كلمة LISTEN وتعني الاستماع فقط اي لا يمكن التدخل في سير الحزم

60 نضع ال mode المختار في الادابتر اللذي اخترناه بل اندكس

65 تعريف bUFFER وهي الحزمة ،اضغط كليك الايمن و GO TO DEFINTION،  كلمة Marshal لمزيد من المعلومات اضغت هنا وبلعربي اضغط هنا

79 while تعمل بعدد الحزم التي ادخلتها مع البارامتر، icount عدد الحزم المراد قراتها
 81 اذا تم القراة
83 نقص عدد الحزم ب واحد
85 اذا فهمت Marshal ومكتبة Ndisapi ستفهمها , وفهمها ليس مهما
87 اذا الحزم مرسلة اطبع (من الادابتر الى الشبكة)
90 عكس 87
92 قم بطبع حجم الحزمة
94 تعريف pEthHeader وهو MAC
96 طبع الماك MAC للمرسل SRC وللمستلم DST احفظ الاختصارين جيدا لاننا سنستعملها 100 مرة ومرة ومرات تكون source ,dest

112 اذا بروتوكول ال IP شغال (يعني وجود ال IP)
114 تعريف ال IP لمزيد كليك ايمن go to defention
116 , 117  تعريف src ip  و dst ip

119 اطبع  src ip  و dst ip

121 اذا ال  IP يستخدم بروتوكول TCP
122 عرف لنا TCP
124 لا يوجد TCP

126  اذا ال  IP يستخدم بروتوكول UDP
127 عرف لنا UDP
129 لا يوجد UDP

131 اذا المعلومات داخل الحزمة في قسم header موجودة في IP المستخدم ل UDP
133 اطبع البورت المستخدم ل srcو dst وذلك باستخدام الدالتين الموجودتيين في السطور 194 و200

139اذا المعلومات داخل الحزمة في قسم header موجودة في IP المستخدم ل TCP
141 اطبع البورت المستخدم ل srcو dstوذلك باستخدام الدالتين الموجودتيين في السطور 194 و200

148 اذا كان يستخدم RARP وهو بروتوكول ابحث في غوغل
149 اطبع نوعه وذلك بكتابة اسم البروتوكول بدون اختصار

151 اذا كان يستخدم ARP وهو بروتوكول ابحث في غوغل
152 اطبع نوعه وذلك بكتابة اسم البروتوكول بدون اختصار

154 ما عدا ذلك اطبع النقاط
157 انتظر قليلا ل 100 MS

161 Marshal مرة اخرى, ارجوا ان عرفت استخداماته جيدا في الموقعين السابقين

 

 

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

وبعدها سنبدا الفلترة والسيطرة على الحزم لا تملو لانك الان على وشك الاحتراف في برمجة الشبكات


الان حان موعد النوم











 

 

 

 

 

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الدرس الحادي عشر

في الدرس السابق قمنا بشرح packet sniffer اللذس يعمل في وضع(MODE)  الLISTEN  وهو وضع الاستماع فقط بمعني فقط يقراة الحزم ويطبع المعلومات والكود السابق فيه اخطاء متعمدة من قبل الشركة ولكي ننفذه في برنامجنا وعرض المعلومات الحزمة في listview  علينا استخدام thread وسوف نعدل الكود لكي يلائم البرنامج

لقد قمنا سابقا باضافة   ndisapi.cs و win32api.cs من C:\Program Files (x86)\WinpkFilter\samples\CSharp\listadapters

والان يجب اضافة الملف الثالث الى المشروع وهوiphlp.cs الموجود في C:\Program Files (x86)\WinpkFilter\samples\CSharp\packetsniffer

ولك في solution explorer  واضغط على اسم البرنامج ب كليك الايمن واختر Add ومن Existing items

وفي مربع الاختيار اذهب الى هذا الامتداد

C:\Program Files (x86)\WinpkFilter\samples\CSharp\packetsniffer

واختر iphlp.cs  واضغط موافق لان البرنامج يستخدم 2 من دوال في هذا الملف

 

ولقد اضفنا اثنين من الlistview و اثنين button و listbox

وقمنا باضافة 9 كولم الى ال listview وهنا يجب تغيير الخاصية view الى detail لكي تظهر الكوام على شكل عواميد

 

ويجب ان تعرف كل console.writeline يجب ان تدخل في احدى الادوات ال list view او listbox

 

ونحن سنصع دالتين لادخال البيانات الى الlistview وlistboxe وستقوم بعملها عن طريق invoke و delegate 

 

الان قم بنسخ الكتابة من program.cs الى برنامجنا السابق(اللذي يختار الادابتر ويعرض تفاصيل الادابتر)

 

وسيكون بهذا الشكل

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using Win32APISPace;using NdisapiSpace;using System.Runtime.InteropServices;using System.Threading;using System.Net;namespace ArabTeamListAdapter{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }//###################################################################################################################        private void Form1_Load(object sender, EventArgs e)        {            try            {                OSVERSIONINFO verInfo = OSVERSIONINFO.GetVersion();                                uint nMTUDec = Ndisapi.GetMTUDecrement();                uint dwAdapterStartupMode = Ndisapi.GetAdaptersStartupMode();                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");                TCP_AdapterList AdList = new TCP_AdapterList();                GCHandle.Alloc(AdList);                if ((Ndisapi.IsDriverLoaded(hNdisapi)))                {                    bool result = Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref AdList);                    for (int i = 0; i < AdList.m_nAdapterCount; i++)                    {                        //string sq = Encoding.ASCII.GetString(AdList.m_szAdapterNameList, (int)(i * 256), 256);                        string szFriendlyName = Ndisapi.ConvertAdapterName(AdList.m_szAdapterNameList, i * 256, (uint)verInfo.dwPlatformId, (uint)verInfo.dwMajorVersion);                                              comboBox1.Items.Add(i.ToString()+") "+szFriendlyName);                                            }                }                Ndisapi.CloseFilterDriver(hNdisapi);            }            catch (Exception ex)            {                MessageBox.Show(ex.ToString());            }        }        //#########################################################################################################        int indexofadapter;        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)        {             indexofadapter = comboBox1.SelectedIndex;            try            {                OSVERSIONINFO verInfo = OSVERSIONINFO.GetVersion();                uint nMTUDec = Ndisapi.GetMTUDecrement();                uint dwAdapterStartupMode = Ndisapi.GetAdaptersStartupMode();                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");                TCP_AdapterList AdList = new TCP_AdapterList();                GCHandle.Alloc(AdList);                if ((Ndisapi.IsDriverLoaded(hNdisapi)))                {                    bool result = Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref AdList);                                        int i = indexofadapter;                                           string sq = Encoding.ASCII.GetString(AdList.m_szAdapterNameList, (int)(i * 256), 256);                        string szFriendlyName = Ndisapi.ConvertAdapterName(AdList.m_szAdapterNameList, i * 256, (uint)verInfo.dwPlatformId, (uint)verInfo.dwMajorVersion);                                            textBox1.Text = i.ToString();                        textBox2.Text = szFriendlyName.ToString();                        textBox3.Text = sq;                        textBox4.Text = String.Format(                            "{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}",                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 1],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 2],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 3],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 4],                            AdList.m_czCurrentAddress[i * Ndisapi.ETHER_ADDR_LENGTH + 5]                            );                        textBox5.Text = String.Format("0x{0:X8}", AdList.m_nAdapterMediumList[i]);                        textBox6.Text = String.Format("{0}", AdList.m_usMTU[i]);                        // Set tunnel mode for the selected network iunterface                        ADAPTER_MODE mode = new ADAPTER_MODE();                        mode.hAdapterHandle = AdList.m_nAdapterHandle[i];                        Ndisapi.GetAdapterMode(hNdisapi, ref mode);                        textBox7.Text = String.Format("0x{0:X8}", mode.dwFlags);                                    }                else                {                }                Ndisapi.CloseFilterDriver(hNdisapi);            }            catch (Exception ex)            {                Console.WriteLine(ex.ToString());            }        }        //##################################################################################        bool send = true;        public Thread programThread;        string[] st = new string[9];        public delegate void US(string S);        public void UseString(string S)        {            listBox1.Items.Add(S);        }        public delegate void US2(string[] S);        public void UseString2(string[] S)        {            if (send)            {                                        ListViewItem item = new ListViewItem(S[0]);            item.SubItems.Add(S[1]);            item.SubItems.Add(S[2]);            item.SubItems.Add(S[3]);            item.SubItems.Add(S[4]);            item.SubItems.Add(S[5]);            item.SubItems.Add(S[6]);            item.SubItems.Add(S[7]);            item.SubItems.Add(S[8]);            listView1.Items.Add(item);            }            else            {                ListViewItem item = new ListViewItem(S[0]);                item.SubItems.Add(S[1]);                item.SubItems.Add(S[2]);                item.SubItems.Add(S[3]);                item.SubItems.Add(S[4]);                item.SubItems.Add(S[5]);                item.SubItems.Add(S[6]);                item.SubItems.Add(S[7]);                item.SubItems.Add(S[8]);                listView2.Items.Add(item);            }                                }                               unsafe ushort ntohs(ushort netshort)        {            ushort hostshort = (ushort)(((netshort >> 8) & 0x00FF) | ((netshort << 8) & 0xFF00));            return hostshort;        }        unsafe ushort htons(ushort hostshort)        {            return ntohs(hostshort);        }        unsafe void allwork()        {                       uint iIndex = Convert.ToUInt16(indexofadapter );            bool bPromisc = false ;            try            {                                                IntPtr hNdisapi = Ndisapi.OpenFilterDriver("NDISRD");                if (Ndisapi.IsDriverLoaded(hNdisapi))                {                    // Retrieve adapter list                    TCP_AdapterList adList = new TCP_AdapterList();                    Ndisapi.GetTcpipBoundAdaptersInfo(hNdisapi, ref adList);                    uint dwOldHwFilter = 0;                    if (bPromisc)                    {                                               if (!Ndisapi.GetHwPacketFilter(hNdisapi, adList.m_nAdapterHandle[iIndex], ref dwOldHwFilter))                             listBox1.Invoke(new US(UseString), new Object[] {"Failed to get current packet filter from the network interface."});                        else                             listBox1.Invoke(new US(UseString), new Object[] {"Succeded to get current packet filter from the network interface. dwOldHwFilter = {"+dwOldHwFilter.ToString()+"}"} );                        if (!Ndisapi.SetHwPacketFilter(hNdisapi, adList.m_nAdapterHandle[iIndex], 0x00000020/*NDIS_PACKET_TYPE_PROMISCUOUS*/))                             listBox1.Invoke(new US(UseString), new Object[] {"Failed to set promiscuous mode for the network interface."});                        else                             listBox1.Invoke(new US(UseString), new Object[] {"Succeded to set promiscuous mode for the network interface."});                    }                                        // Set listen mode for the selected network interface                    ADAPTER_MODE mode = new ADAPTER_MODE();                    if (bPromisc)                        mode.dwFlags = Ndisapi.MSTCP_FLAG_SENT_LISTEN | Ndisapi.MSTCP_FLAG_RECV_LISTEN | Ndisapi.MSTCP_FLAG_FILTER_DIRECT | Ndisapi.MSTCP_FLAG_LOOPBACK_BLOCK;                    else                        mode.dwFlags = Ndisapi.MSTCP_FLAG_SENT_LISTEN | Ndisapi.MSTCP_FLAG_RECV_LISTEN;                    mode.hAdapterHandle = adList.m_nAdapterHandle[iIndex];                    Ndisapi.SetAdapterMode(hNdisapi, ref mode);                                        // Allocate and initialize packet structures                    ETH_REQUEST Request = new ETH_REQUEST();                    INTERMEDIATE_BUFFER PacketBuffer = new INTERMEDIATE_BUFFER();                    IntPtr PacketBufferIntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(PacketBuffer));                    win32api.ZeroMemory(PacketBufferIntPtr, Marshal.SizeOf(PacketBuffer));                    Request.hAdapterHandle = adList.m_nAdapterHandle[iIndex];                    Request.EthPacket.Buffer = PacketBufferIntPtr;                    ETHER_HEADER* pEthHeader = null;                    IPHeader* pIpHeader = null;                    TcpHeader* pTcpHeader = null;                    UdpHeader* pUdpHeader = null;                    while (true)                    {                                               if (Ndisapi.ReadPacket(hNdisapi, ref Request))                        {                                                      PacketBuffer = (INTERMEDIATE_BUFFER)Marshal.PtrToStructure(PacketBufferIntPtr, typeof(INTERMEDIATE_BUFFER));                                                      send = true;                            if (PacketBuffer.m_dwDeviceFlags == Ndisapi.PACKET_FLAG_ON_SEND)                            {                                listBox1.Invoke(new US(UseString), new Object[] { "MSTCP --> Interface" });                                send = true;                            }                            else                            {                                listBox1.Invoke(new US(UseString), new Object[] { "Interface --> MSTCP" });                                send = false;                            }                                                       st[0] = PacketBuffer.m_Length.ToString() ;//pachet size                                                       pEthHeader = (ETHER_HEADER*)((byte*)PacketBufferIntPtr + (Marshal.OffsetOf(typeof(INTERMEDIATE_BUFFER), "m_IBuffer")).ToInt32());                                                       st[1]=string.Format("{0:X2}{1:X2}{2:X2}{3:X2}{4:X2}{5:X2}",                                pEthHeader->source.b1,                                pEthHeader->source.b2,                                pEthHeader->source.b3,                                pEthHeader->source.b4,                                pEthHeader->source.b5,                                pEthHeader->source.b6                                 );//mac src                            st[2] = string.Format(" {0:X2}{1:X2}{2:X2}{3:X2}{4:X2}{5:X2}",                                                                pEthHeader->dest.b1,                                pEthHeader->dest.b2,                                pEthHeader->dest.b3,                                pEthHeader->dest.b4,                                pEthHeader->dest.b5,                                pEthHeader->dest.b6);//mac dst                                                       if (ntohs(pEthHeader->proto) == ETHER_HEADER.ETH_P_IP)                            {                                                               pIpHeader = (IPHeader*)((byte*)pEthHeader + Marshal.SizeOf(typeof(ETHER_HEADER)));                                IPAddress src_addr = new IPAddress(pIpHeader->Src);                                IPAddress dst_addr = new IPAddress(pIpHeader->Dest);                                                               //Console.WriteLine("\tIP {0} --> {1} PROTOCOL: {2}", src_addr.ToString(), dst_addr.ToString(), pIpHeader->P);                                st[3] = src_addr.ToString();//ip src                                st[4]=dst_addr.ToString();//ip dst                                st[5]=pIpHeader->P.ToString();//protocol                               // MessageBox.Show("9");                                if (pIpHeader->P == IPHeader.IPPROTO_TCP)                                    pTcpHeader = (TcpHeader*)((byte*)pIpHeader + ((pIpHeader->IPLenVer) & 0xF) * 4);                                else                                    pTcpHeader = null;                                if (pIpHeader->P == IPHeader.IPPROTO_UDP)                                    pUdpHeader = (UdpHeader*)((byte*)pIpHeader + ((pIpHeader->IPLenVer) & 0xF) * 4);                                else                                    pUdpHeader = null;                                if (pUdpHeader != null)                                {                                    //Console.WriteLine("\tUDP SRC PORT: {0} DST PORT: {1}",ntohs(pUdpHeader->th_sport), ntohs(pUdpHeader->th_dport) );                                    st[6] = "UDP";//protocol type                                    st[7] = ntohs(pUdpHeader->th_sport).ToString();//UDP src port                                    st[8] = ntohs(pUdpHeader->th_dport).ToString();//UDP dst port                                } //MessageBox.Show("10");                                if (pTcpHeader != null)                                {                                    //Console.WriteLine("\tTCP SRC PORT: {0} DST PORT: {1}",ntohs(pTcpHeader->th_sport),ntohs(pTcpHeader->th_dport));                                    st[6] = "TCP";//protocol type                                    st[7] = ntohs(pTcpHeader->th_sport).ToString();//TCP src port                                    st[8] = ntohs(pTcpHeader->th_dport).ToString();//TCP dst port                                }                            }                           // MessageBox.Show("11");                            if (ntohs(pEthHeader->proto) == ETHER_HEADER.ETH_P_RARP)                                listBox1.Invoke(new US(UseString), new Object[] {"Reverse Addr Res packet"});                            if (ntohs(pEthHeader->proto) == ETHER_HEADER.ETH_P_ARP)                                listBox1.Invoke(new US(UseString), new Object[] {"Address Resolution packet"});                           // MessageBox.Show("12");                            //System.Threading.Thread.Sleep(100);                            listView1.Invoke(new US2(UseString2), new Object[] { st });                                                    }                        else                        {                           // MessageBox.Show("99999");                           //  listBox1.Invoke(new US(UseString), new Object[] {"."});                            System.Threading.Thread.Sleep(100);                        }                                            }                    Marshal.FreeHGlobal(PacketBufferIntPtr);                    if (bPromisc)                        Ndisapi.SetHwPacketFilter(hNdisapi, adList.m_nAdapterHandle[iIndex], dwOldHwFilter);                }                else                    listBox1.Invoke(new US(UseString), new Object[] {"Driver not loaded."});                Ndisapi.CloseFilterDriver(hNdisapi);            }            catch (Exception ex)            {                Console.WriteLine(ex.ToString());            }        }//########################################################################################                private void button1_Click(object sender, EventArgs e)        {            //Thread programThread;            programThread = new Thread(new ThreadStart(allwork));                                programThread.Start();                button1.Enabled = false;        }                private void button2_Click(object sender, EventArgs e)        {            programThread.Suspend();            button1.Enabled = true;        }    }}

والان تم النسخ الجاسوس الى البرنامج وتمت جميع التعديلات اللازمة لتنفيذ البرنامج

 

شرح الكود

من سطر 1 الى 138 هو كود برنامجنا السابق اللذي يقوم باختيار ادابتر واضهار خصائصه
140 تعريف من نوع bool وبها نعرف اذا كانت الحزمة مرسلة او مستلمة
141 تعريف ثريد باسم programthread
142 تعريف مصفوفة من نوع stirng لنضع فيها ما نريد طبعها وارسالها الى دالة التي تقوم بادخال القيم الى الlistview

143 تعريف دالة باسم US وهي من نوع void اي لا ترجع قيمة وتاخذ سترنغ ك بارامتر ولا ننسى كلمة delegate وهي ما تمكننا من استخدام هذه الدالة في اي مكان وفي اي وقت من التنفيذ بواسطة كلمة invoke

144 دالة التي سنناديها عن طريق ال delegate السابق ويجب ان تكون متماثلة النوع والبارامتر وسميناها Usestring
148 اضافة الى ال listbox السترنغ اللذي سنرسله عن طريق invoke

152  تعريف US2 المشابهة ل US التي عرفناها في سطر 143 ولكنا خاصة لادخال البيانات الى ال listview1وlistview2
156 الى 170 ادخال البيانات الى listview1 لانها حزمة مرسلة
173 الى 183 ادخال البيانات الى listview2 لانها حزمة مستلمة

191 الى 383  استنسخنا الكود من الجاسوس بعد التعديلات ويمكنك ملاحضة الشبه وسنقوم بلشرح مجددا ههههههه

192 الى 204 دالتان من مكتبه iphlp.csالتي اضفناها مؤخرا وهاتان الدالتان نستخدمها فنرسل لها قيمة ushort وتعدلها وترجعها ونلاحظ بان الثانية لا تقم باي تعديل ولكن هل لاحظت بان الدالتان بنفس الاسم الاولى تعمل shift الازاحة للرقم والثانية لا تعل اي شئ

202 كانت تسمى في الجاسوس Run في سطر 28 وكانت تاخذ ثلاث بارامتر الاولى الاندكس والثانية عدد الحزم والثالث bPromisc
اما الان سناخذ قيمة الاندكس من ال combobox المختار
وعدد الحزم لا يهم لان البرنامج سيعمل باستمرار حتى يوقفه اليوسر
والثالثbPromisc ندخلها في البرنامج اما true او false وقم بتجربة الاثنين

205 نعرف uint ونسميه iIndex ومن الاسم تعلم بانه سيحتوي على رقم الاندكس المختار وقمنا سابقا بتعريف indexofadapter اللذي كان مساويا بقيمة الcombobox المختار عندما طبعنا الخصائص للادابتر
لماذا uint لان الاندكس في packetsniffer يقراه بهذه الطريقة في كل المكاتب

206 البارامتر الثالث جرب هنا القيمتين true او false
207 try كالسابق (ساستعمل كلمة كلسابق ومعناه راجع شرح كود الجاسوس)

211 تحميل الدرايف كالسابق
212 هل تم التحميل كالسابق
215 216 كالسابق
217 نحتاج الى هذه القيمة 0 لارسالها الى احدى الدوال
219 اذا bPromisc مساوي ب true لا تنسى جرب القيمتين ولن اشرح الكود لاني استعمل ال falseهههههه وهنا يتم ارسال القيمة 0 الموجودة في سطر 217

234 الى 238 يتم تعريف و اختيار الحالة MODE وطبعا في كل الاحوال هو LISTEN

240 ارسال قيمة الاندكس لتاشير عليه

241 ارسال ال mode اللذي عرفناه واخترنا له LISTEN

244 تعريف requst
245 تعريف buffer الحزمة

247مؤشرpointer مع مارشال
249 تهيئه الذاكرة لتكون مستعدة لتلقي المعلومات وطبعا باستخدام مارشال

251 هنا يتم اختيار  الادابتر بواسطة الاندكس لل request
252 لا اعرف ولكنه كل العمل اللذي قمناه من اجله ههههههه

254 الى 257  تعريف EthHeader  وهو الماك  MAC  وتعريف IP وTCP وUDP وطبعا جميعها مساوية ب null وكلها من ملف iphlp.cs

259 تعمل باستمرار
262 هل يتم قراة الحزم
266 قراة جميع معلومات الحزمة الى buffer لاتنسى جميع المعلومات التي سنظهرها هنا في هذا ال buffer المسمى ب PacketBuffer

268 send يساوي true القيمة الاولية حتى نعلم نوع الحزمة هل هي مرسلة او مستلمة
269 هل الحزمة مرسلة
271 اطبع في اليستبوكس من الحاسوب الى-->الى الانترنت عن طريق invoke
272 send يساوي true وعند ارسال القيمة للدالة التي ستطبع البيانات في الlistview ستعلم بانها ستضيفها الى listview1 لانها اليستيفيو بتاع المرسلة

274 ماعدا ذلك ومعناها بانها ليس مرسلة اذا هي مستلمة
276 اطبع في اليستبوكس من الانترنت الى الحاسوب عن طريق invoke
277 send يساوي false وعند ارسال القيمة للدالة التي ستطبع البيانات في الlistview ستعلم بانها ستضيفها الى listview2 لانها اليستفيو بتاع المستلمة

280 st  هي المصفوفة التى عرفناها في سطر 142 (تعريف مصفوفة من نوع stirng لنضع فيها ما نريد طبعها وارسالها الى دالة التي تقوم بادخال القيم الى الlistview)
الان st[0] تحمل قيمة PacketBuffer.m_Length وهي حجم الحزمة

282 وضع قيمة الماك MAC في pEthHeader التي عرفناه في سطر254 وهو الان يحتوي على الماك لحاسوب المرسل والمستلم ولكن على شكل 1 و0 bit
284الى 290 تحويل قيمة الماك الخاص بلمرسل من ال bit الى hexa و وضعها في st[1]
293 الى 300 تحويل قيمة الماك الخاص بلمستلم من ال bit الى hexa و وضعها في st[2]

وصلنا الان لل IP
309 هل يستخدم IP
312 نضع ال IP للمرسل والمستلم في pIpHeader اللي عرفناه في سطر 255
314 نعرف IP ونضع قيمة الIP للمرسل من pIpHeader في سطر السابق(312)
315  نعرف IP ونضع قيمة الIP للمستلم من pIpHeader

318 وضع قيمة الIP المرسل في st[3]
319وضع قيمة الIP المستلم في st[4]

320 نضع قيمةرقم البروتوكول المستخدم في st[5]

323 هل البروتوكول المستخدم هو TCP
324 ضع معلومات البروتوكول في pTcpHeader اللذي عرفناه في سطر256
326 ماعدا ذلك ليس TCP

328 هل البروتوكول المستخدم هو UDP
329 ضع معلومات البروتوكول في pUdpHeader اللذي عرفناه في سطر257
331 ماعدا ذلك ليس UDP

333 هل البروتوكول المستخدم UDP
336 ضع اسم البروتوكول واللذي هو UDP في st[6]
337 ضع قيمة بورت المرسل في st[7]
338 ضع قيمة بورت المستلم في st[8]

342 الى348 ضع القيم كما في الUDPولكنها هذه المرة بتاع الTCP

الان كل المعلومات موجودة في مصفوفة st كل ما علينا فعله ارسالها الى الدالة التي تقوم بوضع st في listveiw

ولكن لدينا 2 من الlistview واحدة لاظهار الحزم المرسلة واخرى للمستلمة كيف نعرف لاي واحدة سنرسل؟
لا تقلق اذا كانت قيمة send تساوي listview ستضيف المعلومات

351الى 355 طبع في listbox ما اذا كان يستخدم ARP او RARP

358 والان ارسال جميع القيم في مصفوفة st للدالة us2 لاضافتها الى ال listview


365 انتظر قليلا

369 مارشال

370 زائدة يمكنك حذفها التعلقة ب البرامتر الثالث

375 طبع في ليستبوكس بان الادابتر غير موجود ولذلك لم يتم تحميله

380 طبع الخطا ان وجد هههههه حولها الى listbox1 بدلا من console.writeline

385 عندما نضغط start

389 صنع ثريد ووضع اسم الدالة allowrk
391 ابدا الثريد
392 اجعل زر start غير صالح للضغط وذلك لمنع اليوزر من تنفيذ اكثر من ثريد واحد

396عندما نضغط stop
398 اوقف الثريد
399 اجعل زر start صالحا للضغط لان الثريد قد توقف
 

وهذه الصورة وقت التنفيذ

post-257301-0-92683900-1379726177_thumb.

وها البرنامج فقط لاعرف كم واحدا وصل الى هذه المرحلة معنا ArabTeamListAdapter.rar

تم تعديل بواسطه zaraki_kenpache
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

دروس مفيدة جدّا.. جازاك الله خيرا


:)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اشكرك اخي العزيز على الدروس المفيدة  . واتمنى ان ارى المزيد من مواضيعك المميزة.

 

لقد قمت بتجربة مشروعك وقد احتوى على مشكلة صغيرة ارجو حلها وهي:

System.DllNotFoundException: Unable to load DLL 'ndisapi.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
   at NdisapiSpace.Ndisapi.GetMTUDecrement()
   at ArabTeamListAdapter.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\*******\Downloads\ArabTeamListAdapter\ArabTeamListAdapter\Form1.cs:line 30
 
تحياتي... وبالموفقية
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

 

اشكرك اخي العزيز على الدروس المفيدة  . واتمنى ان ارى المزيد من مواضيعك المميزة.

 

لقد قمت بتجربة مشروعك وقد احتوى على مشكلة صغيرة ارجو حلها وهي:

System.DllNotFoundException: Unable to load DLL 'ndisapi.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
   at NdisapiSpace.Ndisapi.GetMTUDecrement()
   at ArabTeamListAdapter.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\*******\Downloads\ArabTeamListAdapter\ArabTeamListAdapter\Form1.cs:line 30
 
تحياتي... وبالموفقية

 

الدرس السابع

سوف الان نبرمج lstadapters مع فورم حيث عند تحميل البرنامج يقوم بقراة جميع الكروت ويضعها في combobox

قم بنسخ المكتبات ndisapi.dll و ndisapi.lib من C:\Program Files (x86)\WinpkFilter\kernel\bin\dll

فولدر amd64 لنظام 64

فولدر i386 لنظام 32

وانسخها في C:\Windows\System32 لكي يعمل البرنامج في اي مكان

وان لم تفهم اقرا درس السادس

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

موضوع جميل جدا الحقيقة عزيزي
لدى عدة استفسارات اولها
هل يمكنني مراقبة بورت معين ؟؟

ما هى النسخة التى تعمل عليها فيجوال بيسك 2010 ؟؟
هل يمكنني اعتراض اتصالات داخل الشبكة اذا شككت بها ؟؟
وفى الاخير دزاك الله عنا خير الجزاء
تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

موضوع جميل جدا الحقيقة عزيزي

لدى عدة استفسارات اولها

هل يمكنني مراقبة بورت معين ؟؟

ما هى النسخة التى تعمل عليها فيجوال بيسك 2010 ؟؟

هل يمكنني اعتراض اتصالات داخل الشبكة اذا شككت بها ؟؟

وفى الاخير دزاك الله عنا خير الجزاء

تحياتي

نعم يمكنك مراقبة بورت خاص

لا فرق كل النسخ من دوت نت ستعمل انا استخدم 2008

نعم وهذا هو المبتغى ولكني لم اكمل الشرح بعد

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ارجو منك متابعة المشروع عزيزي
مشروع فى قمة الروعة الف شكر على الطرح

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هل توقف الشرح هند هذا الحد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .