第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 的关键特性

  1. Windows 10 和现代 Windows 支持

    • Npcap 完全支持最新的 Windows 操作系统,包括 Windows 10 和 Windows Server 版本。
    • 提供了兼容 Windows 8 及其之后的 NDIS 6 驱动,性能更好。
  2. 支持环回接口捕获

    • Npcap 支持捕获本机发送和接收的环回流量(即通过环回接口的通信),这是 WinPcap 无法做到的功能。
  3. 性能提升

    • Npcap 的底层驱动进行了优化,数据包捕获的性能更高,能够处理更多的数据包而不丢包。
    • Npcap 通过对 NDIS 6 的使用可以更高效地工作,特别是在高负载网络上。
  4. 增强的安全性

    • Npcap 支持在安全模式下进行安装,并允许通过管理员权限运行以提供更高的安全性。
    • 可以选择以非管理员身份使用 Npcap 来捕获数据包,而 WinPcap 需要管理员权限才能工作。
  5. 与 WinPcap 兼容

    • Npcap 提供了 WinPcap 的兼容模式,这意味着大部分原来基于 WinPcap 开发的应用程序都可以不做更改地在 Npcap 上运行。
    • 可以在 Npcap 安装时选择启用 WinPcap API 兼容模式。
  6. 高级捕获功能

    • 支持捕获发送的数据包(发送包捕获)。
    • 支持过滤器和抓取发送/接收数据的双向流量。

1.3 Npcap 的应用场景

Npcap 被广泛用于网络分析工具和安全工具,例如:

  • Wireshark:一个流行的网络协议分析器,它依赖于 Npcap 或 WinPcap 进行数据包捕获。
  • Nmap:一款开源的网络扫描工具,Npcap 是 Nmap 在 Windows 上使用的默认捕获库。
  • Snort/Suricata:入侵检测系统(IDS),需要网络数据包的实时捕获。
  • TCPdump:一个命令行工具,用于实时捕获网络数据包。

1.4 与 WinPcap 的对比

功能NpcapWinPcap
维护情况持续更新和维护已停止维护
操作系统支持Windows 10、Windows Server 等现代系统Windows XP、7,部分新系统支持
环回接口支持支持捕获环回接口流量不支持
性能更高效,支持 NDIS 6 驱动基于老的 NDIS 5 驱动
安全性支持非管理员权限使用需要管理员权限

 

第2章 linux下的网络抓包库

2.1 libpcap 简介

  • libpcap 是一个开源的、跨平台的 C 库,用于在操作系统内捕获网络数据包。它提供了一个标准的 API,允许程序员编写可以捕获和过滤网络数据包的程序。
  • libpcap 是 Unix 和 Linux 系统上非常重要的网络工具基础库,许多知名的网络分析工具如 Wiresharktcpdump 等都依赖它进行底层数据包捕获。

2.2 libpcap 的特点

  1. 跨平台libpcap 是一个跨平台的库,除了 Linux,它还支持许多类 Unix 操作系统,如 FreeBSD、macOS 等。Windows 上的 WinPcapNpcap 实际上也是基于 libpcap 开发的,但由于 Windows 的网络栈不同,需要额外的系统适配层。

  2. 高效的包捕获:通过使用内核驱动,libpcap 可以直接从网络接口中高效捕获数据包,而无需对内核进行修改。

  3. BPF 过滤器libpcap 提供了 Berkeley Packet Filter (BPF) 过滤规则,允许开发者只捕获感兴趣的特定数据包类型,减少不必要的数据处理和存储。例如,使用 tcpdumpWireshark 时,可以通过编写 BPF 过滤表达式来指定抓取的包类型。

  4. 强大的工具支持:大量的网络工具基于 libpcap,如:

    • tcpdump:一个命令行工具,用于捕获和显示网络流量。
    • Wireshark:一个图形化网络分析工具,广泛用于网络排错和协议分析。
    • Snort:一个入侵检测系统(IDS),实时分析网络流量。
  5. 广泛的协议支持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 捕获数据包

捕获数据包有两种主要方式:

  1. pcap_loop(): 循环捕获指定数量的数据包。
  2. 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的报文结构

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