4

我试图弄清楚如何获取给定进程的所有网络活动。在“网络活动”框中的 Windows“资源监视器”应用程序中,您可以看到所有 tcp / udp 连接,以及正在发送的数据等。我首先尝试使用 cmd netstat,并且打算解析这个但很快意识到它“错过”了一大堆 udp 连接。所以就这样了。现在我一直在研究iphlpapi.h在 c++ 中使用它GetExtendedUdpTable功能。但即使这样似乎也没有显示资源监视器显示的所有数据。任何人都可以将我引导到正确的 Windows API,该 API 可以获得与资源监视器下的网络活动选项卡中所见相同的信息。我已经搜索了一段时间,发现的所有东西都非常古老,我希望使用当前/现代的方法。这不必向后兼容,只有 Windows 10 就可以了。

基本上我的最终目标是构建一个应用程序,该应用程序可以使用数据库自​​动为目标应用程序(包括 UDP 连接)对 ip 进行地理定位。现在我确信有很多库/应用程序已经可以做到这一点。我只是想把它作为一个学习过程来做,所以我想避免除 Windows 提供的库/API 之外的任何库/API。

这是我目前一直在使用的,请原谅使用printf和不使用static_cast等不良做法的使用。一旦找到获取所需信息的方法,我将正确重写所有内容。

    MIB_UDPTABLE_OWNER_PID* pUdpTable;
    MIB_UDPROW_OWNER_PID* owner;

    DWORD dwSize;
    DWORD dwResult;

    dwResult = GetExtendedUdpTable(NULL, &dwSize, false, AF_INET, UDP_TABLE_OWNER_PID, 0);
    pUdpTable = (MIB_UDPTABLE_OWNER_PID*)MALLOC(dwSize);
    dwResult = GetExtendedUdpTable(pUdpTable, &dwSize, false, AF_INET, UDP_TABLE_OWNER_PID, 0);

    for (DWORD dwLoop = 0; dwLoop < pUdpTable->dwNumEntries; dwLoop++) {
        owner = &pUdpTable->table[dwLoop];
        printf("%ld ", owner->dwOwningPid);

        HANDLE Handle = OpenProcess(
            PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
            FALSE,
            owner->dwOwningPid
        );
        if (Handle) {
            TCHAR Buffer[MAX_PATH];
            if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH)) {
                printf(Buffer);
                printf("\n");
            } else {
                printf("Error GetModuleFileNameEx : %lu\n", GetLastError());
            }
            CloseHandle(Handle);
        } else {
            printf("Error OpenProcess : %lu\n", GetLastError());
        }
    }

    FREE(pUdpTable);
4

0 回答 0