2010-08-15 24 views
10

बैकग्राउंड: अब मैं समझता हूं कि सी # एप्लिकेशन कैसे लिखना है जो पीसी पर नेटवर्क कार्ड के अंदर/बाहर आने वाले पैकेटों की निगरानी कर सकता है, एप्लिकेशन चालू है। जिस दृष्टिकोण को मैं जानता हूं वह http://www.winpcap.org/ पर निर्भर करता है, हालांकि पीसी पर पहले से ही स्थापित किया जा रहा है, और फिर मैं http://pcapdotnet.codeplex.com/ या http://sourceforge.net/projects/sharppcap/ जैसे सी # रैपर का उपयोग करता हूं।सी # - WinPCap पर भरोसा किए बिना किसी ऐप में पैकेट को कैसे छीनना है?

प्रश्न: मेरा प्रश्न तथापि, क्या मैं एक सी # अनुप्रयोग है कि पैकेट है कि एक 3 पार्टी आवेदन/ड्राइवरों की आवश्यकता नहीं है पहले से स्थापित किए जाने की सूंघ कर सकते हैं करने में सक्षम होना करने के लिए की आवश्यकता होगी?

स्पष्टीकरण: यह मैं वास्तव में मैं वर्तमान में है आवेदन चाहते हैं, लेकिन किसी भी आवश्यकता मुझे जाने के लिए और डाउनलोड करने के लिए उपयोगकर्ता बताने के लिए बिना/XYZ स्थापित अनुप्रयोग का उपयोग करने में सक्षम होने से पहले है। प्रश्न के प्रयोजन के लिए मान लें कि किसी तृतीय पक्ष एप्लिकेशन/ड्राइवरों के डाउनलोड और इंस्टॉल को स्वचालित करने की अनुमति नहीं है। व्यक्तिगत तौर पर मैं WinPcap से चिपके हैं (WinPcap के साथ मुझे यकीन है कि अगर आप इसे बंडल कर सकते हैं नहीं कर रहा हूँ, फिर भी मेरा मानना ​​है कि आप दुर्भाग्य से किसी भी मामले में नहीं करना पड़ेगा)

धन्यवाद

+2

सी # में WinPCAP या माइक्रोसॉफ्ट के नेटवर्क मॉनिटर की कार्यक्षमता को हल करें - समस्या हल हो गई। गंभीरता से, हालांकि - निगरानी पैकेट बहुत कठिन है इसलिए आपको या तो कुछ गंभीर कोडिंग करना होगा या किसी तृतीय-पक्ष पैकेज पर भरोसा करना होगा। –

+0

दिलचस्प। क्या यह आपके ऐप को उस पीसी पर सभी संचारों की निगरानी और लॉग इन करने की स्थिति में नहीं रखेगा? वास्तव में, आपको अपने द्वारा प्राप्त डेटा को केंद्रीय रूप से समेकित करने में सक्षम होना चाहिए। –

+4

http://www.winpcap.org/misc/copyright.htm - मेरे लिए काफी पुनर्वितरण योग्य दिखता है, ग्रेग। –

उत्तर

5

। लेकिन चूंकि आपने पूछा है, कच्चे सॉकेट को सक्षम करने के लिए निम्नलिखित कोड के लिए नेटवर्क से पैकेट को छीनना संभव है।

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
s.Bind(new IPEndPoint(IPAddress.Parse("<IP Address Here of NIC to sniff>"), 0)); 
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1); 
byte[] inBytes = new byte[] { 1, 0, 0, 0 }; 
byte[] outBytes = new byte[] { 0, 0, 0, 0 }; 
s.IOControl(IOControlCode.ReceiveAll, inBytes, outBytes); 

एक बार ऐसा हो रहा है, आप Socket.Receive या Socket.BeginReceive का उपयोग कच्चे IP पैकेट को पढ़ने के लिए कर सकते हैं।

+0

हे क्रिस - मैंने अभी तक कच्चे सॉकेट में नहीं देखा है, हालांकि मैंने माइक्रोसॉफ्ट के बारे में कहानियों को अपने ओ/एस से कच्चे सॉकेट को हटाने के बारे में सुना है? सुनिश्चित नहीं है कि यह सच है या नहीं। मुझे लगता है कि यहां सामान्यीकृत प्रश्न यह है कि क्या आप उन पर भरोसा कर सकते हैं (और इसलिए यह कोड) एक्सपी, विस्ट्रा और विंडोज 7 में उपलब्ध है? इसके अलावा मुझे लगता है कि कच्चे सॉकेट का लाभ तब होता है जब आपको ड्राइवर को खुद लिखना नहीं पड़ता है? – Greg

