现在 2 天了,我正在尝试获得一个简单的数据包实时捕获,以便在 Windows 11 上与 libpcap 和 npcap 一起使用。我正在使用 MSYS2 编译的 MinGW GCC 编译器。我已经通过 pacman 安装了 libpcap 并链接了它。我已经安装了具有无线支持的 npcap 以及环回驱动程序、LWF、具有无线支持的 LWF 和 WFP callout 驱动程序(通过 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);
}
错误显示“未找到合适的设备”
以管理员身份运行应用程序不会执行任何操作。我真的不知道还有什么可以尝试让它工作,除了使用 VS 并隐式链接 npcap SDK 中的 .lib 文件...
我可能做错了什么?
错误是使用
LoadLibrary
,参见LoadLibraryA函数
LoadLibrary
的正确用法是:
HMODULE hModule = LoadLibrary("xxxxxxx.dll");
if(hModule == NULL)
{
// error warning
}
如果你使用
LoadLibrary
,为什么不使用GetProcAddress
,请参阅GetProcAddress函数
然后你需要定义一个函数端点,如下所示:
typedef int (*pFunc)(int a , int b)
然后使用
GetProcAddress
pFunc PPPfunc = (pFunc)GetProcAddress(hModule, "NameOfFunction");
int d = PPPfunc(1, 2);