两天来,我一直在尝试在Windows 11上使用libpcap和npcap进行简单的数据包实时捕获。我用的是MSYS 2编译的MinGW GCC编译器。我已经通过pacman安装了libpcap并链接了它。我已经安装了带有无线支持的npcap,以及WFP驱动程序、LWF、带有无线支持的LWF和WFP驱动程序(通过NPFInstall.exe)。npcap服务正在运行,wireshark本身运行良好。我的Wi-Fi网络适配器不支持监视模式,所以我无法使用WlanHelper.exe尝试监视模式
我第一次测试的代码是:
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
static void init_npcap_dll_path ()
{
BOOL(WINAPI *SetDllDirectory)(LPCTSTR);
char sysdir_name[512];
int len;
SetDllDirectory = (BOOL(WINAPI *)(LPCTSTR)) GetProcAddress(GetModuleHandle("kernel32.dll"), "SetDllDirectoryA");
if(SetDllDirectory == NULL)
{
printf("Error in SetDllDirectory\n");
}
else
{
len = GetSystemDirectory(sysdir_name, 480);
if(!len) printf("Error in GetSystemDirectory (%d)\n", GetLastError());
strcat(sysdir_name, "\\Npcap");
if(SetDllDirectory(sysdir_name) == 0)
printf("Error in SetDllDirectory(\"System32\\Npcap\")\n");
}
}
int main (void)
{
/* No error here: */
init_npcap_dll_path();
/* Modules were loaded successfully */
HMODULE lib1 = LoadLibrary("wpcap");
HMODULE lib2 = LoadLibrary("Packet");
char errbuf[PCAP_ERRBUF_SIZE];
char *dev = "\\Device\\NPF_{B4B56B26-D9F1-49CF-831F-DD58B7DA5ACC}";
//char *dev = "b4b56b26-d9f1-49cf-831f-dd58b7da5acc"; /* Tried this as well */
pcap_t* handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
if(handle == NULL)
{
fprintf(stderr, "Could not open device %s: %s\n", dev, errbuf);
return 2;
}
return 0;
}
而pcap错误是“此系统不支持实时数据包捕获”。
此外,即使是简单的网络适配器查找也不起作用:
char *dev = pcap_lookupdev(errbuf);
if(dev == NULL)
{
fprintf(stderr, "Couldn't find default device: %s\n", errbuf);
return(2);
}
错误显示“未找到合适的设备”
以admin身份运行应用程序不会执行任何操作。我真的不知道我还能尝试什么来让它工作,除了使用VS和隐式链接npcap SDK中的.lib文件。
我能做错什么?
2条答案
按热度按时间x8diyxa71#
如果使用MSYS 2 libpcap包构建程序,(正如“我已经通过pacman安装了libpcap”所暗示的那样),那么,除非该包中的libpcap是在安装了Npcap * 和 * Npcap SDK的系统上编译的,* 并且 * 该包的构建过程告诉CMake Npcap SDK安装在哪里,那么该包中的libpcap将 * 不 * 支持包捕获(并且不应该被MSYS 2包站点广告为“用于包捕获”!).
注意there are both "libpcap" and "mingw-w64-libpcap" packages on the MSYS2 packages site。它们似乎没有说明 Package 之间的区别;你可以尝试卸载你安装的任何一个,安装另一个,看看是否有效。
如果the MSYS2 MINGW-packages issues list上的一个或两个包都不支持数据包捕获,您可能还希望对其中一个或两个包提出问题。
我不知道在MinGW中是否有办法链接到一个带有提供Visual Studio .lib文件的SDK的程序,但是,如果支持的话,你可能想安装Npcap SDK并使用它来构建。
(Note另外,使用
LoadLibrary()
加载wpcap和Packet库,而不对从中返回的句柄做任何事情,绝对没有任何用处。)wireshark本身运行良好
这是因为Wireshark使用
LoadLibrary()
动态加载wpcap,获取指向Wireshark使用GetProcAddress()
的所有libpcap函数的指针,并具有使用这些指针调用libpcap函数的代码,其方式类似于Tom在his answer中描述的方式。这意味着它直接调用(通过指针)libpcap函数的Npcap版本,而Npcap * 是 * 构建来支持数据包捕获的,因此可以工作。在Wireshark中执行此操作的代码是...复杂,因为Wireshark支持多个版本的libpcap,在UN*Xes和Windows(WinPcap和Npcap)上具有不同的功能。你可能不需要所有的复杂性-只要遵循汤姆的建议。
t3psigkw2#
错误是使用了
LoadLibrary
,参见LoadLibraryA functionLoadLibrary
的正确用法是:如果使用
LoadLibrary
,为什么不使用GetProcAddress
,请参见GetProcAddress function然后你需要定义一个函数的poniter,像这样:
然后使用
GetProcAddress