libpcap 不执行任何操作 (Windows)

问题描述 投票:0回答:1

现在 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 文件...

我可能做错了什么?

c windows gcc libpcap npcap
1个回答
0
投票

错误是使用

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);
© www.soinside.com 2019 - 2024. All rights reserved.