我试图弄清楚如何获得给定进程的所有网络活动。在Windows的“网络活动”框中的“资源监视器”应用程序中,您可以看到所有tcp / udp连接以及正在发送的数据。我首先尝试使用cmd netstat,并打算对此进行解析,但很快意识到它“丢失”了很多udp连接。这样就出来了。现在,我一直在研究在c ++中使用iphlpapi.h
及其GetExtendedUdpTable
函数。但这似乎并没有显示Resource Monitor显示的所有数据。任何人都可以将我定向到正确的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);