Domanda

Vorrei catturare tutti i pacchetti HTTP in ingresso della mia macchina. Per fare questo sto usando SharpPcap che è un wrapper WinPcap.

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

Grazie

È stato utile?

Soluzione

SharpPcap è già in grado di catturare i pacchetti nello stesso modo in cui lo fa Wireshark (solo nel codice, piuttosto che una GUI). E è possibile analizzare direttamente oppure è possibile scaricare per l'unità nel formato comune di file .pcap.

La procedura per analizzare una cattura sono:

  • Pick un'interfaccia
  • Aprire una connessione in modalità promiscua
  • Avvia la cattura sia utilizzando un ciclo while o un callback evento
  • Analizzare il pacchetto prima al tipo che si desidera

Se stai leggendo file di dump .pcap il processo è quasi lo stesso, tranne che si chiama un lettore di cattura non in linea, non c'è bisogno di scegliere un'interfaccia, e non c'è bisogno di impostare la modalità promiscua. Tutti i filtri standard che Wireshark, tcpdump, e la maggior parte altre Pcap quadri uso sono supportati in SharpPcap. Per un riferimento a questi controllare l'uomo tcpdump.

Al momento non v'è alcun supporto per l'analisi HTTP direttamente, ma l'analisi di pacchetti TCP è davvero facile.

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

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

Il Packet.Net (un componente separato e inclusa di SharpPcap) parser è in grado di tirare fuori la porzione TCP direttamente anche se la comunicazione è incapsulato da VPN, PPPoE o PPP.

Una 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 utilizzano intestazioni HTTP UTF-8 o ASCII codifica a quel livello). Ci dovrebbero essere molti liberamente disponibili strumenti / librerie 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 sono frammentati (maggiore di 1500 byte) è necessario ri-assemblare 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é si sta lavorando con una parte molto più bassa della pila e ri-assemblare la connessione manualmente.

Wireshark ha un interessante articolo su come realizzare questo in C.

A partire da ora, SharpPcap non supporta TCP payload di 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 per SharpPcap su CodeProject .

Se avete altre domande e / o se si vuole fare qualsiasi richieste di funzionalità al progetto, non esitate a postare sul progetto SourceForge. E 'tutt'altro che morto e continua ad essere in fase di sviluppo attivo.

Nota: Chris Morgan è il leader del progetto e io sono uno degli sviluppatori per SharpPcap / Packet.Net.

Aggiornamento:. Il progetto tutorial su progetto di codice è ora up-to-date per abbinare l'API corrente

Altri suggerimenti

decodifica di un flusso TCP in coppie di richiesta / risposta HTTP non è banale. Strumenti come Wireshark fanno con notevole sforzo.

ho scritto un wrapper WireShark per Ruby (non che che vi aiuterà), ma prima ho scritto che ho provato ad utilizzare tshark (la versione da riga di comando di WireShark). Che non ha risolto il mio problema, ma può funzionare per voi. Ecco come:

È catturare i pacchetti e li scrivere in un file pcap (SharpPcap probabilmente ha un modo per fare questo). Ad un certo punto chiudere il file tappo e iniziare un altro, poi sul vecchio tshark una corsa con un filtro per il traffico HTTP, e un flag che indica che si vuole l'output nel formato PDML. Troverete questo è un formato XML, facilmente analizzato con gli strumenti System.Xml, che contiene il valore di ogni campo HTTP in una varietà di formati. È possibile scrivere codice C # per deporre le uova tshark, e tubo relativo flusso StdOut in un lettore di XML in modo da ottenere i pacchetti di tshark che emergono. Non consiglio usando il parser DOM come uscita PDML di un file di grandi dimensioni di cattura può impazzire molto rapidamente.

A meno che le vostre esigenze sono complesse (come le mie erano), questo può essere tutto ciò che serve.

Credo 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 su un possibile modo per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top