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 }

下載地址見后續博文。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM