2009-12-07 10 views
7

Vorrei acquisire tutti i pacchetti HTTP in ingresso della mia macchina. Per farlo uso SharpPcap, che è un wrapper WinPcap.Come acquisire pacchetti HTTP con SharpPcap

SharpPcap funziona molto bene ma cattura i pacchetti TCP e questo è troppo basso per fare quello che voglio. Qualcuno sa come posso ottenere facilmente richieste/risposte HTTP complete da tutti questi pacchetti TCP?

Grazie

risposta

8

SharpPcap è già in grado di acquisire i pacchetti nello stesso modo in cui fa wireshark (solo in codice anziché in una GUI). E puoi analizzarli direttamente oppure puoi scaricarli nell'unità nel comune formato di file .pcap.

La procedura per analizzare una cattura sono:

  • Scegli un'interfaccia
  • aprire una connessione in modalità promiscua
  • Inizio catturare sia utilizzando un ciclo while o un callback evento
  • analizzare il grezzo pacchetto al tipo che vuoi

Se stai leggendo i file .pcap dump il processo è quasi lo stesso Se si chiama un lettore di acquisizione offline, non è necessario selezionare un'interfaccia e non è necessario impostare la modalità promiscua. Tutti i filtri standard utilizzati da wireshark, tcpdump e molti altri framework Pcap sono supportati in SharpPcap. Per un riferimento a questi controlli l'uomo tcpdump.

Attualmente non è supportato l'analisi diretta di HTTP ma l'analisi dei pacchetti TCP è davvero semplice.

Quando si riceve il pacchetto crudo (non analizzato) fare questo:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket); 

il pacchetto.Il parser Net (Un componente separato e incluso di SharpPcap) è in grado di estrarre direttamente la porzione TCP anche se la comunicazione è incapsulata da VPN, PPoE o PPP.

volta che hai la TCPPacket analizzato basta afferrare packet.PayloadBytes per il carico utile in un array di byte che dovrebbe contenere l'header HTTP in byte prime che possono essere convertiti nel formato testo vero e proprio (Io non sono davvero sicuro se intestazioni HTTP usa la codifica UTF-8 o ASCII a quel livello). Ci dovrebbero essere un sacco di strumenti/librerie disponibili liberamente per analizzare le intestazioni HTTP.


Per estrarre il pacchetto HTTP da TCP:

È necessario raccogliere i pacchetti TCP del collegamento così come arrivano e se i dati è frammentato (superiore a 1500 byte) è necessario riassemblare le parti in memoria. Per scoprire quali parti vanno in quale ordine è necessario monitorare con attenzione i numeri di sequenza/riconoscimento.

Questa è una cosa non banale da realizzare con SharpPcap perché stai lavorando con una parte molto più bassa dello stack e riassemblando la connessione manualmente.

Wireshark ha un interessante articolo su come ottenere questo risultato in C.

A partire da ora, SharpPcap non supporta TCP payload analisi.


Se siete alla ricerca di facili da seguire esempi di come utilizzare SharpPcap scaricare l'albero dei sorgenti e guardare l'esempio progetti inclusi. C'è anche un tutorial for SharpPcap on codeproject.

Se avete altre domande e/o volete fare richieste di funzionalità al progetto, sentitevi liberi di postare sul progetto SourceForge. È tutt'altro che morto e continua a essere in fase di sviluppo attivo.

Nota: Chris Morgan è il capo del progetto e sono uno degli sviluppatori di SharpPcap/Packet.Net.

Aggiornamento: il progetto di esercitazione sul progetto di codice è ora aggiornato per corrispondere all'API corrente.

+0

'GetEncapsulated' è uguale a' Packet.ParsePacket (e.Packet.LinkLayerType, e.Packet.Data); 'giusto? – C4u

0

penso che vi sono vicino alla soluzione: se avete i pacchetti TCP dal traffico HTTP, devi solo estrarre il payload TCP al fine di ricostruire la richiesta/risposta HTTP. Vedere questo SO entry su un modo possibile per farlo.

2

Decodificare un flusso TCP in coppie di richieste/risposte HTTP non è banale. Strumenti come WireShark fanno questo con notevole sforzo.

Ho scritto un wrapper WireShark per Ruby (non quello che ti aiuterà), ma prima di scriverlo ho provato a usare tshark (la versione da riga di comando di WireShark). Questo non ha risolto il mio problema ma potrebbe funzionare per te. Ecco come:

Catturate i pacchetti e li scrivete in un file pcap (SharpPcap probabilmente ha un modo per farlo). A un certo punto, chiudere il file cap e avviarne un altro, quindi sul vecchio eseguire tshark con un filtro per il traffico HTTP e un flag che indica che si desidera l'output nel formato PDML. Questo è un formato XML, facilmente analizzabile con gli strumenti System.Xml, che contiene il valore di ogni campo HTTP in una varietà di formati. È possibile scrivere codice C# per generare tshark e reindirizzare il flusso StdOut in un lettore XML in modo da estrarre i pacchetti da tshark non appena emergono. Non è consigliabile utilizzare il parser DOM in quanto l'output PDML per un file di acquisizione di grandi dimensioni può diventare folle molto rapidamente.

A meno che le vostre esigenze siano complesse (come le mie), questo potrebbe essere tutto ciò di cui avete bisogno.

+0

Interessante, è la PDML un formato standard noto o un'applicazione specifica una sola volta. Il cap in SharpPcap può essere fatto in due modi: per il traffico basso/moderato è possibile catturare/analizzare pacchetti in diretta; per le catture ad alto traffico (come un trasferimento ftp) l'opzione migliore è quella di scaricare il cappuccio grezzo in file .pcap e postprocess dopo. SharpPcap è fondamentalmente solo un framework multipiattaforma per la creazione di acquisizioni wirehark in applicazioni C#. In questo momento SharpPcap è il wrapper pcap e Packet.Net è la libreria parser. –

+0

Avete il codice postato da qualche parte (ex GitHub). Se è così, mi piacerebbe dare un'occhiata a questo punto. Mi piacerebbe vedere quanto codice/sforzo ci sono voluti per gestire il passo di riassemblaggio TCP. –

+0

Non so se PDML è uno standard o qualcosa di specifico per wireshark; in ogni caso è facile da elaborare. – anelson

Problemi correlati