主要的界面如下:
主要代码如下:
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 }
下载地址见后续博文。