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

[네트워크 보안, C언어 프로젝트] 패킷 분석기 Part 2. PCAP 파일 구조 분석기

언제나휴일 2020. 4. 18. 13:45
반응형

 

 

 

[C 프로젝트] 패킷 분석기 Part 2. PCAP 파일 구조 분석기 – 언제나 휴일

demo.pcap 파일 다운로드  안녕하세요. 언제나 휴일, 언휴예요.  이번 강의는 “패킷 분석기 Part 2. PCAP 파일 구조 분석”입니다.   먼저 PCAP 파일 구조를 알아본 후에 구현하기로 할게요. PCAP 파일 구조  PCAP 파일은 TCPDump 프로그램으로 패킷을 캡쳐한 파일을 말합니다. 와이어 샤크에서도 PCAP 파일로 저장하기를 제공하고 있어요.  다음은 PCAP 파일을 설명하기 위한 화면입니다.  PCAP 파일은 PCAP 파일 헤더

ehpub.co.kr

demo.pcap
2.08MB
PCAP 파일 구조 분석.zip
1.86MB

소스 코드

PcapFile.h

#pragma once
#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 ParseEther(FILE *fp);
int ParsePCapFile(FILE *fp, PFHeader *pfh);

PcapFile.c

#include "PcapFile.h"

char buffer[0x100000];
void ViewPCapFile(PFHeader *pfh);
void ViewPacketHeaderInfo(PackHeader *ph,int pno);

void ParseEther(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);
	}
}

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);
}

Program.c

//http://ehpub.co.kr
//[언제나 프로젝트] C 패킷 분석기 Part 2. PCAP 파일 구조 분석하기 구현
#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: ParseEther(fp); break;
	default: printf("Not Support\n"); break;
	}
	fclose(fp);
	system("pause");
	return 0;
}
반응형