ABOMOKATL

كيف أحسب عدد الbytes المستقبلة و المرسلة لprocess معينة

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

السلام عليكم

حياكم الله

أريد حساب عدد الBytes المستقبلة و المرسلة لprocess معينة و ذلك عن طريق معرفة الID الخاص بتلك العملية

يعنى مثلا

يعنى عملية قامت بفتح إتصال ب20 IP و كل IP مفتوح له port خاص به

من خلال هذه المعلومات أرغب فى معرفة كمية الBytes المستقبلة و المرسلة لprocess فى خلال فترة زمنية معينة

0

شارك هذا الرد


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

يوجد حل يدور فى رأسى

أنا أستطيع أن أحصل على الpackets التى تأتى بها تلك العملية

فهل إذا قمت بالحصول على طول الpacket و قمت بتجميعها كل ثاينة أحصل على الذى أريد !!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
فهل إذا قمت بالحصول على طول الpacket و قمت بتجميعها كل ثاينة أحصل على الذى أريد !!

ولكن هذا قد لا يعطي الكميات الحقيقية المرسلة او المستقبلة بواسطه العملية , حيث ان العملية تقوم فقط بعملية وضع للباكت في طابور الارسال , وطبعاً النظام لاحقاً هو الذي يقرر متى سيتم التبادل . قد تكون طريقتك بحاجة الى اضافة شئ اخر مثل hook للكيرنل بحيث يتم الربط لاحقاً بين العملية والباكت المرسل فعلياً ويقوم هذا الـ hook بعمل تنبيه لتطبيقك في حال تم الارسال فعلياً عبر الشبكة ..

0

شارك هذا الرد


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

أنا أرغب بقدر المستطاع بجعل كل شئ من خلال الدوت نت هذه المرة

أنا على فكرة جربت التعامل مع الWinCap و إستطعت الحصول على الذى أتحدث عنه حاليا

و لكن كان هذا من خلال wrapping جاهز حصلت عليه من على الشبكة

أريد أن اعرف كيف أحصل على تفاصيل الpacket من خلال الدوت نت على الأقل ال Header لكى أعرف طول الpacket !

هذا أولا

ثانيا

حيث ان العملية تقوم فقط بعملية وضع للباكت في طابور الارسال , وطبعاً النظام لاحقاً هو الذي يقرر متى سيتم التبادل

أعتقد أن هذا لن يُحدث فارق كبير، أنا لست خبيرا فى مسائل برمجة الشبكات

أرجو أن توضح مثلا على ما تقول لكى أفهم الإنحراف المعيارى :) الذى قد يحدث بسبب هذا الأمر !

عموما لو أن هناك طريقة أخرى أسهل فأتمنى أن أجدها

يريت لو أن أحد يعرف كلامات أكتبها فى جوجل للبحث عن هذ الأمر فليخبرنى بها لكونى كلما بحثت خرج لى نتائج عن المنفذ التسلسلى :lol:

0

شارك هذا الرد


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

محمد نور أظنه يقصد ال Packets المستلمة لل process , بالتالي نعم إن جمعتها ستحصل على الحجم الحقيقي , لكن إنتبه أن تكون فيها معلومات Layer2 وكل ال headers موجودة كما هي ..

الشيء الآخر , لو كانت مشفرة على مستوى نظام التشغيل ك Ipsec سيتم فك تشفيرها قبل إدخالها لل process الخاص بك .. وأيضا بعض عمليات الضغط كالتي تحدث في RTP headers والتي هي ليست عبارة عن ضغط حقيقي لكن إختصار للمكرر , وعليات ضغط Payload أيضا .. الخ , لكن بشكل عام في الغالب لن يكون هناك فرق , ونادرا مايتم تفعيل الضغط مثلا .

0

شارك هذا الرد


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

أريد أن اعرف كيف أحصل على تفاصيل الpacket من خلال الدوت نت على الأقل ال Header لكى أعرف طول الpacket !

برمجة الشبكات في .net ليست إلا تغليف للأم Winsock 1 & 2 , وكانت هناك بارامتر في socket options , تقوم بضم بيانات الهدر مع البيانات التي ستقوم بإستلامها ..

