analysieren von IP-und TCP-header (vor allem gemeinsame tcp-header Optionen)der Pakete erfasst, die von libpcap
Will ich mit libpcap capture IP-Paket, und die möchte ich analysieren den IP-header und tcp-header.
`
gibt es IP-header und TCP-header-Strukturen in <netinet/ip.h>
und <netinet/tcp.h>
IP-header ist relativ einfach zu Parsen, aber für die TCP-header,da es tcp-Optionen
die gemeinsamen Optionen sind MSS, SACK(selective acknowledgement), timestamp, window scaling und NOP.
Möchte ich eine Funktion haben parse_pkt():
struct tcphdr tcp_hdr;
struct ip ip_hdr;
parse_pkt(u_char *pcap_packet, struct ip* p_ip, struct tcp* p_tcp);
also nach dem Aufruf der Funktion, wenn ich will, um zu wissen, die Quell-ip-Adresse, Sequenznummer und MSS,
scr_ip = ip_hdr.src_ip
seq = tcp_hdr.seq
mss = tcp_hdr.mss
gibt es ähnliche source-codes/snippets erfüllt meine Anforderungen?
danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Erstes Beispiel unten) Hier ist etwas, dass ich in der Werke (in C++11). Dies ist für UDP-Pakete, aber man könnte es anpassen, die für TCP-Pakete durch hinzufügen der zugehörigen struct, und
Net::load()
Vorlage wie die unten.(Das zweite Beispiel unten), die Sie nicht geben Sie eine Ziel-Sprache, in der Frage, aber wenn Sie auf der Suche nach C, dann könnten Sie
#pragma pack
auf die Strukturen und dann warf die pointer+offset als Zeiger auf die struct, und rufen Sie dann ntohs/ntohl auf die entsprechenden Felder. Tun, dass ist wohl die Schnellste Lösung, aber es stützt sich auf#pragma pack
, was nicht standard ist.C++11 Stil
net.h:
net.cpp:
Client-code in packet capture handler:
alternative (C-Stil):
(Sorry für eventuelle Fehler. Ich tippte aus dem Gedächtnis, und nicht versuchen, zu kompilieren oder ausführen-aber ich denke, Sie werden verstehen, die grundlegende Idee):
net.h:
client code im Paket-handler:
TCP-Header Hinweise
laut
netinet/tcp.h
, der TCP-header ist in etwa so:Laden diese Struktur in den Speicher, welche Methode Sie bevorzugen und vergessen Sie nicht, lösen in der Anordnung der Bytes (ntohs/ntohl) für multi-byte-integer-Typen wie oben.
Den TCP-Optionen Folgen, die nicht geladen werden kann in einer Struktur wie dieser. Siehe den Abschnitt über die TCP-Optionen in diesem link. Für die MSS, werden Sie wollen, um zu analysieren, jede option, bis Sie finden die option mit Art == 2. Aufbauend auf das C-Beispiel oben:
++opt
wird es +2 eigentlich.opt
ist ein Zeiger.opt++
inkrementiert den pointer undcontinue
beginnt die nächste iteration.tcp_option_t
ist 2 bytesopt
ist ein Zeiger und kein array oder iterator, so erwarte ich, dass++opt
erhöht die Speicheradresse um eins.++
auf einen Zeiger auf struct funktioniert wiep = p + 1
oderp = p + sizeof(pointer type)
. Wenn es funktioniert, wie die letztgenannten, dann danke für den catch.sizeof({type})
an die Adresse, sop = p + 1
fügtsizeof({type})
an die darin enthaltene Adresse inp
, und den aktuellen code in der Antwort ist richtig, daopt
ist vom Typ "Zeiger aufuint8_t
".*(opt + sizeof(opt))
holt ein byte, alsopt
ist vom Typ "Zeiger aufuint8_t
", so wird es nicht Holen, den vollen Wert der option. Darüber hinaus, das bedeutet auchsizeof(opt)
ist 1, nicht 2, damit es nicht zu überspringen, die option Länge. Also, was Sie wollen, istmss = ((*(opt + sizeof(_opt)))) << 8 + *(opt + sizeof(_opt) + 1)
, die Holen beide bytes von rechts-offsets und montieren Sie, auch wenn die Adresse inopt
ausgerichtet ist nicht sicher für ein 2-byte Holen.opt->_size
für die MSS-option ist 4, und, wenn nicht, ignorieren Sie die MSS-option oder einen Fehler melden und 2) stellen Sie sicher, dassopt->_size
mindestens 2 in alle in Fällen, in denen die option hat eine Größe (wenn es null ist, zum Beispiel, dass der code in eine Endlosschleife).opt + sizeof(_opt)
sollteopt + sizeof(*_opt)
, undsizeof(opt)
solltesizeof(*opt)
in meinem zweiten Kommentar oben - wir nicht wollen, dass die Größen von Zeigern, wir wollen, dass die Größen von dem, was Sie zeigen. Ich habe fest den code und fügte auch einige Makros, die angeben, was einige dieser Sequenzen des Codes tun.ntohs
oder gleichwertig Funktionen beim Lesen der einzelnen Felder, oder gibt es einen Haken, der?