pcap 파일 구조 분석 예제


pcap 파일 구조 분석 예제

이번 글에서는 pcap 파일의 구조에 대해서 분석하면서, C언어를 이용하여 파일 구조를 출력하는 예제를 설명 드리도록 하겠습니다.
pcap 파일은 거의 업계 표준으로 Wireshark, TcpDump/WinDump, snort 등 많은 네트워크 툴에서 캡쳐된 네트워크 데이터를 저장하는데 사용됩니다.

라이브러리로 구현된 이름은 libpcap으로 윈도우로 포팅된 라이브러리의 경우는 winpcap으로 사용됩니다.
하지만 이번 글에서는 위의 라이브러리를 사용하지 않고, 직접 헤더파일을 이용하여 구조체를 구현하여 헤더파일을 분석해 보도록 하겠습니다.

원문 내용은 아래의 링크에서 확인 하실 수 있으며, 직접 구현된 소스코드는 아래의 git 명령어로 다운 받으실 수 있습니다.

https://wiki.wireshark.org/Development/LibpcapFileFormat

$ git clone https://hiseon.me/reps/pcap-basic-example.git

그리고 libpcap 라이브러리를 이용하여 직접 패킵을 캡쳐하는 예제는 아래의 글을 참고해 주시기 바랍니다.

libpcap 예제 기본 사용법

pcap  구조

pcap 파일의 포맷은 아래의 구조를 갖습니다.

[Global Header] | [Packet Header | Packet Data] | [Packet Header | Packet Data] | ..

파일의 첫 헤더로 [Global Header] 데이터가 오고, 그 다음에 캡쳐된 패킷의 개수 만큼 [Packet Header] 와 [Packet Ddata] 가 따라오는 간단한 구조입니다. 몇가지 아쉬운 단점이 존재하기는 하지만, 간단한 구조로 저장되기 때문에 가장 광범위하게 사용되는 이유 중 하나입니다.

1. Global Header

파일의 전체 정보를 나타나내는 구조체 입니다.

typedef struct pcap_hdr_s {
    uint32_t magic_number; /* magic number */
    uint16_t version_major; /* major version number */
    uint16_t version_minor; /* minor version number */
    int32_t thiszone; /* GMT to local correction */
    uint32_t sigfigs; /* accuracy of timestamps */
    uint32_t snaplen; /* max length of captured packets, in octets */
    uint32_t network; /* data link type */
} pcap_hdr_t;

magic_number: 파일포맷 자체와 바이트오더를 확인하기 위한 필드입니다.
version_major, version_minor: 파일 포맷의 버전을 나타냅니다. (현재 버전은 2.4 입니다.)
thiszone: 타임존과 관련된 정보를 저장합니다.
sigfigs: 플러그 정보가 저장되며, 대부분의 툴에서 0으로 설정되어 저장됩니다.
snaplen: 버퍼의 크기로 일반적으로 65535 값이 저장되지만, 더 클 수도 있고 사용자에 의해서 제한될 수 도 있습니다.
network: link-layer의 헤더 타입입니다.

2. Packet Header

패킷의 헤더를 나타내는 구조체입다.

typedef struct pcaprec_hdr_s {
    uint32_t ts_sec; /* timestamp seconds */
    uint32_t ts_usec; /* timestamp microseconds */
    uint32_t incl_len; /* number of octets of packet saved in file */
    uint32_t orig_len; /* actual length of packet */
} pcaprec_hdr_t;

위의 구조체 다음에 바로 incl_len 값의 크기만큼 패킷 데이터가 따라오게 됩니다.

ts_sec: 초단위로 저장된 유닉스타임스탬프의 값입니다.
ts_usec: 일반적인 pcap 파일의 경우 패킷이 캡쳐된 마이크로 초입니다.
incl_len: 실제 파일에 저장된 패킷 데이터의 실제 바이트 크기입니다. 패킷 헤더의 orig_len 또는 파일 헤더의 snaplen 보다 절대 커서는 안됩니다.
orig_len: 네트워크 상의 패킷의 바이트 크기입니다. 만약, incl_len과 orig_len의 크기가 다를 경우 실제 저장된 패킷의 크기는 snaplen 으로 제한됩니다.

구현
첨부해 드리는 소스코드는 실제 샘플 패킷의 내용을 읽어서, 해당 패킷 데이터를 출력하는 예제로, wireshark 와 동일한 데이터를 출력하고 있음을 알 수 있습니다.

본문 내용 인용시에는 출처를 밝혀 주시기 바랍니다.