使用Win32 API获取当前活动TCP/UDP连接端口对应进程信息

admin 2021年9月14日14:28:49评论171 views字数 2759阅读9分11秒阅读模式

闲的蛋疼,写的小程序,首先感谢Sakura的帮助~
参考文献地址:GetTcpTable2的MSDN说明,其中的例子很详细,GetExtendedXXXTable虽然函数调用方式不一样但拿到的连接信息调用方式是一样的。
主要使用的API: GetTcpTable2和GetExtendedUdpTable(GetExtendedTcpTable)

  1. #include
  2. #include
  3. #include
  4. #include
  5. #pragma comment(lib, "iphlpapi.lib")
  6. #pragma comment(lib, "ws2_32.lib")
  7. typedef unsigned int uint;
  8. typedef QMultimap INFOMAP;
  9. #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
  10. #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
  11. bool GetProcessPort(INFOMAP& portmap)
  12. {
  13. portmap.clear();
  14. PMIB_TCPTABLE2 pTcpTable;
  15. ULONG ulSize = 0;
  16. DWORD dwRetVal = 0;
  17. char szLocalAddr[128];
  18. char szRemoteAddr[128];
  19. struct in_addr IpAddr;
  20. int i;
  21. pTcpTable = (MIB_TCPTABLE2 *) MALLOC(sizeof (MIB_TCPTABLE2));
  22. if (pTcpTable == NULL) {
  23. status=("Error allocating memoryn");
  24. return false;
  25. }
  26. ulSize = sizeof (MIB_TCPTABLE);
  27. // Make an initial call to GetTcpTable2 to
  28. // get the necessary size into the ulSize variable
  29. if ((dwRetVal = GetTcpTable2(pTcpTable, &ulSize, TRUE)) ==
  30. ERROR_INSUFFICIENT_BUFFER) {
  31. FREE(pTcpTable);
  32. pTcpTable = (MIB_TCPTABLE2 *) MALLOC(ulSize);
  33. if (pTcpTable == NULL) {
  34. status=("Error allocating memoryn");
  35. return false;
  36. }
  37. }
  38. // Make a second call to GetTcpTable2 to get
  39. // the actual data we require
  40. if ((dwRetVal = GetTcpTable2(pTcpTable, &ulSize, TRUE)) == NO_ERROR) {
  41. printf("tNumber of entries: %dn", (int) pTcpTable->dwNumEntries);
  42. for (i = 0; i dwNumEntries; i++) {
  43. uint portnum = ntohs((u_short)pTcpTable->table[i].dwLocalPort);
  44. uint pid = pTcpTable->table[i].dwOwningPid;
  45. portmap.insert(portnum,pid);
  46. }
  47. } else {
  48. status=QString("tGetTcpTable2 failed with %1n").arg(dwRetVal);
  49. FREE(pTcpTable);
  50. return false;
  51. }
  52. if (pTcpTable != NULL) {
  53. FREE(pTcpTable);
  54. pTcpTable = NULL;
  55. }
  56. MIB_UDPTABLE_OWNER_PID* pUdpTable;
  57. pUdpTable = (MIB_UDPTABLE_OWNER_PID *) MALLOC(sizeof (MIB_UDPTABLE_OWNER_PID));
  58. if (pUdpTable == NULL) {
  59. status=("Error allocating memoryn");
  60. return false;
  61. }
  62. ulSize = sizeof (MIB_UDPTABLE_OWNER_PID);
  63. if ((dwRetVal = GetExtendedUdpTable(pUdpTable, &ulSize, false,AF_INET,UDP_TABLE_OWNER_PID,0)) ==
  64. ERROR_INSUFFICIENT_BUFFER) {
  65. FREE(pUdpTable);
  66. pUdpTable = (MIB_UDPTABLE_OWNER_PID *) MALLOC(ulSize);
  67. if (pUdpTable == NULL) {
  68. status=("Error allocating memoryn");
  69. return false;
  70. }
  71. }
  72. if ((dwRetVal = GetExtendedUdpTable(pUdpTable, &ulSize, false,AF_INET,UDP_TABLE_OWNER_PID,0)) == NO_ERROR) {
  73. printf("tNumber of entries: %dn", (int) pUdpTable->dwNumEntries);
  74. for (i = 0; i dwNumEntries; i++) {
  75. uint portnum = ntohs((u_short)pUdpTable->table[i].dwLocalPort);
  76. uint pid = pUdpTable->table[i].dwOwningPid;
  77. portmap.insert(portnum,pid);
  78. }
  79. } else {
  80. status=QString("tGetTcpTable2 failed with %1n").arg(dwRetVal);
  81. FREE(pUdpTable);
  82. return false;
  83. }
  84. if (pUdpTable != NULL) {
  85. FREE(pUdpTable);
  86. pUdpTable = NULL;
  87. }
  88. return true;
  89. }

最终的进程pid<->端口信息存储在portmap这个multimap里面。(我用的QT做GUI,当然QMultimap可以换成其他任何map)
关于GetExtendedXXXTable需要注意的是,这个函数有不同的table参数可以传入,根据你想获得什么样的扩展信息,其他的和GetTcpTable2基本一致。

FROM :https://blog.flanker017.me/ | Author:Flanker

相关推荐: Less-23 Error Based No Comments

这一题它在输入的时候过滤了几个字符 $reg = "/#/"; $reg1 = "/--/"; $replace = ""; $id = preg_replace($reg, $replace, $i…

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月14日14:28:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用Win32 API获取当前活动TCP/UDP连接端口对应进程信息https://cn-sec.com/archives/542657.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息