3. 패킷 분석기 예광탄 - ethernet 프로토콜 스택 분석
안녕하세요. 언제나 휴일, 언휴예요.
이전 게시글에서는 네트워크 트래픽을 수집한 pcap 파일을 로딩하여 패킷 별로 패킷 번호와 바이트 수를 콘솔 화면에 출력하는 프로그램을 만들어 보았어요.
이번 게시글에서는 이전 실습 내용에 ethernet 프로토콜 스택을 분석하여 정보를 출력하는 프로그램을 만드는 실습을 할 거예요.
이를 위해 이더넷 프로토콜 스택의 구조를 이해해야겠죠. 자세한 내용은 다음 게시글을 참고하세요.
다음은 이번 실습할 프로그램을 실행했을 때의 실행 화면입니다. 빨간 색으로 테두리 한 부분이 이전 프로그램에서 바뀐 부분이예요.
여기에서는 수정한 부분과 추가한 부분만 설명하기로 할게요.
먼저 수정한 부분입니다.
예광탄 프로그램에서 분석할 pcap 파일에 많은 패킷이 있을 때 분석 앞 부분이 스크롤 범위를 벗어나서 편의상 예광탄에서 분석할 수 있는 패킷 수의 최대를 30으로 설정할게요.
#define MAX_PACKET 30
다음은 함수 중간에 추가한 내용이 있는 부분이예요.
void ParsingEthernet(FILE *fp)
{
char buf[65536];
pcap_header *ph = headers;//ph를 패킷 헤더의 시작 위치로 초기화
int i = 0;
while (feof(fp) == 0) //파일의 끝이 아니면 반복
{
if (fread(ph, sizeof(pcap_header), 1, fp) != 1)//패킷 헤더 읽기를 실패하면
{
break;//루프 탈출
}
예광탄 프로그램에서 분석할 pcap 파일에 많은 패킷이 있을 때 분석 앞 부분이 스크롤 범위를 벗어나서 편의상 예광탄에서 분석할 수 있게 설정한 패킷 수에 도달하면 분석을 멈추게 수정하였습니다.
*추가한 내용 시작 *
if (pcnt == MAX_PACKET) //예광탄에서 분석할 수 있게 설정한 패킷 수에 도달
{
break;//루프 탈출
}
*추가한 내용 끝 *
ViewPacketHeader(ph); //패킷 헤더 정보 출력
fread(buf, 1, ph->caplen, fp); //패킷 읽기
ViewEthernet(buf); //이더넷 정보 출력
ph++;//ph를 다음 위치로 이동
}
}
이제 새로 추가한 부분을 살펴보기로 해요. 먼저 ethernet 프로토콜 스택 구조에 맞게 구조체를 정의합시다. ethernet 프로토콜 스택 헤더는 목적지 MAC 주소(6바이트)와 발신지 MAC 주소(6바이트)와 프로토콜 타입(2바이트)로 구성합니다.
#define MAC_ADDR_LEN 6
typedef struct _ethernet
{
unsigned char dest_mac[MAC_ADDR_LEN];
unsigned char src_mac[MAC_ADDR_LEN];
unsigned short type;
}ethernet;
MAC 주소는 일반적으로 A:B:C:D:E:F 와 같은 형태로 출력합니다. 패킷의 MAC 주소 부분을 일반적인 형태로 출력하는 기능을 구현합시다.
void ViewMac(unsigned char *mac);
여기에서는 소켓 라이브러리도 사용하지 않고 순수한 C로 작성할 거예요. network byte order의 패킷 정보를 host byte order로 변환하는 함수도 정의하기로 합시다.
unsigned short ntohs(unsigned short value);
이번 프로그래밍 실습에서는 IP 프로토콜 스택이나 ARP 프로토콜 스택 정보를 분석하지는 않습니다. 다음 게시글에서 ARP 프로토콜을 분석하는 부분을 실습하고 이어서 IP 프로토콜 스택을 분석하는 실습을 할 거예요. 여기에서는 빈 상태의 함수로 만들기로 해요.
void ViewIP(char *buf);
void ViewARP(char *buf);
void ViewEthernet(char *buf)
{
이 부분은 이전 프로젝트에서 to be defined 주석만 쓰고 빈 함수로 정의했던 부분이죠. 이번 실습에 핵심 부분이죠.
ethernet *ph = (ethernet *)buf; //패킷 버퍼를 ethernet 구조체 포인터로 형 변환
먼저 이더넷 헤더 정보임을 출력합시다.
printf("===========ETHERNET Header==============\n");
목적지 MAC 주소를 출력하세요.
printf("dest mac:0x");
ViewMac(ph->dest_mac);//MAC 주소 출력
발신지 MAC 주소를 출력하세요.
printf(" src mac:0x");
ViewMac(ph->src_mac);//MAC 주소 출력
프로토콜 타입을 HEXA 값으로 출력합니다. 이 부분은 2바이트 정보이며 패킷은 network byte order로 있는 부분이므로 host byte order로 변환하여 출력하세요.
printf(" type:%#x\n", ntohs(ph->type));
//Link 타입을 출력(2바이트 이상데이터는 network byte order -> host byte order 로 변환해야 함
그리고 프로토콜 타입에 따라 분석하여 출력하는 함수를 호출합니다. 여기에서는 IPv4와 ARP 프로토콜만 분석할 거예요. 물론 이번 게시글에는 비어있는 함수로 작성하고 이후 게시글에서 작성할 부분이죠.
switch (ntohs(ph->type))
{
case 0x800:ViewIP(buf + sizeof(ethernet)); /*IP 정보 출력 */ break;
case 0x806:ViewARP(buf + sizeof(ethernet)); /*ARP 정보 출력*/ break;
default:printf("Not support Protocol\n"); break;
}
}
MAC 주소를 일반적인 형태인 A:B:C:D:E:F 형태로 출력할 수 있게 기능을 구현하세요.
void ViewMac(unsigned char *mac)
{
int i;
for (i = 0;i < MAC_ADDR_LEN; ++i)
{
printf("%02x ", mac[i]);
}
}
network byte order의 2바이트 데이터를 host byte order의 데이터로 변환하는 함수를 만듭시다. 예광탄에서는 편의상 hot byte order가 little endian이라는 가정 하에 구현할게요.
unsigned short ntohs(unsigned short value)
{
return(value << 8) | (value >> 8);//상위 바이트와 하위바이트 위치 교환
}
IPv4와 ARP 프로토콜 스택을 분석하고 출력하는 함수는 to be defined로 남겨두세요.
void ViewIP(char *buf)
{
//to be defined
}
void ViewARP(char *buf)
{
//to be defined
}
이제 실행해 보시고 잘못 작성한 부분을 수정해 보세요.
그럼 다음에 봐요.
모두 행복한 하루~
실습에 사용할 pcap 파일(다른 pcap 파일을 사용하셔도 무관합니다.)
소스 코드
'네트워크 및 보안 > pcap 파일 분석기 만들기 with C언어' 카테고리의 다른 글
[pcap 파일 분석기 만들기 wich C언어] 5. 패킷 분석기 예광탄 - ARP 프로토콜 스택 분석 (1) | 2016.05.23 |
---|---|
[pcap 파일 분석기 만들기 wich C언어] 4. 패킷 분석기 예광탄 - IPv4 프로토콜 스택 분석 (0) | 2016.05.22 |
[pcap 파일 분석기 만들기 wich C언어] 2. 패킷 분석기 예광탄 - 패킷 개수 및 바이트 수 출력 (3) | 2016.05.20 |
[pcap 파일 분석기 만들기 wich C언어] 1. pcap 파일 구조 분석 (0) | 2016.05.20 |