libpcap不执行任何操作(Windows)

1cosmwyk  于 2023-10-16  发布在  Windows
关注(0)|答案(2)|浏览(184)

两天来,我一直在尝试在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文件。
我能做错什么?

x8diyxa7

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)上具有不同的功能。你可能不需要所有的复杂性-只要遵循汤姆的建议。

t3psigkw

t3psigkw2#

错误是使用了LoadLibrary,参见LoadLibraryA function
LoadLibrary的正确用法是:

HMODULE hModule = LoadLibrary("xxxxxxx.dll");
if(hModule == NULL)
{
    // error warning
}

如果使用LoadLibrary,为什么不使用GetProcAddress,请参见GetProcAddress function
然后你需要定义一个函数的poniter,像这样:

typedef int (*pFunc)(int a , int b)

然后使用GetProcAddress

pFunc PPPfunc = (pFunc)GetProcAddress(hModule, "NameOfFunction");
int d = PPPfunc(1, 2);

相关问题