반응형
소스 코드
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;
}
반응형
'프로젝트 > 네트워크 패킷 분석기를 만들며 보안 전문가를 꿈꾸자.' 카테고리의 다른 글
[네트워크 보안, C언어 프로젝트] 패킷 분석기 Part 2. PCAP 파일 구조 분석기 (0) | 2020.04.18 |
---|---|
[네트워크 보안, C언어 프로젝트] 패킷 분석기 Part 1. 프로젝트 소개 (0) | 2020.04.18 |