프로젝트/네트워크 패킷 분석기를 만들며 보안 전문가를 꿈꾸자.

[네트워크 보안, C언어 프로젝트] 패킷 분석기 Part 3. ethernet 프로토콜 분석기

언제나휴일 2020. 4. 19. 14:24
반응형

 

 

[C 프로젝트] 패킷 분석기 Part 3. ethernet 프로토콜 분석기 – 언제나 휴일

 이번 강의는 “패킷 분석기 Part 3. ethernet 프로토콜 분석기 제작”입니다. 이전 강의 작성 소스 다운로드 지난 강의에서 패킷 목록을 분석하는 ParseEther 함수의 반복문 내부에서 하는 일은 하나의 패킷 정보를 읽어와서 패킷 헤더 정보를 출력하는 것입니다. 이 부분에 읽어온 패킷 정보를 ethernet 프로토콜을 분석하는 함수를 호출하는 것을 추가로 작성합시다. 먼저 PcapFile.c 에서 패킷 목록을 분석하는 ParseEther 함수

ehpub.co.kr

ethernet 프로토콜 분석기.zip
1.86MB

 

소스 코드

PcapFile.h

#pragma once
#include <WinSock2.h>
#pragma comment(lib,"ws2_32")
#include <stdio.h>
typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;

typedef struct _PFHeader PFHeader; 
struct _PFHeader //패킷 파일 헤더
{
	uint magic;//0xA1B2C3D4
	ushort major;
	ushort minor;
	uint gmt_to_local;
	uint timestamp;
	uint max_caplen;
	uint linktype;
};

typedef struct _PACKETHEADER PackHeader;
struct _PACKETHEADER //패킷 헤더
{
	uint captime;//second
	uint caputime;//u second
	uint caplen;
	uint packlen;
};

#define PF_MAGIC 0xA1B2C3D4
#define LT_ETHER   0x01
void ParseEthers(FILE *fp);
int ParsePCapFile(FILE *fp, PFHeader *pfh);

PcapFile.c

#include "PcapFile.h"
#include "EHEther.h"
char buffer[0x100000];
void ViewPCapFile(PFHeader *pfh);
void ViewPacketHeaderInfo(PackHeader *ph,int pno);

void ParseEthers(FILE *fp)
{
	PackHeader ph = { 0 };
	int pno=0;
	while (fread(&ph,sizeof(PackHeader),1,fp)==1)
	{
		pno++;
		ViewPacketHeaderInfo(&ph, pno);
		fread(buffer, sizeof(uchar), ph.caplen, fp);	
		ParseEther(buffer, ph.caplen);
	}
}

int ParsePCapFile(FILE *fp, PFHeader *pfh)
{
	fread(pfh, sizeof(PFHeader), 1, fp);
	if (pfh->magic != PF_MAGIC)
	{
		return 0;
	}
	ViewPCapFile(pfh);
	return 1;
}
void ViewPCapFile(PFHeader *pfh)
{
	printf("=========== PCAP File 헤더 정보 ============\n");
	printf("\t 버전:%d.%d\n", pfh->major, pfh->minor);
	printf("\t최대 캡쳐 길이:%d bytes\n", pfh->max_caplen);
}
void ViewPacketHeaderInfo(PackHeader *ph, int pno)
{
	printf("!!! <%4d th> 프레임 !!!\n", pno);
	printf("패킷:%6d bytes 캡쳐:%6d\n", ph->packlen, ph->caplen);
}

EHEther.h

#pragma once
#include "PcapFile.h"

#define L3_IPv4 0x0800
#define L3_ARP 0x0806

typedef struct  _EtherHeader EtherHeader;
struct  _EtherHeader
{
	uchar dst_mac[6];
	uchar src_mac[6];
	ushort l3type;
};

void ParseEther(uchar *buffer, uint len);

EHEther.c

#include "EHEther.h"

void ViewEther(EtherHeader *eh);
void ParseEther(uchar *buffer, uint len)
{
	EtherHeader *eh = (EtherHeader *)buffer;
	uchar *next = buffer + sizeof(EtherHeader);
	len = len - sizeof(EtherHeader);

	ViewEther(eh);
	switch (nthos(eh->l3type))
	{
		case L3_IPv4 : printf("IPv4: to be defined\n"); break;
		case L3_ARP : printf("ARP: to be defined\n"); break;
		default: printf("Not support\n");	break;
	}
}

void ViewMac(const char *msg,uchar *base);
void ViewEther(EtherHeader *eh)
{
	printf("★★★★★     ethernet header    ★★★★★\n");
	ViewMac("dest", eh->dst_mac);
	ViewMac("source", eh->src_mac);
	printf("\tL3Type:%#x\n", ntohs(eh->l3type));
	printf("\t(IPv4:0x0800 ARP:0x0806)\n");
}
void ViewMac(const char *msg, uchar *base)
{
	printf("\t%s", msg);
	printf("%02x", base[0]);
	for (int i = 1; i < 6; i++)
	{
		printf(":%02x", base[i]);
	}
	printf("\n");
}

Program.c

//http://ehpub.co.kr
//[언제나 프로젝트] C 패킷 분석기 Part 3. ethernet 프로토콜 분석기 구현
#include <stdio.h>
#include <stdlib.h>
#include "PcapFile.h"
int main()
{
	char fname[256 + 1] = "";
	printf("분석할 pcap 파일명:");
	scanf_s("%s", fname, sizeof(fname));

	FILE *fp = 0;
	fopen_s(&fp, fname, "rb");
	if (fp == 0)
	{
		perror("파일 열기 실패");
		system("pause");
		return 0;
	}

	PFHeader pfh = { 0, };
	if (ParsePCapFile(fp, &pfh) == 0)
	{
		printf("PCAP 파일이 아닙니다\n");
		fclose(fp);
		system("pause");
		return 0;
	}

	switch (pfh.linktype)
	{
	case LT_ETHER: ParseEthers(fp); break;
	default: printf("Not Support\n"); break;
	}
	fclose(fp);
	system("pause");
	return 0;
}

 

반응형