Windows下的网络抓包库Npcap
libpcap是一个开源的、跨平台的 C 库,用于在操作系统内捕获网络数据包。它提供了一个标准的 API,允许程序员编写可以捕获和过滤网络数据包的程序。libpcap是 Unix 和 Linux 系统上非常重要的网络工具基础库,许多知名的网络分析工具如Wiresharktcpdump等都依赖它进行底层数据包捕获。
第1章 背景介绍
Npcap 是一个基于 WinPcap
的改进版网络抓包库,它是专门为 Windows 平台设计的,用于网络数据包捕获和网络流量监控。与 WinPcap
不同,Npcap
是更现代化、功能更强大且支持更多新特性的库,特别是对 Windows 操作系统的改进支持。
1.1 Npcap 的背景和起源
- WinPcap 是 Windows 上早期使用最广泛的网络数据包捕获库,但它自 2013 年起停止了维护和更新,存在一些兼容性问题,特别是在 Windows 的新版本上运行不够理想。
- Npcap 是由
Nmap
项目的开发者创建的,用来替代 WinPcap,解决了许多 WinPcap 在 Windows 上的问题,并增加了新的功能和更强的性能表现。Npcap 完全兼容 WinPcap 的 API,因此任何使用 WinPcap 编写的应用程序基本上可以直接切换到 Npcap 而无需大的修改。
1.2 Npcap 的关键特性
-
Windows 10 和现代 Windows 支持:
- Npcap 完全支持最新的 Windows 操作系统,包括 Windows 10 和 Windows Server 版本。
- 提供了兼容 Windows 8 及其之后的
NDIS 6
驱动,性能更好。
-
支持环回接口捕获:
- Npcap 支持捕获本机发送和接收的环回流量(即通过环回接口的通信),这是 WinPcap 无法做到的功能。
-
性能提升:
- Npcap 的底层驱动进行了优化,数据包捕获的性能更高,能够处理更多的数据包而不丢包。
- Npcap 通过对
NDIS 6
的使用可以更高效地工作,特别是在高负载网络上。
-
增强的安全性:
- Npcap 支持在安全模式下进行安装,并允许通过管理员权限运行以提供更高的安全性。
- 可以选择以非管理员身份使用 Npcap 来捕获数据包,而 WinPcap 需要管理员权限才能工作。
-
与 WinPcap 兼容:
- Npcap 提供了 WinPcap 的兼容模式,这意味着大部分原来基于 WinPcap 开发的应用程序都可以不做更改地在 Npcap 上运行。
- 可以在 Npcap 安装时选择启用 WinPcap API 兼容模式。
-
高级捕获功能:
- 支持捕获发送的数据包(发送包捕获)。
- 支持过滤器和抓取发送/接收数据的双向流量。
1.3 Npcap 的应用场景
Npcap 被广泛用于网络分析工具和安全工具,例如:
- Wireshark:一个流行的网络协议分析器,它依赖于 Npcap 或 WinPcap 进行数据包捕获。
- Nmap:一款开源的网络扫描工具,Npcap 是 Nmap 在 Windows 上使用的默认捕获库。
- Snort/Suricata:入侵检测系统(IDS),需要网络数据包的实时捕获。
- TCPdump:一个命令行工具,用于实时捕获网络数据包。
1.4 与 WinPcap 的对比
功能 | Npcap | WinPcap |
---|---|---|
维护情况 | 持续更新和维护 | 已停止维护 |
操作系统支持 | Windows 10、Windows Server 等现代系统 | Windows XP、7,部分新系统支持 |
环回接口支持 | 支持捕获环回接口流量 | 不支持 |
性能 | 更高效,支持 NDIS 6 驱动 | 基于老的 NDIS 5 驱动 |
安全性 | 支持非管理员权限使用 | 需要管理员权限 |
第2章 linux下的网络抓包库
2.1 libpcap
简介
libpcap
是一个开源的、跨平台的 C 库,用于在操作系统内捕获网络数据包。它提供了一个标准的 API,允许程序员编写可以捕获和过滤网络数据包的程序。libpcap
是 Unix 和 Linux 系统上非常重要的网络工具基础库,许多知名的网络分析工具如 Wireshark、tcpdump 等都依赖它进行底层数据包捕获。
2.2 libpcap
的特点
-
跨平台:
libpcap
是一个跨平台的库,除了 Linux,它还支持许多类 Unix 操作系统,如 FreeBSD、macOS 等。Windows 上的WinPcap
和Npcap
实际上也是基于libpcap
开发的,但由于 Windows 的网络栈不同,需要额外的系统适配层。 -
高效的包捕获:通过使用内核驱动,
libpcap
可以直接从网络接口中高效捕获数据包,而无需对内核进行修改。 -
BPF 过滤器:
libpcap
提供了 Berkeley Packet Filter (BPF) 过滤规则,允许开发者只捕获感兴趣的特定数据包类型,减少不必要的数据处理和存储。例如,使用tcpdump
或Wireshark
时,可以通过编写 BPF 过滤表达式来指定抓取的包类型。 -
强大的工具支持:大量的网络工具基于
libpcap
,如:- tcpdump:一个命令行工具,用于捕获和显示网络流量。
- Wireshark:一个图形化网络分析工具,广泛用于网络排错和协议分析。
- Snort:一个入侵检测系统(IDS),实时分析网络流量。
-
广泛的协议支持:
libpcap
支持许多常见的网络协议(如 TCP、UDP、IP、ICMP 等),几乎可以捕获和分析所有类型的网络通信数据。
第3章 Npcap的开发流程
- 找到可用的网络设备:
pcap_findalldevs()
- 打开设备:
pcap_open_live()
- 设置过滤器(可选):
pcap_compile()
和pcap_setfilter()
- 捕获数据包:
pcap_loop()
或pcap_next_ex()
- 处理数据包: 通过回调函数或手动解析数据包
- 关闭设备:
pcap_close()
- 释放设备列表:
pcap_freealldevs()
3.1 找到可用的网络设备
pcap_if_t *alldevs, *device;
char errbuf[PCAP_ERRBUF_SIZE];
// 查找所有可用设备
if (pcap_findalldevs(&alldevs, errbuf) == -1) {
fprintf(stderr, "Error finding devices: %s\n", errbuf);
return -1;
}
// 选择第一个设备进行捕获
device = alldevs;
3.2 打开设备
使用 pcap_open_live()
函数打开选定的网络设备进行数据包捕获。需要指定捕获数据包的最大字节数(通常为65536),是否启用混杂模式,和捕获超时时间。
pcap_t *handle;
char errbuf[PCAP_ERRBUF_SIZE];
// 打开设备进行捕获
handle = pcap_open_live(device->name, 65536, 1, 1000, errbuf);
if (handle == NULL) {
fprintf(stderr, "Could not open device: %s\n", errbuf);
return -1;
}
3.3 设置过滤器(可选)
为了只捕获特定类型的数据包(如 TCP、UDP、ICMP 等),可以通过 pcap_compile()
和 pcap_setfilter()
设置过滤器。
struct bpf_program fp;
char filter_exp[] = "tcp port 80"; // 过滤规则:捕获80端口的TCP包
bpf_u_int32 net;
// 编译过滤规则
if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {
fprintf(stderr, "Error compiling filter: %s\n", pcap_geterr(handle));
return -1;
}
// 设置过滤器
if (pcap_setfilter(handle, &fp) == -1) {
fprintf(stderr, "Error setting filter: %s\n", pcap_geterr(handle));
return -1;
}
3.4 捕获数据包
捕获数据包有两种主要方式:
- pcap_loop(): 循环捕获指定数量的数据包。
- pcap_next_ex(): 单次捕获一个数据包。
// 捕获数据包的回调函数
void packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) {
printf("Captured a packet with length of [%d]\n", header->len);
}
// 循环捕获10个数据包
pcap_loop(handle, 10, packet_handler, NULL);
3.5 处理数据包
回调函数 packet_handler()
中的 packet
参数指向捕获到的数据包。可以解析该数据包的不同协议层(如以太网、IP、TCP 等)。
3.6 关闭网络设备
// 关闭捕获设备
pcap_close(handle);
3.7 释放设备列表
使用完 pcap_findalldevs()
返回的设备列表后,需要释放内存。
pcap_freealldevs(alldevs);
第4章 TCP/IP协议
4.1 ISO/OSI的网络模型架构
4.2 TCP/IP参考模型的层次结构
4.3 协议关系图
4.4 数据传输过程
4.5 以太网头部结构
以太网属于数据链路层, 属于最基本的协议结构
4.6 ARP协议
4.7 IP协议
IP协议为TCP, UDP, ICMP提供最基本的数据传输通路
4.8 ICMP协议
ICMP协议用于传递差错信息, 时间, 回显, 网络信息等报文数据, ICMP在IP报文中的位置为:
4.9 TCP协议
TCP数据在IP报文中的位置为:
TCP报文包含头部和数据:
TCP三次握手
释放连接的四次握手
4.10 UDP协议
UDP数据在IP数据中的位置
UDP的报文结构
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)