+0

पीएस। क्रिस - गुगलिंग के बाद मुझे कच्चे सॉकेट का उपयोग करके पैकेट पढ़ने (लिखना नहीं) पठन मिल रहा है माइक्रोसॉफ्ट ने इसे जगह में छोड़ दिया होगा। क्या आपको WinPCap पर कच्चे सॉकेट का उपयोग करने के प्रो/कॉन के बारे में पता है? उदाहरण के लिए आपने क्यों उल्लेख किया कि आप व्यक्तिगत रूप से WinPCap में रहेंगे? धन्यवाद – Greg

+0

पीएस। क्रिस - गुगलिंग के बाद मुझे कच्चे सॉकेट का उपयोग करके पैकेट पढ़ने (लिखना नहीं) पठन मिल रहा है माइक्रोसॉफ्ट ने इसे जगह में छोड़ दिया होगा। क्या आपको WinPCap पर कच्चे सॉकेट का उपयोग करने के प्रो/कॉन के बारे में पता है? उदाहरण के लिए आपने क्यों उल्लेख किया कि आप व्यक्तिगत रूप से WinPCap में रहेंगे? धन्यवाद – Greg

6

मानक विंसॉक्स कार्यान्वयन का उपयोग करके .NET पर इनकमिंग/आउटगोइंग पैकेट को कैप्चर करने का एक तरीका है। मैंने उदाहरण के साथ एक ब्लॉग देखा है कि मेरे पास अब लिंक नहीं है।

लंबी कहानी छोटी, यह एक चरम किनारा मामला है क्योंकि यह नहीं है कि विंसॉक्स (मानक विंडोज नेटवर्किंग ड्राइवर) का इरादा क्या था।

कारण पैकेट को कैप्चर करने के लिए आम तौर पर आवश्यक है, यह अपने स्वयं के एनडीआईएस नेटवर्किंग ड्राइवर का उपयोग करता है जो आपके एनआईसी की पूर्ण क्षमताओं को अनलॉक करता है। इसके शीर्ष पर, यह निर्दिष्ट इंटरफ़ेस पर कैप्चर किए जा रहे पैकेट की मात्रा को सीमित करने के लिए फ़िल्टर सेट करने का एक आसान तरीका भी प्रदान करता है।

आईई, ड्राइवर उपयोगकर्ता के स्तर के बजाय कर्नेल स्तर पर किसी विशिष्ट प्रकार के पैकेट को अनदेखा कर देगा। इसलिए, आप पैकेट को अधिक कुशलता से फ़िल्टर करने और नेटवर्क पर बड़े लोड के तहत कैप्चर करने में सक्षम होंगे।

पैकेट फ़िल्टर करने के लिए .NET में, आपको अपनी खुद की एप्लिकेशन लेयर पैकेट फ़िल्टरिंग योजना प्रदान करने की आवश्यकता होगी जो बहुत कम कुशल होगा।

विंडोज ब्लॉक 'सुरक्षा कारणों' के लिए गैर मानक प्रोटोकॉल के लिए पहुंचने देता है ताकि वे वास्तव में नेटवर्किंग के लिए रॉ के पैकेट के उपयोग का समर्थन नहीं करते (भले ही कोड के लिए यह संभव बनाने के लिए मौजूद हो सकता है)। रॉ पैकेट हमेशा नए प्रोटोकॉल के डिजाइन की खोज के लिए लक्षित थे, सामान्य उपयोग नहीं।

उन सभी कारणों से आमतौर पर किसी भी प्रकार के कैप्चरिंग एप्लिकेशन को लागू करने के लिए अपनी विशिष्ट भाषा के लिए Winpcap और एक रैपर लेने का एक अच्छा विचार है।

नोट: मैं व्यक्तिगत रूप से शार्पपैप पसंद करता हूं, लेकिन मैं इस परियोजना पर विकास के रूप में भी पक्षपाती हूं। जब कैप्चरिंग की बात आती है तो Pcap.net इसके कार्यान्वयन में बहुत समान होता है, जब पैकेट को पार्स किया जाता है तो यह मुख्य रूप से अलग हो जाता है।