WinPcap(Windows Packet Capture)是Windows平台底層網絡數據包捕獲/發送的標準庫。本文詳細講解開發環境配置、適配器列表獲取、詳細信息提取(IP/MAC/網關等)、數據結構解析,為後續抓包發包奠定基礎。
WpdPack\IncludeWpdPack\Lib\x64(或x86)wpcap.lib; Packet.lib; ws2_32.libwpcap.dll、packet.dll到輸出目錄或系統路徑1. pcap_if_t - 適配器鏈表節點
struct pcap_addr {
struct pcap_addr *next;
struct sockaddr *addr; // IP地址
struct sockaddr *netmask; // 子網掩碼
struct sockaddr *broadaddr; // 廣播地址
struct sockaddr *dstaddr; // 目標地址(P2P)
};
| 函數 | 用途 | 關鍵參數 |
|---|---|---|
| pcap_findalldevs_ex | 獲取所有適配器列表 | source、auth、alldevs、errbuf |
| pcap_freealldevs | 釋放適配器列表內存 | alldevs |
| pcap_open_live | 打開適配器進行捕獲 | device、snaplen、promisc、to_ms、errbuf |
name);
if (d->description) printf(" 描述: %s\n", d->description);
printf(" 環回: %s\n", (d->flags & PCAP_IF_LOOPBACK) ? "是" : "否");
for (pcap_addr_t *a = d->addresses; a; a = a->next) {
printf(" 地址族: %d", a->addr->sa_family);
switch (a->addr->sa_family) {
case AF_INET:
printf(" (IPv4)\n");
if (a->addr) printf(" IP: %s\n", iptos(((struct sockaddr_in*)a->addr)->sin_addr.s_addr));
if (a->netmask) printf(" 掩碼: %s\n", iptos(((struct sockaddr_in*)a->netmask)->sin_addr.s_addr));
if (a->broadaddr) printf(" 廣播: %s\n", iptos(((struct sockaddr_in*)a->broadaddr)->sin_addr.s_addr));
if (a->dstaddr) printf(" 目標: %s\n", iptos(((struct sockaddr_in*)a->dstaddr)->sin_addr.s_addr));
break;
case AF_INET6:
printf(" (IPv6)\n");
char buf[128];
if (a->addr) printf(" IP: %s\n", ip6tos(a->addr, buf, sizeof(buf)));
break;
default:
printf(" (未知)\n");
}
}
}
int main() {
pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE];
char source[PCAP_ERRBUF_SIZE];
printf("數據源選擇:\n"
" rpcap:// -> 本機適配器\n"
" rpcap://host:port -> 遠程適配器(需rpcapd)\n"
" file://path -> pcap文件\n"
"輸入選擇: ");
fgets(source, PCAP_ERRBUF_SIZE, stdin);
source[strcspn(source, "\n")] = 0; // 去換行
// 獲取適配器列表
if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) == -1) {
fprintf(stderr, "錯誤: %s\n", errbuf);
return 1;
}
if (!alldevs) {
printf("未找到適配器,請確認WinPcap已安裝\n");
return 1;
}
// 遍歷打印
int i = 0;
for (pcap_if_t *d = alldevs; d; d = d->next) {
printf("\n[%d] %s", ++i, d->name);
if (d->description) printf(" - %s", d->description);
}
printf("\n");
// 詳細信息
for (pcap_if_t *d = alldevs; d; d = d->next) {
print_adapter(d);
}
// 釋放資源
pcap_freealldevs(alldevs);
return 0;
}
數據源選擇: rpcap://
[1] \Device\NPF_{GUID1} - Intel(R) 82574L Gigabit Network Connection
[2] \Device\NPF_{GUID2} - VirtualBox Host-Only Ethernet Adapter
[3] \Device\NPF_{GUID3} - 環回適配器
適配器: \Device\NPF_{GUID1}
描述: Intel(R) 82574L Gigabit Network Connection
環回: 否
地址族: 2 (IPv4)
IP: 192.168.1.100
掩碼: 255.255.255.0
廣播: 192.168.1.255
目標: 0.0.0.0
net start npf)、檢查防火牆HAVE_REMOTE宏定義、庫路徑正確chcp 65001、字符串用宽字符版APIrpcapd -n(允許空密碼)或配置用戶認證rpcap://192.168.1.50:2002pcap_rmtauth:類型RPCAP_RMTAUTH_PWD、用戶名、密碼| 特性 | WinPcap | Npcap(Nmap項目) |
|---|---|---|
| 維護狀態 | 停止更新(2013年後) | 活躍維護 |
| Win10/11支持 | 不完美 | 原生支持 |
| 環回捕獲 | 不支持 | 支持(Npcap Loopback Adapter) |
| API兼容性 | 基準 | 高度兼容 |
| 推薦度 | 維舊項目 | 新項目首選 |