-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate_minimal_pcap.cpp
More file actions
116 lines (99 loc) · 4.01 KB
/
create_minimal_pcap.cpp
File metadata and controls
116 lines (99 loc) · 4.01 KB
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
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
// PCAP全局文件头
struct PcapHeader {
uint32_t magic_number = 0xa1b2c3d4; // 大端格式
uint16_t version_major = 2;
uint16_t version_minor = 4;
int32_t thiszone = 0;
uint32_t sigfigs = 0;
uint32_t snaplen = 65535;
uint32_t network = 1; // 以太网
};
// 数据包头
struct PacketHeader {
uint32_t ts_sec;
uint32_t ts_usec;
uint32_t caplen;
uint32_t len;
};
int main() {
std::ofstream file("minimal_test.pcap", std::ios::binary);
if (!file) {
std::cerr << "无法创建文件" << std::endl;
return 1;
}
// 写入PCAP全局头
PcapHeader pcap_header;
file.write(reinterpret_cast<const char*>(&pcap_header), sizeof(pcap_header));
// 创建一个简单的以太网帧(ARP请求)
std::vector<uint8_t> arp_packet = {
// 以太网头部 (14字节)
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 目标MAC (广播)
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, // 源MAC
0x08, 0x06, // 类型: ARP
// ARP头部 (28字节)
0x00, 0x01, // 硬件类型: 以太网
0x08, 0x00, // 协议类型: IPv4
0x06, // 硬件地址长度
0x04, // 协议地址长度
0x00, 0x01, // 操作: 请求
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, // 发送方MAC
0xc0, 0xa8, 0x01, 0x64, // 发送方IP (192.168.1.100)
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 目标MAC (未知)
0xc0, 0xa8, 0x01, 0x01 // 目标IP (192.168.1.1)
};
// 写入第一个数据包
PacketHeader pkt_header1;
pkt_header1.ts_sec = 1640995200; // 2022-01-01 00:00:00
pkt_header1.ts_usec = 0;
pkt_header1.caplen = arp_packet.size();
pkt_header1.len = arp_packet.size();
file.write(reinterpret_cast<const char*>(&pkt_header1), sizeof(pkt_header1));
file.write(reinterpret_cast<const char*>(arp_packet.data()), arp_packet.size());
// 创建一个简单的IP数据包
std::vector<uint8_t> ip_packet = {
// 以太网头部 (14字节)
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, // 目标MAC
0x00, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, // 源MAC
0x08, 0x00, // 类型: IPv4
// IPv4头部 (20字节)
0x45, // 版本和头长度
0x00, // 服务类型
0x00, 0x2e, // 总长度 (46字节)
0x00, 0x01, // 标识
0x40, 0x00, // 标志和片偏移
0x40, // TTL
0x06, // 协议: TCP
0x00, 0x00, // 头校验和 (这里简化为0)
0xc0, 0xa8, 0x01, 0x64, // 源IP (192.168.1.100)
0x08, 0x08, 0x08, 0x08, // 目标IP (8.8.8.8)
// TCP头部 (20字节)
0x30, 0x39, // 源端口 (12345)
0x00, 0x50, // 目标端口 (80)
0x00, 0x00, 0x00, 0x01, // 序列号
0x00, 0x00, 0x00, 0x00, // 确认号
0x50, 0x02, // 头长度和标志 (SYN)
0xff, 0xff, // 窗口大小
0x00, 0x00, // 校验和
0x00, 0x00, // 紧急指针
// 数据部分
'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'
};
// 写入第二个数据包
PacketHeader pkt_header2;
pkt_header2.ts_sec = 1640995201; // 2022-01-01 00:00:01
pkt_header2.ts_usec = 500000;
pkt_header2.caplen = ip_packet.size();
pkt_header2.len = ip_packet.size();
file.write(reinterpret_cast<const char*>(&pkt_header2), sizeof(pkt_header2));
file.write(reinterpret_cast<const char*>(ip_packet.data()), ip_packet.size());
file.close();
std::cout << "最小测试PCAP文件已创建: minimal_test.pcap" << std::endl;
std::cout << "包含2个数据包:" << std::endl;
std::cout << "1. ARP请求包 (" << arp_packet.size() << " 字节)" << std::endl;
std::cout << "2. TCP数据包 (" << ip_packet.size() << " 字节)" << std::endl;
return 0;
}