Создание pcap-файла

Мне нужно сохранить пакеты UDP в файл, и я хотел бы использовать формат pcap для повторного использования различных доступных инструментов (wireshark, tcpdump, ...). В этой теме есть некоторая информация, но я не могу найти, как для записи глобального заголовка файла «struct pcap_file_header».

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);

Как мне написать глобальный заголовок файла? Если нет доступной конкретной функции pcap, как я могу получить дескриптор файла для вставки заголовка с помощью write()?


person Robert Kubrick    schedule 11.04.2012    source источник


Ответы (2)


Вам не нужно писать этот заголовок, pcap_open_dead сделает это за вас. Вам нужно только заполнить и написать этот заголовок самостоятельно, если вы хотите написать файл напрямую, а не использовать pcap_dump и друзей. здесь есть пример простой программы, записывающей файл pcap с этими функциями.


исходный ответ, касающийся записи файла напрямую:

Я не могу точно вспомнить, как это работает, но некоторое время назад я написал патч для redir, который записывает файлы pcap, вы можете использовать его в качестве примера.

Вы можете найти его прикрепленным к этой ошибке Debian. (исправлена ​​ошибка ссылки).

Некоторые из них предназначены для подделки заголовков ethernet и IP и могут быть неприменимы, поскольку вы используете pcap_dump_open и pcap_dump, где указанный выше патч записывает файл pcap без использования каких-либо библиотек, но я все равно оставлю это здесь. случае помогает.

person je4d    schedule 11.04.2012
comment
Спасибо, но похоже, что вы все сделали, используя обычные вызовы file write(). Я использую pcap_dump() и не могу понять, где взять дескриптор файла. - person Robert Kubrick; 12.04.2012
comment
@RobertKubrick Обновлено выше. Я оставил исходный ответ, так как даже с pcap_dump вам все равно нужно будет подделать заголовок IP, и патч, указанный выше, может помочь в этом. - person je4d; 12.04.2012
comment
Правда глобальный заголовок файла писать не надо, я только что проверил. - person Robert Kubrick; 12.04.2012
comment
используйте pcap_fileno(), чтобы получить дескриптор файла из pcap_t*. Однако вы можете вызвать pcap_dump() напрямую для записи пакетов в pcap_t. - person nos; 25.10.2012

Если вас интересуют только UDP и TCP, вы должны использовать DLT_EN10MB вместо DLT_RAW ( cf pcap_open_dead для имитации полного захвата UDP-пакетов ).

Это намного лучше при редактировании в WireShak.

person poukill    schedule 12.08.2015