Raw Socket
-
Hey Leute,
hab mir einen kleinen Packet Sniffer zusammen gebastelt, mit dem ich via Raw Sockets TCP Packete lese.Nun würde ich jedoch gerne wissen welche Art diese Packete nutzen.
Also ist es ein Packet Typ : HTTP oder FTP etc....Kann mir da jemand helfen ?
-
Du liest die Daten aus und ratest anhand eines Parsers den Inhalt?!
MfG SideWinder
-
Ich hab ja das gesamte Packet gelesen (Buffer)
Und kann mir dann ja den Header Filtern...Ich bin nur gerade zu doof mir den rest des Packetes anzuzeigen...*grübel*
-
C-O-M-M-A-N-D-E-R schrieb:
Ich hab ja das gesamte Packet gelesen (Buffer)
Und kann mir dann ja den Header Filtern...Ich bin nur gerade zu doof mir den rest des Packetes anzuzeigen...*grübel*
Wo genau siehst du denn das Problem? Du hast ja den TCP-Header, also weisst du
auch, wo die Nutzdaten beginnen. Dann kannst ja nach dem HTTP-Header suchen.gruss
v R
-
richtig, und genau da steh ich gerade voll aufm Schlauch

wie mach ich das noch....ich bin manchmal ein dösel..

-
C-O-M-M-A-N-D-E-R schrieb:
richtig, und genau da steh ich gerade voll aufm Schlauch

wie mach ich das noch....ich bin manchmal ein dösel..

Du hast deinen Puffer als TCP-Packet, dann castest du es entsprechend:
tcphdr* tcph = static_cast<tcphdr*>(buffer);Nun kannst du auf die Elemente des TCP-Puffers zugreifen. Du kannst also auf
den Anfang der HTTP-Daten zugreifen, indem du den Datenoffset auf den Puffer
hinzuaddierst:char* http_data = buffer + tcph->th_off;Dann kannst du weitermachen.
gruss
v R
-
wo kommt denn das th_off her ?

-
C-O-M-M-A-N-D-E-R schrieb:
wo kommt denn das th_off her ?

Das ist ein Member von der Struktur tcphdr. Weiss nicht ob es die so unter
Windows auch gibt. Unter Unix ist sie in der tcp.h Datei definiert:http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet/tcp.h?rev=1.37;content-type=text%2Fplain
Du musst mal schauen, wie sie unter Windows definiert ist. Alternativ kannst
du natuerlich auch einfach die obige Struktur uebernehmen.gruss
v R
-
Also mein IP Header schaut so aus :
typedef struct iphdr { unsigned char VerIHL; unsigned char Tos; unsigned short Total_len; unsigned short ID; unsigned short Flags_and_Frags; unsigned char TTL; unsigned char Protocol; unsigned short Checksum; unsigned long SrcIP; unsigned long DstIP; //unsigned long Options_and_Padding; } IpHeader;
-
Achso, sag doch, dass du noch beim IP-Header bist ;).
Ja dann musst du halt erst den Puffer auf den IP-Header umbiegen und dann danach
auf den TCP-Header:IpHeader* ip_packet = static_cast<IpHeader*>(buffer); //header laenge steht im hiword tcphdr* tcp_packet = static_cast<tcphdr*>(buffer + (ip_packet->VerIHL >> 16)); char* http_data = buffer + tcp_packet->th_off;gruss
v R[edit]
bei big endian systemen steht die ip header laenge im loword, also dann
(ip_packet->VerIHL & 0xffff)
[/edit]
-
uff schwere geburt, aber ich glaub ich habs soeben auch hinbekommen

danke schonmal euch für die fixe hilfe