我试图弄清楚如何获取给定进程的所有网络活动。在“网络活动”框中的 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);