2016-06-05 14 views
0

Ich schreibe ein Kernel-Modul in C und versuche, das Host-Feld aus der Payload eines TCP-Pakets zu holen, die HTTP-Request-Header enthält. Ich habe es geschafft, etwas Ähnliches mit FTP zu tun (scanne die Payload und suche nach FTP-Befehlen), aber ich kann nicht in der Lage sein, das gleiche zu tun und das Feld zu finden.Host-Feld aus TCP-Paket-Payload holen

Mein Modul ist mit dem POST_ROUTING-Hook verbunden. Jedes Paket, das an diesen Hook geht, wird, wenn es einen dst-Port von 80 hat, als HTTP-Paket erkannt, und mein Modul beginnt damit, es zu parsen.
aus irgendeinem Grund kann ich nicht in der Lage sein scheinen, die HOST Linie zu bekommen (in der Tat, ich sehe nur den HTTP-Server 200 ok)

sind diese Header auf die Pakete gehen immer die 80-Port verwenden? Wenn ja, was ist der beste Weg, die Nutzdaten dieses Pakets zu parsen? Es scheint, als würde Char Char Char viel Arbeit bedeuten. Gibt es einen besseren Weg?

Dank

EDIT: einige Fortschritte erhielt. jedes Paket bekomme ich vom Server, ich kann die Nutzlast ohne Probleme lesen. aber jedes Paket, das ich sende - es ist als ob die Nutzlast leer ist.

Ich dachte, es ist ein Problem von skb Zeiger, aber ich bekomme die TCP-Ports in Ordnung. kann einfach nicht diese verdammte Nutzlast lesen. das ist, wie ich es analysieren:

unsigned char* user_data = (unsigned char *)((int)tcphd + (int)(tcphd->doff * 4)); 
unsigned char *it; 
for (it = user_data; it != tail; ++it) { 
    unsigned char c = *(unsigned char *)it; 

    http_command[http_command_index] = c; 
    http_command_index++; 
} 

wo Schwanz:

tail = skb_tail_pointer(skb); 

Der Zeiger haupt nicht auf der Schleife nicht vorantreiben. es ist, als ob es von Anfang an leer ist oder so, und ich kann nicht verstehen warum. Hilfe, bitte.

+0

Was sagt Dir Wireshark? – alk

+0

'HTTP 200 ok' gehen zu Port 80? "Ja wirklich?" – alk

+0

Ich habe es geschafft, die Pakete mit Wireshark zu sehen. und HTTP 200 war nicht auf Port 80, aber der Port, den ich verwendet habe, um die TCP-Verbindung zu erstellen. jetzt kann ich das Paket sehen, kann es aber immer noch nicht analysieren. – TzurEl

Antwort

0

Ich habe es geschafft, dies zu lösen.

mit this , ich habe herausgefunden, wie alle Nutzdaten des Pakets analysieren. Ich hoffe, dass dieser Code erklärt es

int http_command_offset = iphd->ihl*4 + tcphd->doff*4; 
int http_command_length = skb->len - http_command_offset; 
http_command = kmalloc(http_command_length + 1, GFP_ATOMIC); 
skb_copy_bits(skb, http_command_offset , (void*)http_command, http_command_length); 

skb_cop_bits, nur kopiert die Nutzlast vollständig in den Puffer i erstellt haben. es jetzt zu analysieren ist ziemlich einfach.