Socket2实现tcp端口扫描

主要的界面如下:

主要代码如下:

1 //对于每一个线程,传过去的参数
2 typedef struct ThreadParamStruct
3 {
4     CString strIP;            //要扫描的IP地址
5     UINT  uPort;            //要扫描的端口
6     BOOL  bNoOrder;            //是否按照随机的顺序扫描
7     CPortScan_TCPDlg *ptr;    //指向父线程的对话框
8     HTREEITEM TreeItem;        //指向结果要显示的树型控件节点
9 }THREADPARAM;
 1 UINT ThreadCSocket2Scan(LPVOID pParam)
 2 {
 3     THREADPARAM *threadparam = (THREADPARAM*)pParam;
 4     CString strIP = threadparam->strIP;
 5     UINT uPort = threadparam->uPort;
 6     CPortScan_TCPDlg *ptr = threadparam->ptr;
 7     HTREEITEM TreeItem = threadparam->TreeItem;
 8     BOOL bNoOrder = threadparam->bNoOrder;
 9     
10     g_iTotalThreadCount++;
11     if (bNoOrder)
12     {
13         Sleep(rand() % 3000);
14     }
15 
16     SOCKET sock = -1;
17     sock = socket(AF_INET, SOCK_STREAM, 0);
18     if (sock == SOCKET_ERROR)
19     {
20         return 1;
21     }
22 
23     int iTimeOut = 1000;
24     if (SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (TCHAR*)&iTimeOut, sizeof(iTimeOut)))
25     {
26         g_iTotalThreadCount--;
27         closesocket(sock);
28         return 2;
29     }
30     iTimeOut = 1000;
31     if (SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (TCHAR*)&iTimeOut, sizeof(iTimeOut)))
32     {
33         g_iTotalThreadCount--;
34         closesocket(sock);
35         return 3;
36     }
37 
38     SOCKADDR_IN addr_remote;
39     addr_remote.sin_family = AF_INET;
40     addr_remote.sin_addr.S_un.S_addr = inet_addr(strIP);
41     addr_remote.sin_port = htons(uPort);
42     if (0 != connect(sock, (PSOCKADDR)&addr_remote, sizeof(addr_remote)))
43     {
44         g_iTotalThreadCount--;
45         closesocket(sock);
46         return 4;
47     }
48 
49     CString strTemp;
50     if (uPort < 1024)
51     {
52         struct servent *se;
53         se = getservbyport(htons(uPort), _T("tcp"));
54         if (se != NULL)
55         {
56             strTemp.Format(_T("%d %s"), uPort, se->s_name);
57         }
58         else
59         {
60             strTemp.Format(_T("%d"), uPort);
61         }
62     }
63     else
64     {
65         strTemp.Format(_T("%d %s"), uPort, ptr->GetPortName(uPort, TRUE));
66     }
67     ptr->m_wndTreeResult.InsertItem(strTemp, 2, 2, TreeItem);
68 
69     shutdown(sock, 2);
70     closesocket(sock);
71     g_iTotalThreadCount--;
72     return 0;
73 }
 1 CString CPortScan_TCPDlg::GetPortName(UINT uPort, BOOL bIsTCP)
 2 {
 3     CString strRet;
 4     if (bIsTCP)
 5     {
 6         switch (uPort)
 7         {
 8         case 1024:
 9         case 1025:
10         case 1026:strRet = _T("常用动态分配的TCP端口"); break;
11         case 1080:strRet = _T("WinGate,IRC等防火墙管道"); break;
12         case 1243:strRet = _T("Sub-7木马"); break;
13         case 1433:strRet = _T("MSSQL数据库服务端口"); break;
14         case 1524:strRet = _T("ingreslock后门"); break;
15         case 2049:strRet = _T("NFS程序常用端口"); break;
16         case 3128:strRet = _T("Squid HTTP代理服务器"); break;
17         case 3306:strRet = _T("MySQL数据库服务端口"); break;
18         case 5632:strRet = _T("pcAnywere常用端口"); break;
19         case 31337:strRet = _T("Back Orifice"); break;
20         default:strRet = _T(""); break;
21         }
22     }
23     else
24     {
25         switch (uPort)
26         {
27         case 1024:
28         case 1025:
29         case 1026:strRet = _T("常用动态分配的UDP端口"); break;
30         case 31789:strRet = _T("Hack-a-tack远程访问木马"); break;
31         default:strRet = _T(""); break;
32         }
33     }
34     return strRet;
35 }

下载地址见后续博文。

原文地址:https://www.cnblogs.com/qiyueliuguang/p/3496595.html