Wenn von „kapern“ Sie meinten, die Pakete schnüffeln dann, was Sie sollten es mit WinPcap zu tun tun, ist die folgende:
Finden Sie das Gerät, das Sie verwenden möchten - See WinPcap tutorial.
Öffnen Sie ein Gerät pcap_open
// Open the device
char errorBuffer[PCAP_ERRBUF_SIZE];
pcap_t *pcapDescriptor = pcap_open(source, // name of the device
snapshotLength, // portion of the packet to capture
// 65536 guarantees that the whole packet will be captured on all the link layers
attributes, // 0 for no flags, 1 for promiscuous
readTimeout, // read timeout
NULL, // authentication on the remote machine
errorBuffer); // error buffer
Verwendung mit einer Funktion, die Pakete aus dem Descriptor liest sich wie pcap_loop
int result = pcap_loop(pcapDescriptor, count, functionPointer, NULL);
Diese Schleife wird bis etwas falsch geschehen ist oder die Schleife war gebrochen mit ein spezieller Methodenaufruf Es ruft den functionPointer für jedes Paket auf.
In der Funktion zeigte etwas implementieren, die die Pakete analysiert, es wie ein pcap_handler
aussehen sollte:
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
const u_char *);
Alles was Sie jetzt verlassen haben, ist die Pakete zu analysieren, die ihre Puffer in der const u_char*
ist und ihre Länge ist in der pcap_pkthdr
Struktur caplen
Feld.
Angenommen, Sie haben HTTP GET über TCP über IPv4 over Ethernet-Pakete können Sie:
- Überspringen 14 Bytes der Ethernet-Header.
- Überspringen Sie 20 Bytes des IPv4-Headers (vorausgesetzt, es gibt keine IPv4-Optionen, wenn Sie vermuten, dass IPv4-Optionen möglich sind, können Sie die 5-8 Bits des IPv4-Headers lesen, multiplizieren Sie diese mit 4 und dies wäre die Zahl von Bytes der IPv4-Header dauert).
- Überspringen Sie 20 Bytes des TCP-Headers (vorausgesetzt, es gibt keine TCP-Optionen, wenn Sie vermuten, dass TCP-Optionen möglich sind, können Sie die 96-99 Bits des TCP-Headers lesen, multiplizieren Sie diese mit 4 und dies wäre die Zahl von Bytes, die der TCP-Header benötigt).
Der Rest des Pakets sollte der HTTP-Text sein. Der Text zwischen dem ersten und zweiten Leerzeichen sollte der URI sein. Wenn es zu lang ist, müssen Sie möglicherweise eine TCP-Rekonstruktion durchführen, aber die meisten URIs sind klein genug, um in ein Paket zu passen.
UPDATE: Im Code dies so aussehen würde (ich es geschrieben habe, ohne es zu testen):
int tcp_len, url_length;
uchar *url, *end_url, *final_url, *tcp_payload;
... /* code in http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html */
/* retireve the position of the tcp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
/* retireve the position of the tcp payload */
tcp_len = (((uchar*)ih)[ip_len + 12] >> 4) * 4;
tcpPayload = (uchar*)ih + ip_len + tcp_len;
/* start of url - skip "GET " */
url = tcpPayload + 4;
/* length of url - lookfor space */
end_url = strchr((char*)url, ' ');
url_length = end_url - url;
/* copy the url to a null terminated c string */
final_url = (uchar*)malloc(url_length + 1);
strncpy((char*)final_url, (char*)url, url_length);
final_url[url_length] = '\0';
Sie auch nur HTTP-Datenverkehr durch die Verwendung Erstellen und Einstellen filtern BPF. See WinPcap tutorial. Sie sollten wahrscheinlich den Filter "tcp and dst port 80"
verwenden, der Ihnen nur die Anforderung geben würde, die Ihr Computer an den Server sendet.
Wenn es Ihnen nichts ausmacht, C# zu verwenden, können Sie versuchen, Pcap.Net zu verwenden, was all das viel einfacher für Sie tun würde, einschließlich der Analyse der Ethernet-, IPv4- und TCP-Teile des Pakets.
Sie brauchen dazu keine Software zu schreiben. Verwende einen [proxy] (http://www.squid-cache.org/), der [logging] hat (http://www.squid-cache.org/Doc/config/access_log/). –
Beachten Sie, dass die Antworten Ihnen erlauben, die URLs zu loggen oder zu überwachen, aber sicherlich nicht kaputt gehen: "Softwareeinstellungen ohne Wissen des Benutzers ändern, um diesen Benutzer zum Besuch einer bestimmten Website zu zwingen" (wiktionary). Vielleicht haben Sie den Begriff missbraucht oder einen anderen gemeint. –
Sorry, Matt zu bestreiten, aber Tintenfisch tatsächlich "entführt". Damit meine ich, dass Sie eine andere URL für die Eingabe durch den Benutzer eingeben können (wenn Sie das als Programmierer machen möchten). Die Hauptfunktion ist, Dinge zu cachen, aber es kann mehr als, wenn Sie es wünschen. – Hotei