2012-04-11 3 views
4

UDP 패킷을 파일에 저장해야하며 사용할 수있는 다양한 도구 (wireshark, tcpdump, ...)를 다시 사용하기 위해 pcap 형식을 사용하고 싶습니다. this thread에 몇 가지 정보가 있지만 전역 파일 헤더 'struct pcap_file_header'를 작성하는 방법을 찾을 수 없습니다.pcap 파일 만들기

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()를 사용하여 헤더를 삽입 할 파일 디스크립터를 검색 할 수 있습니까?

답변

3

pcap_open_dead 헤더를 작성하지 않아도됩니다. pcap_dump 및 친구 대신 파일을 직접 쓰려면이 헤더를 직접 작성하고 작성해야합니다. 사소한 프로그램의 예로 here이 그러한 기능을 가진 pcap 파일을 작성합니다.


원래의 대답, 직접 파일 작성에 관하여 :이 작품,하지만 난 PCAP 파일을 작성합니다 그 얼마 전에 redir에 패치를 썼다 정확히 어떻게 기억할 수

을, 당신 예를 들어 그것을 사용할 수 있습니다.

this debian bug에 첨부 된 것을 찾을 수 있습니다.

그것의 일부는 이더넷 및 IP 헤더를 날조입니다 (버그 링크. 고정), 당신은 pcap_dump_open 위 링크 된 패치는 라이브러리를 사용하지 않고 pcap 파일에서 기록으로 pcap_dump를 사용으로 적용되지 않을 수도 있습니다 ,하지만 도움이 될 수 있도록 여기에 남겨 두겠습니다.

+0

감사합니다.하지만 일반 파일 write() 호출을 사용하여 모든 작업을 수행 한 것처럼 보입니다. pcap_dump()를 사용하고 있으며 파일 설명자를 가져올 위치를 파악할 수 없습니다. –

+0

@RobertKubrick 위에 업데이트되었습니다. 나는 원래의 대답을 남겨 두었습니다. 왜냐하면'pcap_dump'를 사용해도 여전히 IP 헤더를 가짜로 만들 필요가 있습니다. 그리고 위에 링크 된 패치가 도움이 될 수 있습니다. – je4d

+0

사실, 글로벌 파일 헤더를 쓸 필요가 없습니다. 그냥 확인했습니다. –