PortScanDlg.cpp
上传用户:zhyl198712
上传日期:2013-02-03
资源大小:35k
文件大小:11k
源码类别:

扫描程序

开发平台:

Visual C++

  1. // PortScanDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PortScan.h"
  5. #include "PortScanDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. //#include <Winsock2.h>
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. int v; //
  15. UINT m_nCounter; //循环中的端口值
  16. BOOL m_bIsSinglePort; //是不是单端口
  17. UINT m_nPortFrom,m_nPortTo; //端口范围
  18. CString m_sIP;      //ip地址
  19. int listCounter; //列表框的纪录行数
  20. int m_nThreadNumber; //开启线程数
  21. struct thread m_thread;
  22. class CAboutDlg : public CDialog
  23. {
  24. public:
  25. CAboutDlg();
  26. // Dialog Data
  27. //{{AFX_DATA(CAboutDlg)
  28. enum { IDD = IDD_ABOUTBOX };
  29. //}}AFX_DATA
  30. // ClassWizard generated virtual function overrides
  31. //{{AFX_VIRTUAL(CAboutDlg)
  32. protected:
  33. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  34. //}}AFX_VIRTUAL
  35. // Implementation
  36. protected:
  37. //{{AFX_MSG(CAboutDlg)
  38. //}}AFX_MSG
  39. DECLARE_MESSAGE_MAP()
  40. };
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  42. {
  43. //{{AFX_DATA_INIT(CAboutDlg)
  44. //}}AFX_DATA_INIT
  45. }
  46. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  47. {
  48. CDialog::DoDataExchange(pDX);
  49. //{{AFX_DATA_MAP(CAboutDlg)
  50. //}}AFX_DATA_MAP
  51. }
  52. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  53. //{{AFX_MSG_MAP(CAboutDlg)
  54. // No message handlers
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CPortScanDlg dialog
  59. CPortScanDlg::CPortScanDlg(CWnd* pParent /*=NULL*/)
  60. : CDialog(CPortScanDlg::IDD, pParent)
  61. {
  62. //{{AFX_DATA_INIT(CPortScanDlg)
  63. //}}AFX_DATA_INIT
  64. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  65. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  66. m_bIsSinglePort=TRUE;
  67. }
  68. CPortScanDlg::~CPortScanDlg()
  69. {
  70. WSACleanup();
  71. }
  72. void CPortScanDlg::DoDataExchange(CDataExchange* pDX)
  73. {
  74. CDialog::DoDataExchange(pDX);
  75. //{{AFX_DATA_MAP(CPortScanDlg)
  76. DDX_Control(pDX, IDC_THREADNUMBER, m_threadNumber);
  77. DDX_Control(pDX, IDC_BUTTONSTOP, m_buttonStop);
  78. DDX_Control(pDX, IDC_BUTTONSCAN, m_buttonStart);
  79. DDX_Control(pDX, IDC_STATIC_PROMPT, m_prompt);
  80. DDX_Control(pDX, IDC_PROGRESS_SCAN, m_progressScan);
  81. DDX_Control(pDX, IDC_EDIT_PORT_FROM, m_portFrom);
  82. DDX_Control(pDX, IDC_EDIT_PORT_TO, m_portTo);
  83. DDX_Control(pDX, IDC_EDIT_SINGLE_PORT, m_singlePort);
  84. DDX_Control(pDX, IDC_IP_ADDRESS, m_IP);
  85. DDX_Control(pDX, IDC_LISTINFO, m_listInfo);
  86. //}}AFX_DATA_MAP
  87. }
  88. BEGIN_MESSAGE_MAP(CPortScanDlg, CDialog)
  89. ON_MESSAGE(WM_USER_PRINT_START,OnPrintStart)
  90. //{{AFX_MSG_MAP(CPortScanDlg)
  91. ON_WM_SYSCOMMAND()
  92. ON_WM_PAINT()
  93. ON_WM_QUERYDRAGICON()
  94. ON_BN_CLICKED(IDC_RADIO_SINGLE, OnRadioSingle)
  95. ON_BN_CLICKED(IDC_RADIO_MULTI, OnRadioMulti)
  96. ON_BN_CLICKED(IDC_BUTTONSCAN, OnButtonscan)
  97. ON_BN_CLICKED(IDC_BUTTONSTOP, OnButtonstop)
  98. ON_BN_CLICKED(IDC_BUTTONABOUT, OnButtonabout)
  99. //}}AFX_MSG_MAP
  100. END_MESSAGE_MAP()
  101. /////////////////////////////////////////////////////////////////////////////
  102. // CPortScanDlg message handlers
  103. BOOL CPortScanDlg::OnInitDialog()
  104. {
  105. CDialog::OnInitDialog();
  106. // Add "About..." menu item to system menu.
  107. // IDM_ABOUTBOX must be in the system command range.
  108. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  109. ASSERT(IDM_ABOUTBOX < 0xF000);
  110. CMenu* pSysMenu = GetSystemMenu(FALSE);
  111. if (pSysMenu != NULL)
  112. {
  113. CString strAboutMenu;
  114. strAboutMenu.LoadString(IDS_ABOUTBOX);
  115. if (!strAboutMenu.IsEmpty())
  116. {
  117. pSysMenu->AppendMenu(MF_SEPARATOR);
  118. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  119. }
  120. }
  121. // Set the icon for this dialog.  The framework does this automatically
  122. //  when the application's main window is not a dialog
  123. SetIcon(m_hIcon, TRUE); // Set big icon
  124. SetIcon(m_hIcon, FALSE); // Set small icon
  125. //单选按钮
  126. CheckRadioButton(IDC_RADIO_SINGLE,IDC_RADIO_MULTI,IDC_RADIO_SINGLE);
  127. m_portFrom.EnableWindow(FALSE);
  128. m_portTo.EnableWindow(FALSE);
  129. m_buttonStop.EnableWindow(FALSE);
  130. //初始化信息列表框
  131. m_listInfo.InsertColumn(0,"IP地址",LVCFMT_LEFT,0,0);
  132. m_listInfo.InsertColumn(1,"开放的端口",LVCFMT_LEFT,0,0);
  133. m_listInfo.SetColumnWidth(0,150);
  134. m_listInfo.SetColumnWidth(1,150);
  135. //默认的IP地址
  136. m_IP.SetAddress(172,21,41,200);
  137. //默认的线程个数
  138. m_threadNumber.SetWindowText("200");
  139. //开始winsock
  140. WSADATA wsaData;  
  141.     if(WSAStartup(0x0002, &wsaData ))
  142.     {
  143.         AfxMessageBox("Init TCP/IP stack error!");
  144.         return 1;
  145.     }
  146.     if(wsaData.wVersion != 0x0002)
  147.     {
  148.         printf("Winsock version is incorrect!");
  149.         WSACleanup();
  150.         return 1;
  151.     }
  152. return TRUE;  // return TRUE  unless you set the focus to a control
  153. }
  154. void CPortScanDlg::OnSysCommand(UINT nID, LPARAM lParam)
  155. {
  156. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  157. {
  158. CAboutDlg dlgAbout;
  159. dlgAbout.DoModal();
  160. }
  161. else
  162. {
  163. CDialog::OnSysCommand(nID, lParam);
  164. }
  165. }
  166. // If you add a minimize button to your dialog, you will need the code below
  167. //  to draw the icon.  For MFC applications using the document/view model,
  168. //  this is automatically done for you by the framework.
  169. void CPortScanDlg::OnPaint() 
  170. {
  171. if (IsIconic())
  172. {
  173. CPaintDC dc(this); // device context for painting
  174. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  175. // Center icon in client rectangle
  176. int cxIcon = GetSystemMetrics(SM_CXICON);
  177. int cyIcon = GetSystemMetrics(SM_CYICON);
  178. CRect rect;
  179. GetClientRect(&rect);
  180. int x = (rect.Width() - cxIcon + 1) / 2;
  181. int y = (rect.Height() - cyIcon + 1) / 2;
  182. // Draw the icon
  183. dc.DrawIcon(x, y, m_hIcon);
  184. }
  185. else
  186. {
  187. CDialog::OnPaint();
  188. }
  189. }
  190. // The system calls this to obtain the cursor to display while the user drags
  191. //  the minimized window.
  192. HCURSOR CPortScanDlg::OnQueryDragIcon()
  193. {
  194. return (HCURSOR) m_hIcon;
  195. }
  196. void CPortScanDlg::OnRadioSingle() 
  197. {
  198. m_bIsSinglePort=TRUE;
  199. m_singlePort.EnableWindow(TRUE);
  200. m_portFrom.EnableWindow(FALSE);
  201. m_portTo.EnableWindow(FALSE);
  202. }
  203. void CPortScanDlg::OnRadioMulti() 
  204. {
  205. m_bIsSinglePort=FALSE;
  206. m_singlePort.EnableWindow(FALSE);
  207. m_portFrom.EnableWindow(TRUE);
  208. m_portTo.EnableWindow(TRUE);
  209. }
  210. void CPortScanDlg::OnButtonscan() 
  211. {
  212. CString ip;
  213. BYTE f1,f2,f3,f4;
  214. char temp[10];
  215. m_listInfo.DeleteAllItems();
  216. listCounter=0;
  217. /****获取IP地址****/
  218. if(m_IP.IsBlank())
  219. {
  220. MessageBox("请输入IP地址",_T("错误"),MB_ICONWARNING|MB_OK);
  221. return;
  222. }
  223. if(m_IP.GetAddress(f1,f2,f3,f4)<4)
  224. {
  225. MessageBox("请输入完整的IP地址",_T("错误"),MB_ICONWARNING|MB_OK);
  226. return;
  227. }
  228. ip=itoa(f1,temp,10);
  229. ip+=_T(".");
  230. ip+=itoa(f2,temp,10);
  231. ip+=_T(".");
  232. ip+=itoa(f3,temp,10);
  233. ip+=_T(".");
  234. ip+=itoa(f4,temp,10);
  235. m_sIP=ip;
  236. /**********************/
  237. /***获取端口地址****/
  238. if(m_bIsSinglePort==TRUE)
  239. {
  240. CString strPort;
  241. m_singlePort.GetWindowText(strPort);
  242. m_nPortFrom=m_nPortTo=atoi(strPort);
  243. }
  244. else
  245. {
  246. CString strPort;
  247. m_portFrom.GetWindowText(strPort);
  248. m_nPortFrom=atoi(strPort);
  249. m_portTo.GetWindowText(strPort);
  250. m_nPortTo=atoi(strPort);
  251. }
  252. if(m_nPortFrom>m_nPortTo)
  253. {
  254. MessageBox("开始端口要小于结束端口",_T("错误"),MB_ICONWARNING|MB_OK);
  255. return;
  256. }
  257. /**********************/
  258. /*********取得开启线程数*****/
  259. char strThreadNumber[10];
  260. m_threadNumber.GetWindowText(strThreadNumber,10);
  261. m_nThreadNumber=atoi(strThreadNumber);
  262. if(m_nThreadNumber>1000)
  263. {
  264. AfxMessageBox("最大线程数不能超过1000");
  265. return;
  266. }
  267. m_buttonStart.EnableWindow(FALSE);
  268. m_buttonStop.EnableWindow(TRUE);
  269. /*********设置进度条**************/
  270. m_progressScan.SetRange32(0,m_nPortTo-m_nPortFrom+1);
  271. m_progressScan.SetStep(1);
  272. /********** v是批量创建线程的次数*************/
  273. if(m_nPortFrom==m_nPortTo)
  274. {
  275. v=1;
  276. }
  277. else
  278. {
  279. v=(m_nPortTo-m_nPortFrom+1)/m_nThreadNumber;
  280. if((m_nPortTo-m_nPortFrom+1)%m_nThreadNumber > 0)
  281. {
  282. v++;
  283. }
  284. }
  285. m_thread.m_hwnd=this->m_hWnd;
  286. m_thread.ip=m_sIP;
  287. m_nCounter=m_nPortFrom;
  288. AfxBeginThread((AFX_THREADPROC)threadM,NULL);
  289. }
  290. //一个独立线程,主要是处理循环,与窗体脱离,提高窗体的反应能力
  291. UINT threadM(LPVOID pParam)
  292. {
  293. CPortScanDlg *dlg=(CPortScanDlg*)AfxGetApp()->GetMainWnd();
  294. /*********创建互斥量************/
  295. HANDLE hCounter=NULL;
  296. if( (hCounter=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44"))==NULL)
  297. {
  298. //如果没有其他进程创建这个互斥量,则重新创建
  299. hCounter = CreateMutex(NULL,FALSE,"sam sp 44");
  300. }
  301. CWinThread *pT[1001];
  302. HANDLE hThread[1001];
  303. for(int i=0;i<v;i++)
  304. {
  305. int nThreadCounter=0;//每次批量创建的线程实际个数,最后一次是一个余数值
  306. int k;
  307. for(k=0;k<m_nThreadNumber;k++)
  308. {
  309. if(m_nCounter>m_nPortTo)
  310. {
  311. break;
  312. }
  313. //设置扫描进度提示
  314. char temp[10];
  315. memset(temp,0,10);
  316. itoa(m_nCounter,temp,10);
  317. CString strTemp=(CString)temp;
  318. dlg->m_prompt.SetWindowText("端口:"+strTemp);
  319. //内循环计数
  320. nThreadCounter++;
  321. dlg->m_progressScan.StepIt();
  322. pT[k]=AfxBeginThread((AFX_THREADPROC)threadA,&m_thread);
  323. hThread[k]=pT[k]->m_hThread;
  324. Sleep(5);
  325. }
  326. hThread[k]=NULL;//非常重要,如果不加这一句的话,会经常出错,有点奇怪
  327. //如果k=0,表示没有开启线程
  328. if(k!=0)
  329. {
  330. //WaitForMultipleObjects(nThreadCounter,hThread,TRUE,INFINITE);
  331. WaitForMultipleObjects(nThreadCounter,hThread,TRUE,500);
  332. }
  333. }
  334. CloseHandle(hCounter);
  335. //设置提示
  336. dlg->m_buttonStart.EnableWindow(TRUE);
  337. dlg->m_buttonStop.EnableWindow(FALSE);
  338. dlg->m_prompt.SetWindowText(_T(""));
  339. dlg->m_progressScan.SetPos(0);
  340. AfxEndThread(0);
  341. return 0;
  342. }
  343. //核心线程体
  344. UINT threadA(LPVOID pParam)
  345. {
  346. struct thread *threada=(struct thread*)pParam;
  347. //在内部重新打开互斥量
  348. HANDLE hCounterIn=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44");
  349. WaitForSingleObject(hCounterIn,INFINITE);
  350. UINT v=m_nCounter;
  351. m_nCounter++;
  352. ReleaseMutex(hCounterIn);
  353. CloseHandle(hCounterIn);
  354.  
  355. struct sockaddr_in sin;
  356.   
  357. SOCKET sd;
  358.     int IpPort;
  359. char IpAddr[16];
  360. strcpy(IpAddr,threada->ip);
  361. IpPort=v;
  362.     // Create the local socket
  363.     if ((sd = socket (AF_INET, SOCK_STREAM, IPPROTO_IP)) == INVALID_SOCKET) {
  364.         printf("Create socket error!");
  365.         return 1;
  366.     }
  367.     // Connect to the victim IP Address
  368.     sin.sin_family=AF_INET;
  369.     sin.sin_addr.s_addr=inet_addr(IpAddr);
  370.     sin.sin_port=htons((short)IpPort);
  371.     if (connect (sd, (struct sockaddr *)&sin, sizeof (sin)) == SOCKET_ERROR) {
  372.         printf("Connect the remote IP error!");
  373.         closesocket (sd);
  374.         return 1;
  375.     }
  376. else
  377. {
  378. ::PostMessage(threada->m_hwnd,WM_USER_PRINT_START,v,0);
  379. }
  380.     closesocket (sd);
  381. return 0;
  382. }
  383. LRESULT CPortScanDlg::OnPrintStart(WPARAM wParam,LPARAM lParam)
  384. {
  385. int port=(int)wParam;
  386. char temp[10];
  387. memset(temp,0,10);
  388. itoa(port,temp,10);
  389. m_listInfo.InsertItem(listCounter,m_sIP,0);
  390. m_listInfo.SetItemText(listCounter,1,temp);
  391. listCounter++;
  392. return 0;
  393. }
  394. void CPortScanDlg::OnButtonstop() 
  395. {
  396. m_nCounter=m_nPortTo+1;
  397. m_buttonStart.EnableWindow(TRUE);
  398. m_buttonStop.EnableWindow(FALSE);
  399. }
  400. void CPortScanDlg::OnButtonabout() 
  401. {
  402. CAboutDlg dlg;
  403. dlg.DoModal();
  404. }