VC++实现获取进程端口检测木马

来源:互联网 发布:永恒之塔捏脸数据女 编辑:程序博客网 时间:2024/05/01 05:43

我们都知道病毒木马都要与外面通信,如何检测呢,今天我们来时间检测进程端口来检测木马

请见代码与注释




[cpp] view plaincopyprint?
  1. #include <windows.h> 
  2. #include <Tlhelp32.h> 
  3. #include <winsock.h> 
  4. #include <stdio.h> 
  5. #pragma comment(lib, "ws2_32.lib") 
  6.  
  7. //--------------------------------------------------------------------------- 
  8. // 以下为与TCP相关的结构.  
  9. typedef struct tagMIB_TCPEXROW{ 
  10.     DWORD dwState;              // 连接状态. 
  11.     DWORD dwLocalAddr;         // 本地计算机地址. 
  12.     DWORD dwLocalPort;          // 本地计算机端口. 
  13.     DWORD dwRemoteAddr;        // 远程计算机地址. 
  14.     DWORD dwRemotePort;         // 远程计算机端口. 
  15.     DWORD dwProcessId; 
  16. } MIB_TCPEXROW, *PMIB_TCPEXROW; 
  17.  
  18. typedef struct tagMIB_TCPEXTABLE{ 
  19.     DWORD dwNumEntries; 
  20.     MIB_TCPEXROW table[100];    // 任意大小数组变量. 
  21. } MIB_TCPEXTABLE, *PMIB_TCPEXTABLE; 
  22.  
  23. //--------------------------------------------------------------------------- 
  24. // 以下为与UDP相关的结构.  
  25. typedef struct tagMIB_UDPEXROW{ 
  26.     DWORD dwLocalAddr;          // 本地计算机地址. 
  27.     DWORD dwLocalPort;         // 本地计算机端口. 
  28.     DWORD dwProcessId; 
  29. } MIB_UDPEXROW, *PMIB_UDPEXROW; 
  30.  
  31. typedef struct tagMIB_UDPEXTABLE{ 
  32.     DWORD dwNumEntries; 
  33.     MIB_UDPEXROW table[100];    // 任意大小数组变量. 
  34. } MIB_UDPEXTABLE, *PMIB_UDPEXTABLE; 
  35.  
  36. //--------------------------------------------------------------------------- 
  37. // 所用的iphlpapi.dll中的函数原型定义. 
  38. typedef DWORD (WINAPI *PALLOCATE_AND_GET_TCPEXTABLE_FROM_STACK)( 
  39.     PMIB_TCPEXTABLE *pTcpTable, // 连接表缓冲区. 
  40.     BOOL bOrder,                 
  41.     HANDLE heap, 
  42.     DWORD zero, 
  43.     DWORD flags 
  44.     ); 
  45.  
  46. typedef DWORD (WINAPI *PALLOCATE_AND_GET_UDPEXTABLE_FROM_STACK)( 
  47.     PMIB_UDPEXTABLE *pUdpTable, // 连接表缓冲区. 
  48.     BOOL bOrder,                 
  49.     HANDLE heap, 
  50.     DWORD zero, 
  51.     DWORD flags 
  52.     ); 
  53.  
  54. static PALLOCATE_AND_GET_TCPEXTABLE_FROM_STACK 
  55.           pAllocateAndGetTcpExTableFromStack = NULL; 
  56.  
  57. static PALLOCATE_AND_GET_UDPEXTABLE_FROM_STACK 
  58.           pAllocateAndGetUdpExTableFromStack = NULL; 
  59.  
  60. //--------------------------------------------------------------------------- 
  61. // 
  62. // 可能的 TCP 端点状态. 
  63. // 
  64. static char TcpState[][32] = { 
  65.     TEXT("???"), 
  66.     TEXT("CLOSED"), 
  67.     TEXT("LISTENING"), 
  68.     TEXT("SYN_SENT"), 
  69.     TEXT("SYN_RCVD"), 
  70.     TEXT("ESTABLISHED"), 
  71.     TEXT("FIN_WAIT1"), 
  72.     TEXT("FIN_WAIT2"), 
  73.     TEXT("CLOSE_WAIT"), 
  74.     TEXT("CLOSING"), 
  75.     TEXT("LAST_ACK"), 
  76.     TEXT("TIME_WAIT"), 
  77.     TEXT("DELETE_TCB"
  78. }; 
  79.  
  80. //--------------------------------------------------------------------------- 
  81. // 
  82. // 生成IP地址字符串. 
  83. // 
  84. PCHAR GetIP(unsigned int ipaddr) 
  85.     static char pIP[20]; 
  86.     unsigned int nipaddr = htonl(ipaddr); 
  87.     sprintf(pIP, "%d.%d.%d.%d"
  88.         (nipaddr >>24) &0xFF, 
  89.         (nipaddr>>16) &0xFF, 
  90.         (nipaddr>>8) &0xFF, 
  91.         (nipaddr)&0xFF); 
  92.     return pIP; 
  93.  
  94. //--------------------------------------------------------------------------- 
  95. // 
  96. // 由进程号获得全程文件名. 
  97. // 
  98. char* ProcessPidToName(DWORD ProcessId) 
  99.     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  100.     PROCESSENTRY32 processEntry = { 0 }; 
  101.     processEntry.dwSize = sizeof(PROCESSENTRY32);  
  102.     static char ProcessName[256]; 
  103.      
  104.     lstrcpy(ProcessName, "Idle"); 
  105.     if (hProcessSnap == INVALID_HANDLE_VALUE)  
  106.         return ProcessName; 
  107.      
  108.     BOOL bRet=Process32First(hProcessSnap, &processEntry); 
  109.      
  110.     while(bRet)  
  111.     { 
  112.         if (processEntry.th32ProcessID == ProcessId) 
  113.         { 
  114.             MODULEENTRY32 me32 = {0};  
  115.             me32.dwSize = sizeof(MODULEENTRY32);  
  116.             HANDLE hModuleSnap = CreateToolhelp32Snapshot 
  117.                 (TH32CS_SNAPMODULE, processEntry.th32ProcessID);  
  118.  
  119.             Module32First(hModuleSnap, &me32); // 获得全程路径. 
  120.             lstrcpy(ProcessName, me32.szExePath); 
  121.             CloseHandle(hProcessSnap); 
  122.             return ProcessName; 
  123.         } 
  124.  
  125.         bRet=Process32Next(hProcessSnap, &processEntry); 
  126.     }    
  127.      
  128.     CloseHandle(hProcessSnap); 
  129.     return ProcessName; 
  130.  
  131. //--------------------------------------------------------------------------- 
  132. // 
  133. // 显示进程、端口和文件名之间的关联. 
  134. // 
  135. void DisplayPort() 
  136.     DWORD i; 
  137.     PMIB_TCPEXTABLE TCPExTable; 
  138.     PMIB_UDPEXTABLE UDPExTable; 
  139.     char szLocalAddress[256]; 
  140.     char szRemoteAddress[256]; 
  141.  
  142.     if(pAllocateAndGetTcpExTableFromStack( 
  143.         &TCPExTable, TRUE, GetProcessHeap(), 2, 2)) 
  144.     { 
  145.         printf("AllocateAndGetTcpExTableFromStack Error!\n"); 
  146.         return
  147.     } 
  148.  
  149.     if(pAllocateAndGetUdpExTableFromStack 
  150.         (&UDPExTable, TRUE, GetProcessHeap(), 2, 2 )) 
  151.     { 
  152.         printf("AllocateAndGetUdpExTableFromStack Error!.\n"); 
  153.         return
  154.     } 
  155.  
  156.     // 获得TCP列表. 
  157.     printf("%-6s%-22s%-22s%-11s%s\n"
  158.         TEXT("Proto"), 
  159.         TEXT("Local Address"), 
  160.         TEXT("Foreign Address"), 
  161.         TEXT("State"), 
  162.         TEXT("Process")); 
  163.  
  164.     for( i = 0; i <TCPExTable->dwNumEntries; i++ ) 
  165.     { 
  166.         sprintf( szLocalAddress, "%s:%d"
  167.             GetIP(TCPExTable->table[i].dwLocalAddr), 
  168.             htons( (WORD) TCPExTable->table[i].dwLocalPort)); 
  169.  
  170.         sprintf( szRemoteAddress, "%s:%d"
  171.             GetIP(TCPExTable->table[i].dwRemoteAddr), 
  172.             htons((WORD)TCPExTable->table[i].dwRemotePort)); 
  173.          
  174.         printf("%-6s%-22s%-22s%-11s%s:%d\n", TEXT("TCP"), 
  175.             szLocalAddress, szRemoteAddress, 
  176.             TcpState[TCPExTable->table[i].dwState], 
  177.             ProcessPidToName(TCPExTable->table[i].dwProcessId), 
  178.             TCPExTable->table[i].dwProcessId); 
  179.     } 
  180.  
  181.     // 获得UDP列表. 
  182.     for( i = 0; i < UDPExTable->dwNumEntries; i++ ) 
  183.     { 
  184.         sprintf( szLocalAddress, "%s:%d"
  185.             GetIP(UDPExTable->table[i].dwLocalAddr), 
  186.             htons((WORD)UDPExTable->table[i].dwLocalPort)); 
  187.  
  188.         sprintf( szRemoteAddress, "%s","*:*"); 
  189.  
  190.         printf("%-6s%-22s%-33s%s:%d\n", TEXT("UDP"), 
  191.             szLocalAddress, szRemoteAddress, 
  192.             ProcessPidToName(UDPExTable->table[i].dwProcessId), 
  193.             UDPExTable->table[i].dwProcessId); 
  194.     } 
  195.  
  196. //--------------------------------------------------------------------------- 
  197. // 
  198. // 进程与端口关联程序的主函数. 
  199. // 
  200. void main() 
  201.     WSADATA WSAData; 
  202.     if( WSAStartup(MAKEWORD(1, 1), &WSAData )) 
  203.     { 
  204.         printf("WSAStartup error!\n"); 
  205.         return
  206.     } 
  207.  
  208.     HMODULE hIpDLL = LoadLibrary("iphlpapi.dll"); 
  209.     if ( !hIpDLL) 
  210.         return
  211.  
  212.     pAllocateAndGetTcpExTableFromStack = 
  213.         (PALLOCATE_AND_GET_TCPEXTABLE_FROM_STACK)  
  214.         GetProcAddress( hIpDLL, "AllocateAndGetTcpExTableFromStack"); 
  215.      
  216.     pAllocateAndGetUdpExTableFromStack = 
  217.        (PALLOCATE_AND_GET_UDPEXTABLE_FROM_STACK)  
  218.         GetProcAddress(hIpDLL, "AllocateAndGetUdpExTableFromStack" ); 
  219.     
  220.     // 显示进程与端口关联. 
  221.     DisplayPort(); 
  222.       
  223.     FreeLibrary(hIpDLL); 
  224.     WSACleanup(); 
  225.  
  226.     getchar();  // 暂停. 

原文:http://blog.csdn.net/yincheng01/article/details/8110140

原创粉丝点击