2012-04-11 12 views
4

Ich muss UDP-Pakete in eine Datei speichern und möchte das pcap-Format verwenden, um die verschiedenen verfügbaren Tools (wireshark, tcpdump, ...) wiederzuverwenden. Es gibt einige Informationen in this thread, aber ich kann nicht finden, wie man den globalen Dateiheader 'struct pcap_file_header' schreibt.Erstellen einer pcap-Datei

pcap_t* pd = pcap_open_dead(DLT_RAW, 65535); 
pcap_dumper_t* pdumper = pcap_dump_open(pd, filename); 

struct pcap_file_header file_hdr; 
file_hdr.magic_number = 0xa1b2c3d4; 
file_hdr.version_major = 2; 
file_hdr.version_minor = 4; 
file_hdr.thiszone = 0; 
file_hdr.sigfigs = 0; 
file_hdr.snaplen = 65535; 
file_hdr.linktype = 1; 

// How do I write file_hdr to m_pdumper? 

while((len = recvmsg(sd, &msg_hdr, 0)) > 0) 
    pcap_dump((u_char*)m_pdumper, &m_pcap_pkthdr, (const u_char*)&data); 

Wie soll ich den globalen Dateikopf schreiben? Wenn keine spezifische PCAP-Funktion verfügbar ist, wie kann ich den Dateideskriptor abrufen, um den Header mit write() einzufügen?

Antwort

3

Sie sollten diesen Header nicht schreiben müssen, pcap_open_dead sollte es für Sie tun. Sie müssen diesen Header nur ausfüllen und selbst schreiben, wenn Sie die Datei direkt schreiben möchten, anstatt pcap_dump und Freunde zu verwenden. Es gibt ein Beispiel here eines trivialen Programms, das eine pcap-Datei mit diesen Funktionen ausgibt.


ursprüngliche Antwort, über die Datei zu schreiben direkt:

ich nicht mehr genau erinnern kann, wie das funktioniert, aber ich schrieb vor einiger Zeit einen Patch redir, die Dateien schreiben pcap würden Sie kann es als Beispiel verwenden.

Sie können es an this debian bug angeschlossen finden. (Bug Link behoben.)

Ein Teil davon ist das Ethernet und IP-Header für Fälschen und nicht anwendbar sein, wie Sie verwenden pcap_dump_open und pcap_dump wo, wie der Patch oben aus der pcap Datei verknüpft schreibt, ohne Bibliotheken Aber ich werde das hier trotzdem lassen, falls es hilft.

+0

Danke, aber es sieht so aus, als ob Sie alles mit regulären Datei-Write() -Aufrufen gemacht haben. Ich benutze pcap_dump() und kann nicht herausfinden, wo ich den Dateideskriptor bekommen soll. –

+0

@RobertKubrick Aktualisiert oben. Ich habe die ursprüngliche Antwort verlassen, da selbst mit 'pcap_dump' noch ein IP-Header gefälscht werden muss, und der oben verlinkte Patch kann dabei helfen. – je4d

+0

True, keine Notwendigkeit, den globalen Dateiheader zu schreiben, habe ich gerade verifiziert. –