패킷 분석을 하면서 가장 많이 듣는 단어중의 하나가 PCAP 이 아닐까 생각한다.
네트웍을 분석하다, 문제가 있다면 흔히 "그러면 PCAP 파일좀 전송해 달라고 한다"
PCAP 은 Packet Capture 의미로 네트워크 트래픽을 캡쳐하기 위한
API 로 구성이 되어 있다. 윈도우로 포팅되어 있는 것은 WinPcap 이며, 유닉스 환경에서는
libpcap 이다.
libpcap 과 winpcap 라이브러리를 이용하여 캡쳐된 패킷을 파일로 저장하거나,
저장된 패킷을 읽고 또는 다른 프로그램에서 라이브러리를 이용해 패킷파일을
분석/편집 등을 할 수 있다. 이를 이용한 대표적인 패킷 캡쳐 프로그램이 tcpdump 나
wireshark 이다.
자 그럼, 여기서 자주 다루고 있는 패킷파일의 내부를 깊게 살펴 보자.
패킷파일은 크게 다음과 같은 포맷 형태로 구성이 되어 있다.
PCAP 파일헤더 | 패킷 헤더 | 패킷 데이터 | 패킷 헤더 | 패킷 데이터 | 패킷 헤더 | 패킷 데이터 | ... | ...
제일 처음에 PCAP 포맷을 뜻하는 헤더가 오고 이후 각 패킷의 헤더와 데이터 정보가
쌓이게 된다. 헤더 구조체는 아래와 같으며,
struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone; /* gmt to local correction */
bpf_u_int32 sigfigs; /* accuracy of timestamps */
bpf_u_int32 snaplen; /* max length saved portion of each pkt */
bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */
};
매직넘버는 고정된 값으로 0xa1b2c3d4 이다. 버전 Major, Minor 는 패킷 파일 포맷 버전을
뜻하며, thiszone, sigfigs 는 시간과 관련한 것이고 snaplen 은 캡쳐된 패킷의 길이 network 은
데이터 링크 타입이다. 패킷 헤더 레코드는 아래와 같다.
typedef struct pcaprec_hdr_s {
guint32 ts_sec; /* timestamp seconds */
guint32 ts_usec; /* timestamp microseconds */
guint32 incl_len; /* number of octets of packet saved in file */
guint32 orig_len; /* actual length of packet */
} pcaprec_hdr_t;
좀더 쉽게 설명하기 위해 아래 예제 화면을 보자. 제일 처음에 패킷파일 헤더인 매직넘버가 나오고, 패킷 헤더 시작부분과 실제 패킷 데이터 시작 부분을 볼 수 있다. 캡쳐된 패킷의 길이가 66 bytes 나오는데 패킷 데이터 시작 전 4바이트는 실제 패킷의 길이다. 0x00000042 를 계산해보면 66 값을 얻을 수 있다. 단지 위 구조체에 값을 맞춰보기만 하면 된다.

[그림] PCAP 파일 포맷 형태 예제
이 헤더가 끝난 다음 에 또 패킷 헤더와 데이터가 붙으며 계속 이런 구조로 저장이 되는 것이다. 알고보면 구조는 상당히 간단한 형태로 구성이 되어 있다. 파일의 첫 4 바이트만 보아도 아 ~ 패킷 파일인가 보다 하고 추측해 볼 수 있을 것이다. 더불어 외우기도 쉽지 않은가요. 1234 와 ABCD :-)
글 잘보고있습니다.전 이부분이 왜 이해가 안될까요?ㅠㅠ
답글삭제@sylar - 2010/08/13 17:35
답글삭제생각보다 어렵지는 않습니다. 패킷파일 작은거 하나를 HEX 에디터로 열어 놓으시고, 와이어샤크를 통해서도 함께 보세요. 맨 처음의 매직넘버부터 해서 차례로 보신다면 충분히 이해가 되실것입니다. 값을 하나씩 매칭해서 보면 어렵지 않답니다. 화이팅 하세요 ! ^^