-
Notifications
You must be signed in to change notification settings - Fork 0
/
pcap.h
106 lines (99 loc) · 3.25 KB
/
pcap.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#ifndef pcaptest_pcap_h
#define pcaptest_pcap_h
#define MAC_LEN 6
#define TYPE_LEN 2
#define ONE_BYTE 1
#define TWO_BYTES 2
#define FOUR_BYTES 4
#define TCP 6
#define UDP 17
#define IPv4 0x0800
#define IPv6 0x86dd
#define ARP 0x0806
#define FIN 0x01
#define SYN 0x02
#define RST 0x04
#define PSH 0x08
#define ACK 0x10
#define URG 0x20
#define ECE 0x40
#define CWR 0x80
typedef unsigned int bpf_u_int32;
typedef unsigned short u_short;
typedef int bpf_int32;
typedef unsigned long long int bpf_u_int64;
typedef unsigned char u_char;
/*
Pcap文件头24B各字段说明:
Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始
Major:2B,0x02 00:当前文件主要的版本号
Minor:2B,0x04 00当前文件次要的版本号
ThisZone:4B当地的标准时间;全零
SigFigs:4B时间戳的精度;全零
SnapLen:4B最大的存储长度
LinkType:4B链路类型
常用类型:
0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
*/
typedef struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone;
bpf_u_int32 sigfigs;
bpf_u_int32 snaplen;
bpf_u_int32 linktype;
}pcap_file_header;
typedef struct pcap_data{
u_char des_mac[6];
u_char src_mac[6];
u_short data_type;
u_short ip_head_len;
bpf_u_int32 des_ip;
bpf_u_int32 src_ip;
u_char time_to_live;
u_char pro_type;
u_short des_port;
u_short src_port;
bpf_u_int32 seq;
bpf_u_int32 ack;
u_char tcp_flags;
u_short winsize;
}pcap_data;
/*
Packet 包头和Packet数据组成
字段说明:
Timestamp:时间戳高位,精确到seconds
Timestamp:时间戳低位,精确到microseconds
Caplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。
Len:离线数据长度:网络中实际数据帧的长度,一般不大于caplen,多数情况下和Caplen数值相等。
Packet 数据:即 Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就 是说:PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet包确定。
*/
typedef struct timestamp{
bpf_u_int32 timestamp_s;
bpf_u_int32 timestamp_ms;
}timestamp;
typedef struct pcap_header{
timestamp ts;
bpf_u_int32 capture_len;
bpf_u_int32 len;
}pcap_header;
void print_pcap_file_header(pcap_file_header *pfh);
void print_pcap_header(pcap_header *ph);
void print_pcap(pcap_data* pd);
void print_ether(pcap_data* pd);
void print_ip(pcap_data* pd);
void print_tcp(pcap_data* pd);
void print_udp(pcap_data* pd);
void pcap_packet_ana(void*data,pcap_data*pd);
void pcap_ether(void* data,pcap_data* pd,int pos);
void pcap_ip(void* data,pcap_data* pd,int pos);
void pcap_tcp(void* data,pcap_data*pd,int pos);
void pcap_udp(void* data,pcap_data*pd,int pos);
char* ip_to_str(unsigned int netp);
#endif