الشيء الآخر ستحتاج أن تفعل Option آخر مهمته إقتناص البيانات الداخلة إليك أو لغيرك وإستلامها قبل أن يستلمها ال process المطلوب :) بالتالي تكون حللت المشكلة .

كما قلت هم 2 options يتم تفعيلهم كما كان في winsock الأم , لكن لاأذكر أسمائهم حاليا .

سأدخل بعد قليل وأتذكر قليلا ..

0

شارك هذا الرد


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

ماقصدته هو ان العمليات التي تقوم بالارسال والاستقبال معزولة عن تفاصيل الاتصال , فهي تكتفي بإستدعاء system call ما لتكن sendthis() , والذي تضع الباكت بدورها في طابور الارسال وتنسى العملية الباكت بعدها ..

يريت لو أن أحد يعرف كلامات أكتبها فى جوجل للبحث عن هذ الأمر فليخبرنى بها لكونى كلما بحثت خرج لى نتائج عن المنفذ التسلسلى

اضف كلمة sniffer الى عباره بحثك ..

0

شارك هذا الرد


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

فهمت كلاك يامحمد معاشر ... لكن عموما بال socket يمكن تنفيذها بشكل عملي ...

@محمد نور : إنظر ل IP_HDRINCL لل setsockopt و SIO_RCVALL لل IOCTL هذه بالنسبة لل WIN32 API ..

هنا مثال قديم بالسي , لشيء لحل مشكلة إستلام كامل الهدر أيضا يستخدم IP_HDRINCL :

http://www.arabteam2000-forum.com/index.php?showtopic=60047

فعل ال 2 options أعلاه وسيكون الموضوع في السليم ..

0

شارك هذا الرد


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

جزاكم الله خيرا

يعنى أفهم من هذا الكلام أن تجميع أطوال الPackets لن يمثل مشكلة

معذرة يا هيثم لم أفهم الجزء الأخير

الشيء الآخر ستحتاج أن تفعل Option آخر مهمته إقتناص البيانات الداخلة إليك أو لغيرك وإستلامها قبل أن يستلمها ال process المطلوب :) بالتالي تكون حللت المشكلة .

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

يعنى أنا لن أستخدم العملية نفسها لجلب الPackets و لكن سوف أفلتر الPackets على أساس المنافذ المفتوحة من قبل العملية, أظن أن هذا سوف يحل المشكلة أليس كذلك !!!

طيب هناك طلب أخر هاااااااااااام

أنا أريد أن أمنع IP معين من التخاطب مع تلك العملية أو عموما مع التخاطب معى

كيف أفعل هذا

و أيضا هل أستطيع أن أمنع العمل من إرسال أى شئ له و فى نفس الوقت أريد أن أجعل تلك العملية تأخذ منه

سأضرب مثلا

لو أن لدينا Process تتخاطب مع 5 IPs على2 منافذ مختلفة و تقوم بنقل ملفات من و إلى أولاءك الأخرون

هذه العملية تقوم بنقل بيانات من 5 معا و لكن 2 من 5 ينقلون منها بيانات

أنا<--------------1

أنا<--------------2

أنا<------------>3

أنا<--------------4

أنا<------------>5

كيف أمنع خروج تلك البيانات منى، أريد فقط أن يدخل إلى و لا يخرج

ملحوظة أنا أعلم أن هناك Packets تستخدم لتأسيس الإتصال و عمل أشياء أخرى غير نقل البياتات

لذلك فإنه يجب أن يكون منع الPackets دقيقا و إلا حدث خطأ فى نقل البيانات

0

شارك هذا الرد


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

للتسهيل

بغض النظر عن إذا كان يرسل لى أو أرسل له

كيف أمنع العملية من التخاطب معه !

تم تعديل بواسطه _- محمد نور -_
0

شارك هذا الرد


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

محد نور , المشكلة الذي أعرفه لو تم إرسال بينات لمنفذ معين سيكون هناك برنامج آخر يقوم بعمل listen في منفذ معين , فلا تستطيع أن تقوم بعمل Listen أكثر من مرة على نفس المنفذ لنفس كرت الشبكة "يمكن فتح نفس المنفذ على كرت الشبكة الثاني لو وجد وسيتم تمرير البيانات المستلمة لأول كرت شبكة فاتح المنفذ ", فمن سيستلم البيانات القادمة ؟

