2010-08-15 9 views
10

BACKGROUND: Ora capisco come scrivere un'applicazione C# in grado di monitorare i pacchetti che entrano/escono dalla scheda di rete sul PC su cui è in esecuzione l'applicazione. L'approccio che conosco si basa su http://www.winpcap.org/ già installato sul PC e quindi utilizzo un wrapper C# come http://pcapdotnet.codeplex.com/ o http://sourceforge.net/projects/sharppcap/.C# - come annusare i pacchetti in un'app senza fare affidamento su WinPCap?

DOMANDA: La mia domanda tuttavia, che cosa dovrei fare per essere in grado di avere un'applicazione C# in grado di fiutare pacchetti che NON richiedono un'applicazione/driver di terze parti da preinstallare?

PRECISAZIONE: Cioè voglio veramente l'applicazione Al momento ho, ma senza alcun requisito per me di dire all'utente di dover andare e scaricare/installare XYZ prima di essere in grado di utilizzare l'applicazione. Ai fini della domanda, supponiamo che non sia consentito neanche automatizzare il download e l'installazione di un'applicazione/driver di terze parti. (Con WinPCap non sono sicuro se si può racchiudere, però credo che non dovresti in ogni caso purtroppo)

grazie

+2

Reimplementare la funzionalità di WinPCAP o Network Monitor di Microsoft in C#: problema risolto. Seriamente, però, il monitoraggio dei pacchetti è piuttosto complesso, quindi è necessario eseguire seriamente la codifica o affidarsi a un pacchetto di terze parti. –

+0

Interessante. Questo non metterebbe la tua app nella posizione di monitorare e registrare tutte le comunicazioni su quel PC? In effetti, dovresti essere in grado di consolidare centralmente i dati che acquisisci. –

+4

http://www.winpcap.org/misc/copyright.htm - Mi sembra abbastanza ridistribuibile, Greg. –

risposta

5

Personalmente avrei attenersi a WinPCap. Ma dal momento che hai chiesto, è possibile annusare i pacchetti dalla rete usando il seguente codice per abilitare i socket grezzi.

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); 

Una volta fatto questo, è possibile utilizzare Socket.Receive o Socket.BeginReceive di leggere i pacchetti IP grezzi.

+0

hey Chris - Non ho ancora esaminato le socket non elaborate, tuttavia ho sentito storie su Microsoft che rimuovevano socket grezzi dal loro O/S? Non sono sicuro se questo è vero o no. Immagino che la domanda generalizzata qui sia se puoi contare su di loro (e quindi su questo codice) essere disponibili tra XP, Vistra e Windows 7? Inoltre, suppongo che il vantaggio dei socket raw sia che non è necessario scrivere un driver da solo? – Greg

+0

PS. Chris - Dopo aver cercato su google sto ricevendo un'impressione leggendo (non scrivendo) pacchetti usando socket grezzi. Microsoft potrebbe averlo lasciato in posizione. Ti capita di sapere i pro/contro di usare socket grezzi su WinPCap? Ad esempio, perché hai accennato che ti saresti incollato personalmente su WinPCap? grazie – Greg

+0

PS. Chris - Dopo aver cercato su google sto ricevendo un'impressione leggendo (non scrivendo) pacchetti usando socket grezzi. Microsoft potrebbe averlo lasciato in posizione. Ti capita di sapere i pro/contro di usare socket grezzi su WinPCap? Ad esempio, perché hai accennato che ti saresti incollato personalmente su WinPCap? grazie – Greg

6

C'è un modo per acquisire pacchetti in entrata/in uscita su .NET usando solo l'implementazione standard di winsocks. Ho visto un blog con un esempio di come, ma non ho più il collegamento.

Per farla breve, si tratta di un caso limite estremo perché non è quello per cui è stato progettato WinSocks (il driver di rete standard di Windows).

Il motivo per cui Pcap è solitamente necessario per acquisire i pacchetti è che utilizza il proprio driver di rete NDIS che sblocca tutte le funzionalità della scheda NIC. Inoltre, fornisce anche un modo semplice per impostare i filtri per limitare la quantità di pacchetti catturati nell'interfaccia specificata.

IE, il driver ignorerà i pacchetti di un tipo specifico a livello di kernel invece del livello usermode. Pertanto, sarete in grado di filtrare i pacchetti in modo molto più efficiente e catturare con carichi più grandi sulla rete.

In .NET, per filtrare i pacchetti, è necessario fornire il proprio schema di filtraggio dei pacchetti del livello dell'applicazione che sarebbe molto meno efficiente.

Windows blocca l'accesso a protocolli non standard per 'motivi di sicurezza' in modo che in realtà non supportano l'utilizzo di pacchetti RAW per il networking (anche se il codice può esistere per renderlo possibile). I pacchetti RAW sono sempre stati pensati per la ricerca di nuovi protocolli, non per uso generale.

Per tutti questi motivi è di solito una buona idea raccogliere Winpcap e un wrapper per la lingua specifica per implementare qualsiasi tipo di applicazione di acquisizione.

Nota: Personalmente preferisco SharpPcap, ma sono anche prevenuto mentre eseguo lo sviluppo del progetto. Pcap.net è molto simile nella sua implementazione quando si tratta di catturare, si discosta principalmente quando si tratta di come i pacchetti vengono analizzati.