[C 프로젝트] 패킷 분석기 Part 1. 프로젝트 소개 및 포인터 가지고 놀기

프로젝트에서 사용할 PCAP 파일 다운로드 (PCAP 파일이면 다른 파일도 관계 없어요.)

 안녕하세요. 언제나 휴일에 언휴입니다.

 이번 강의는 “패킷 분석기 Part 1″입니다. 다루는 내용은 앞으로 만들 프로젝트가 무엇인지 소개입니다. 그리고 프로젝트에서 자주 표현하는 구조체와 char 배열(char 포인터) 사이의 형식 변환 방법을 다루고 있어요.패킷 분석기 프로젝트

프로젝트 소개

 네트워크 보안 기술을 익히기 위해서 패킷을 수집하고 패킷을 분석하는 일은 기본적일 수 있어요. 이러한 기술을 익히기 위해 사용하는 도구 중에 와이어샤크가 있습니다.  

 와이어샤크는 실시간으로 패킷을 수집하는 기능도 제공하지만 이미 패킷을 수집한 파일을 로딩하여 패킷을 분석할 수 있는 기능도 있습니다. 이번 프로젝트에서는 이미 패킷을 수집한 파일을 로딩하여 패킷을 분석하는 프로그램을 만드는 것입니다.

  • 수집한 패킷 파일의 내용을 분석하기

와이어 샤크와 패킷 분석

개발 순서

 이번 프로젝트에서는 분석할 파일은 패킷을 수집한 파일인 PCAP 파일입니다. 이를 분석하기 위해 제일 먼저 PCAP 파일 구조를 분석합니다. 그리고 프로토콜을 하위 계층부터 분석할 거예요. 여기에서는 ethernet, IPv4, ARP, ICMPv4, TCP 프로토콜을 분석합니다.

  1. PCAP 파일 구조 분석하기
  2. ethernet 프로토콜 분석하기
  3. IPv4 프로토콜 분석하기
  4. ARP 프로토콜 분석하기
  5. ICMPv4 프로토콜 분석하기
  6. TCP 프로토콜 분석하기

포인터 가지고 놀기

 앞으로 진행할 프로젝트에서는 패킷의 위치를 unsigned char *로 전달하고 이를 분석할 프로토콜에 맞게 정의한 구조체로 형식 변환하여 사용합니다.  

 이를 위해 필요한 포인터 형식으로 형식 변환하는 부분을 간략하게 알아볼게요.

#include <stdio.h>
#include <stdlib.>
typedef struct _Data Data;
struct _Data
{
	int a;
	char b[4];
	int c;
};
#define BUF2DATA(buf) ((Data *)buf)

char buffer[4096];

void SendData()
{
	Data data = { 4,"um",27 };
	Data *pdata = BUF2DATA(buffer);
	*pdata = data;
}
void RecvData()
{
	Data *pdata = BUF2DATA(buffer);
	printf("%d %s %d\n", pdata->a, pdata->b, pdata->c);
}
int main()
{	
	SendData();
	RecvData();
	system("pause");
	return 0;
}

 코드를 보면 SendData 함수에서는 Data 구조체 형식 변수를 char 배열인 buffer에 기록합니다. 이를 위해 buffer를 Data 포인터 형식 변수로 CASTING(형식 변환)한 후에 간접 연산으로 값을 설정하고 있어요.

char buffer[4096];
void SendData()
{
	Data data = { 4,"um",27 };
	Data *pdata = BUF2DATA(buffer);
	*pdata = data;
}

 그리고 RecvData에서는 buffer에 있는 내용을 확인하기 위해 buffer를 Data 포인터 형식 변수로 CASTING하고 있습니다. 그리고 값을 확인하고 있어요.

void RecvData()
{
	Data *pdata = BUF2DATA(buffer);
	printf("%d %s %d\n", pdata->a, pdata->b, pdata->c);
}

 이상으로 “패킷 분석기 Part 1” 강의를 마칠게요.