جرب أن تفتح منفذ مفتوح في الأصل بعد التحقق منه بال Netstat , ستحصل على خطا بقيمة return من الدالة ال Bind قبل عملية Listen مباشرة .. فهذه هي المشكلة هنا .

حتى أننا سابقا كتبنا كود لمسح المنافذ المفتوحة في الجهاز بمحاولة عمل bind لكل المنافذ ولو إستلمنا خطأ يعني أن المنفذ مفتوح فعلا :D

ال RCVALL ستحل هذه المشكلة حيث أنها لاتحتاج للتنصت على منفذ معين فقط , لكن ستحصل على كل ال Packets التي ستصل لنظامك ويقوم برنامجك بالتطفل وقراءة هذه ال Packets قبل أن تصل لل process الحقيقي الذي قام بعمل Listen على المنفذ المطلوب .. بالتالي ستحتاج أن تقرأ في بيانات هدر الباكتات القادمة وتعرف لأي منفذ هي ذاهبة .

لكن إنتبه أن SIO_RCVALL ليست إلا لتقوم بتفعيل ال promiscuous mode في كرت الشبكة ليس إلا , ولو كان كرت الشبكة لايدعم ال promiscuous mode فلن تعمل معك , في لنكس تستطيع تفعيل promiscuous mode من سطر الأوامر


ifconfig eth0 promisc

أيضا لاحظ لهذه التنبيهات من MSDN أيضا :

A socket bound to a specific local interface with the SIO_RCVALL IOCTL will receive only packets passing through that interface. It will not receive packets received on another interface and getting forwarded out on another interface different from the socket bound with SIO_RCVALL IOCTL.

On Windows Server 2008 and earlier, the SIO_RCVALL IOCTL setting would not capture local packets sent out of a network interface. This included packets received on another interface and forwarded out the network interface specified for the SIO_RCVALL IOCTL.

On Windows 7 and Windows Server 2008 R2 , this was changed so that local packets sent out of a network interface are also captured. This includes packets received on another interface and then forwarded out the network interface bound to the socket with SIO_RCVALL IOCTL.

أيضا :

Setting this IOCTL requires Administrator privilege on the local computer.

This feature is sometimes referred to as promiscuous mode. Any direct change from applying this option on one interface and then to another interface with a single call using this IOCTL is not supported . An application must first use this IOCTL to turn off the behavior on the first interface, and then use this IOCTL to enable the behavior on a new interface.

http://msdn.microsoft.com/en-us/library/ee309610%28VS.85%29.aspx

بالنسبة لعمل ال block ل IP معين .. فهذه مشكلة , لأن الباكتات التي ستسلمها ليس إلا نسخة منها ولاأظن أنك لو قمت بتعديلها فسوف تأثر على تلك التي ستسلم للبروسيس المطلوب .

بالتالي هنا تحتاج أن تستخدم device driver ليقوم بعمل الفلترة , يوجد مثال هنا من code project :

http://www.codeproject.com/KB/IP/smfirewall.aspx

بالسي++ والذي يهمك فيه ال device driver الموجود فيه إسمه DrvFltIp.sys , إقرأ كيفية إستخدامه في الكود أعلاه ثم أعد إستخدامه في برنامج , أو إبحث عن DeviceDriver آخر مع كيفية إستخدامه للفلترة , أو إصنع واحد بنفسك , وهنا GamingMaster سيفيدك كثيرا , ولو بقيت على حل ال Device Driver حتى عملية ال sniffing بدل إستخدام SIO_RCVALL إستخدم ال device driver نفسه لأنه سيكون وصل لمرحلة إستلام الباكتات من الهاردوير مباشرة .

0

شارك هذا الرد


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

:cry: :cry: :cry: :cry: :cry: :cry:

الكلام أصبح مليئ بالطلاسم :calc:

لم أعد أفكر فى عمل Blocking :D

عموما جزاكم الله خيرا كثيرا

سوف أحاول مع موضوع الDeviceDriver و أتمنى أن أفهم الذى سوف يأتى فيما بعد :huh:

تم تعديل بواسطه _- محمد نور -_
0

شارك هذا الرد


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

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

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



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

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

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