NetPage.cpp
上传用户:shouhua
上传日期:2014-12-06
资源大小:5685k
文件大小:16k
源码类别:

杀毒

开发平台:

Visual C++

  1. // NetPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "AntiEvilTools.h"
  5. #include "NetPage.h"
  6. #include "mstcpip.h"
  7. #include "iphlpapi.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. SOCKET SockRaw;
  14. char TcpFlag[6]={'F','S','R','P','A','U'}; //定义TCP标志位
  15. BOOL ParamTcp =false; // 关注TCP 报文
  16. BOOL ParamUdp =false; // 关注UDP 报文
  17. BOOL ParamIcmp =false; // 关注ICMP报文
  18. char *strFromIpFilter=NULL; // 源IP地址过滤
  19. char *strDestIpFilter=NULL; // 目的地址过滤
  20. char *strSensitive=NULL; // 敏感字符串
  21. int  iPortFilter=0; // 端口过滤
  22. int iProtocol, iTTL;
  23. unsigned char IP1[4],IP2[4];
  24. //char szProtocol[MAX_PROTO_TEXT_LEN];
  25. //char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN];
  26. int DecodeTcpPack(char *, int); //TCP解包函数
  27. int DecodeUdpPack(char *, int); //UDP解包函数
  28. int DecodeIcmpPack(char *, int); //ICMP解包函数
  29. void CheckSockError(int, char*); //出错处理函数
  30. CString Port1,Port2;
  31. long total_num1=1; //全局变量,用于计数监听到的数据包的数量
  32. PROTN2T aOfProto [ PROTO_NUM + 1] = //为子协议映射表赋值
  33. {  
  34. { IPPROTO_IP   , "IP" },
  35. { IPPROTO_ICMP , "ICMP" },  
  36. { IPPROTO_IGMP , "IGMP" }, 
  37. { IPPROTO_GGP  , "GGP" },  
  38. { IPPROTO_TCP  , "TCP" },  
  39. { IPPROTO_PUP  , "PUP" },  
  40. { IPPROTO_UDP  , "UDP" },  
  41. { IPPROTO_IDP  , "IDP" },  
  42. { IPPROTO_ND   , "NP"  },  
  43. { IPPROTO_RAW  , "RAW" },  
  44. { IPPROTO_MAX  , "MAX" },
  45. { NULL , "" } 
  46. } ;  
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CNetPage property page
  49. IMPLEMENT_DYNCREATE(CNetPage, CPropertyPage)
  50. CNetPage::CNetPage() : CPropertyPage(CNetPage::IDD)
  51. {
  52. //{{AFX_DATA_INIT(CNetPage)
  53. m_check1 = TRUE;
  54. m_check2 = FALSE;
  55. m_check3 = FALSE;
  56. //}}AFX_DATA_INIT
  57. m_threadID = 0  ;
  58. m_Multihomed = FALSE ;
  59. m_Local    = TRUE ;
  60. }
  61. CNetPage::~CNetPage()
  62. {
  63. }
  64. void CNetPage::DoDataExchange(CDataExchange* pDX)
  65. {
  66. CPropertyPage::DoDataExchange(pDX);
  67. //{{AFX_DATA_MAP(CNetPage)
  68. DDX_Control(pDX, IDC_LIST2, m_ctrList);
  69. DDX_Control(pDX, IDC_IPADDRESS2, m_ip2);
  70. DDX_Control(pDX, IDC_IPADDRESS1, m_ip1);
  71. DDX_Control(pDX, IDC_BUTTON1, m_start);
  72. DDX_Check(pDX, IDC_CHECK1, m_check1);
  73. DDX_Check(pDX, IDC_CHECK2, m_check2);
  74. DDX_Check(pDX, IDC_CHECK3, m_check3);
  75. //}}AFX_DATA_MAP
  76. }
  77. BEGIN_MESSAGE_MAP(CNetPage, CPropertyPage)
  78. //{{AFX_MSG_MAP(CNetPage)
  79. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CNetPage message handlers
  84. void CNetPage::OnButton1() 
  85. {
  86. // TODO: Add your control notification handler code here
  87. UpdateData(TRUE);
  88. // TODO: Add your control notification handler code here
  89. char        szErr [ 50 ] , szHostName[MAX_PATH];
  90. DWORD       dwErr ;
  91.     SOCKADDR_IN sa;
  92. ParamTcp= m_check1;
  93.  ParamUdp =m_check2; // 关注UDP 报文
  94.  ParamIcmp =m_check3;
  95.   //  m_check1 = true;
  96. // m_check2 = true;
  97. // m_check3 = true;
  98.  m_ip1.GetAddress(IP1[0],IP1[1],IP1[2],IP1[3]);
  99.  m_ip2.GetAddress(IP2[0],IP2[1],IP2[2],IP2[3]);
  100.  
  101. GetDlgItemText(IDC_EDIT1,Port1);
  102. GetDlgItemText(IDC_EDIT2,Port2);
  103. gethostname(szHostName, sizeof(szHostName)) ; //得到本机主机名
  104. m_iphostsource = m_ipsource ;
  105.     
  106.   m_ipcheckedhost = ntohl(m_iphost) ;
  107. {
  108. CString str ;
  109. if( 0 == m_threadID ) //判断是否有监听线程在执行
  110. {
  111. str.LoadString( IDS_STOP ) ;
  112. m_start.SetWindowText( str ) ;
  113. }
  114. else
  115. {
  116. if( m_threadID ) //如果有线程,则向存在的线程发送结束消息
  117. {
  118.               PostThreadMessage(m_threadID,WM_CLOSE,0,0) ;
  119.     str.LoadString( IDS_START ) ;
  120.         m_start.SetWindowText( str ) ;
  121. m_start.EnableWindow(FALSE) ;
  122. }
  123. return ;
  124. }
  125.      DWORD dwBufferLen[10] ;
  126. DWORD dwBufferInLen= 1 ;
  127. DWORD dwBytesReturned = 0 ;
  128. m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ; //创建socket连接
  129. if( INVALID_SOCKET == m_s )
  130. {
  131. dwErr = WSAGetLastError() ;
  132. sprintf( szErr , "Error socket() = %ld " , dwErr ) ;
  133. AfxMessageBox( szErr ) ;
  134. closesocket( m_s ) ;
  135. return ;
  136. }
  137. int rcvtimeo = 5000 ; //设置套字节超时选项
  138.         if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
  139. {
  140. dwErr = WSAGetLastError() ;
  141. sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
  142. AfxMessageBox( szErr ) ;
  143. closesocket( m_s ) ;
  144. return ;
  145. }
  146. sa.sin_family = AF_INET;
  147.   sa.sin_port = htons(7000);
  148. sa.sin_addr.s_addr= m_iphostsource;
  149.         if (bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR) //绑定本机ip
  150. {
  151. dwErr = WSAGetLastError() ;
  152. sprintf( szErr , "Error bind() = %ld " , dwErr ) ;
  153. AfxMessageBox( szErr ) ;
  154. closesocket( m_s ) ;
  155. return ;
  156.         if( SOCKET_ERROR != WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),             
  157.                                       &dwBufferLen, sizeof(dwBufferLen),
  158.   &dwBytesReturned , NULL , NULL ) ) //设置网卡为混杂模式
  159.             AfxBeginThread( threadFunc , (LPVOID)this ); //开启监听线程
  160. else
  161. {
  162. dwErr = WSAGetLastError() ;
  163. sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
  164. AfxMessageBox( szErr ) ;
  165. closesocket( m_s ) ;
  166. return ;
  167. }
  168. }
  169. }
  170. void CNetPage::AddData(CString s0, CString s1, CString s2, CString s3, CString s4, CString s5, CString s6)
  171. {
  172. int index;
  173.     CString str1="";
  174. str1.Format("%d",total_num1);
  175. index = m_ctrList.InsertItem(0,str1);
  176. m_ctrList.SetItem(index,1,LVIF_TEXT,s0, 0, 0, 0, 0);
  177. m_ctrList.SetItem(index,2,LVIF_TEXT,s1, 0, 0, 0, 0);
  178. m_ctrList.SetItem(index,3,LVIF_TEXT,s2, 0, 0, 0, 0);
  179. m_ctrList.SetItem(index,4,LVIF_TEXT,s3, 0, 0, 0, 0);
  180. m_ctrList.SetItem(index,5,LVIF_TEXT,s4, 0, 0, 0, 0);
  181. m_ctrList.SetItem(index,6,LVIF_TEXT,s5, 0, 0, 0, 0);
  182. m_ctrList.SetItem(index,7,LVIF_TEXT,s6, 0, 0, 0, 0);
  183. // m_ctrList.SetItem(index,7,LVIF_TEXT,s7, 0, 0, 0, 0);
  184. // m_ctrList.SetItem(index,8,LVIF_TEXT,s8, 0, 0, 0, 0);
  185. total_num1++;
  186. }
  187. void CNetPage::close_thread()
  188. {
  189. if( NULL != m_threadID )
  190.       PostThreadMessage(m_threadID,WM_CLOSE,0,0) ; //向线程发送WM_CLOSE消息
  191. if( m_IPArr.GetSize() )
  192.     m_IPArr.RemoveAll() ;
  193. }
  194. BOOL CNetPage::OnInitDialog()
  195. {
  196. CDialog::OnInitDialog();
  197. // Add "About..." menu item to system menu.
  198. // IDM_ABOUTBOX must be in the system command range.
  199. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  200. ASSERT(IDM_ABOUTBOX < 0xF000);
  201. CMenu* pSysMenu = GetSystemMenu(FALSE);
  202. if (pSysMenu != NULL)
  203. {
  204. CString strAboutMenu;
  205. strAboutMenu.LoadString(IDS_ABOUTBOX);
  206. if (!strAboutMenu.IsEmpty())
  207. {
  208. pSysMenu->AppendMenu(MF_SEPARATOR);
  209. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  210. }
  211. }
  212. // Set the icon for this dialog.  The framework does this automatically
  213. //  when the application's main window is not a dialog
  214. SetIcon(m_hIcon, TRUE); // Set big icon
  215. SetIcon(m_hIcon, FALSE); // Set small icon
  216. // TODO: Add extra initialization here
  217.  //   total_num1=0;
  218. //  Get local IP addr.
  219. WORD wVersionRequested;
  220.     WSADATA wsaData; 
  221.     int err;
  222. CHAR szHostName[128] = {0};
  223. HOSTENT* pHost = NULL;
  224. CHAR* pszIp = NULL;
  225. int iNum = 0;
  226. wVersionRequested = MAKEWORD( 2, 0 );
  227.     err = WSAStartup( wVersionRequested, &wsaData );
  228.     if ( err != 0 ) 
  229. {
  230. /* Tell the user that we could not find a usable */
  231. /* WinSock DLL.                                  */
  232. AfxMessageBox("Load WinSock DLL failed!");
  233.         exit(1);
  234. }
  235. if(gethostname(szHostName, 128)==0)
  236. {
  237. pHost = gethostbyname(szHostName);
  238. if(pHost != NULL)
  239. {
  240. pszIp = inet_ntoa(*(in_addr*)pHost->h_addr_list[iNum]);
  241. m_ipsource = inet_addr(pszIp);
  242. }
  243. else AfxMessageBox("pHost = NULL!");
  244. //AfxMessageBox(pszIp);
  245. }
  246. else AfxMessageBox("can't find host name!");
  247. //  ListView initialize
  248. DWORD dwStyle=GetWindowLong(m_ctrList.GetSafeHwnd(),GWL_STYLE);
  249. dwStyle&=~LVS_TYPEMASK;
  250. dwStyle|=LVS_REPORT;
  251. SetWindowLong(m_ctrList.GetSafeHwnd(),GWL_STYLE,dwStyle);
  252. //SetRedraw(TRUE); 
  253. //初始化列表
  254. m_ctrList.InsertColumn(0,"数据",LVCFMT_LEFT,250);
  255. m_ctrList.InsertColumn(0,"数据包大小",LVCFMT_LEFT,80);
  256.     m_ctrList.InsertColumn(0,"目的端口",LVCFMT_LEFT,60);
  257. m_ctrList.InsertColumn(0,"目的地址IP",LVCFMT_LEFT,100);
  258. m_ctrList.InsertColumn(0,"源端口",LVCFMT_LEFT,60);
  259. m_ctrList.InsertColumn(0,"源地址IP",LVCFMT_LEFT,100);
  260. m_ctrList.InsertColumn(0,"协议类型",LVCFMT_LEFT,60);
  261. m_ctrList.InsertColumn(0,"序号",LVCFMT_LEFT,40);
  262.     
  263.     ::SendMessage(m_ctrList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
  264. LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
  265. SetWindowText("网络监听");
  266. /*---------------------------------------------------------------------*/
  267.     // 读取主机所有ip
  268. /* DWORD dwSize = 0 ;
  269.     GetIpAddrTable( NULL , &dwSize, FALSE ) ;
  270.     PMIB_IPADDRTABLE pIpAddrTable = (PMIB_IPADDRTABLE )new BYTE [ dwSize ] ; 
  271. if( pIpAddrTable )
  272. {
  273. if( GetIpAddrTable( (PMIB_IPADDRTABLE)pIpAddrTable,   // // buffer for IP table
  274. &dwSize,                // size of buffer
  275. FALSE                  // sort by IP address 
  276. ) == NO_ERROR )
  277. {
  278.   if(  pIpAddrTable->dwNumEntries > 2 ) // Second is MS TCP loopback IP ( 127.0.0.1 )
  279. {
  280. m_Multihomed = TRUE ;
  281. char szIP[16];
  282. for( int i = 0 ; i < (int)pIpAddrTable->dwNumEntries ; i++ )
  283. {
  284. in_addr ina ;
  285. ina.S_un.S_addr = pIpAddrTable->table[i].dwAddr ;
  286.   char *pIP = inet_ntoa( ina ) ;
  287. strcpy( szIP , pIP ) ;
  288. if( stricmp( szIP , "127.0.0.1" ) )
  289. m_IPArr.Add(pIpAddrTable->table[i].dwAddr) ;
  290. }
  291. }
  292. }
  293. delete [] pIpAddrTable ;
  294. }
  295. */ //m_check.SetCheck(TRUE) ;
  296. return TRUE;  // return TRUE  unless you set the focus to a control
  297. }
  298. char *get_proto_name( unsigned char proto ) //获取协议名称
  299. {
  300. BOOL bFound = FALSE ;
  301. for( int i = 0 ; i < PROTO_NUM ; i++ )
  302. {
  303. if( aOfProto[i].proto == proto )
  304. {
  305. bFound = TRUE ;
  306. break ;
  307. }
  308. }
  309. if( bFound )
  310. return aOfProto[i].pprototext ;
  311. return aOfProto[PROTO_NUM].pprototext ;
  312. }
  313. UINT threadFunc ( LPVOID p )
  314. {
  315.   CNetPage *pDlg = static_cast<CNetPage *>(p) ;
  316. char  buf [1000] , *bufwork ;
  317. MSG   msg ;
  318. int   iRet ;
  319. DWORD dwErr ;
  320.     char  *pSource , *pDest ;
  321. IPHEADER *pIpHeader ;
  322. in_addr ina ;
  323. char   szSource [16] , szDest[16] , szErr [ 50 ];
  324. char *pLastBuf = NULL ;
  325. int HdrLen, totallen;
  326. WORD sourport, destport;
  327. //struct IPPacketHead *pIPHead; //定义不同结构协议头变量
  328. struct TCPPacketHead *pTCPHead;
  329. //struct ARPPacket *pARPHead;
  330. struct ICMPPacketHead *pICMPHead;
  331. struct UDPPacketHead *pUDPHead;
  332. BYTE *pdata = NULL;
  333.  char  *pMac=NULL;
  334.  //检测用户消息
  335.     PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE) ; // Force to make the queue
  336.   pDlg->m_threadID = GetCurrentThreadId() ; //获取当前线程id
  337. while( TRUE ) //开始截获数据包和解析循环
  338. {
  339.         if( PeekMessage( &msg , 0 , WM_CLOSE,WM_CLOSE,PM_NOREMOVE ) )//检测WM_CLOSE消息,有则结束线程
  340. {
  341.           closesocket( pDlg->m_s ) ;
  342.           pDlg->m_threadID = 0 ;
  343. // Only after you see Next message you can press on Start button 
  344. pDlg->m_start.EnableWindow(TRUE) ; 
  345. break ;
  346. }
  347. memset( buf , 0 , sizeof(buf) ) ;//recv函数截获数据包,放在buf缓存中
  348. iRet =  recv( pDlg->m_s , buf , sizeof( buf ) , 0 ) ;
  349. if( iRet == SOCKET_ERROR )
  350. {
  351. dwErr = WSAGetLastError() ;
  352. sprintf( szErr , "Error recv() = %ld " , dwErr ) ;
  353. continue ;
  354. }
  355. else
  356. if( *buf )//如果缓存中有数据包,则开始进行分析
  357. {
  358. // check IP here
  359. //  sprintf( szErr , "recv() = %ld " , iRet ) ;
  360. // AfxMessageBox( szErr ) ;
  361. bufwork   = buf ;
  362.          pIpHeader = (IPHEADER *)bufwork ;//获取ip包头
  363.             WORD iLen = ntohs(pIpHeader->total_len) ;
  364. while( TRUE )
  365. {
  366. if( iLen <= iRet )
  367. {
  368.     //if( pDlg->IsIpofHost( pIpHeader ) )
  369. { // Form the line for m_list
  370.   ina.S_un.S_addr = pIpHeader->sourceIP ;
  371. pSource = inet_ntoa( ina ) ;
  372. strcpy( szSource , pSource ) ;//源地址
  373. ina.S_un.S_addr = pIpHeader->destIP ;
  374. pDest = inet_ntoa( ina ) ;
  375. strcpy( szDest , pDest ) ;//目标地址
  376. CString ip1,ip2;
  377. ip1.Format("%d.%d.%d.%d",IP1[0],IP1[1],IP1[2],IP1[3]);
  378. ip2.Format("%d.%d.%d.%d",IP2[0],IP2[1],IP2[2],IP2[3]);
  379. if(!strcmp(ip1,szSource))
  380. break;
  381. if(!strcmp(ip2,szDest))
  382. break;
  383. CString str, strProto, strSourPort, strDestPort, strData, strSize,strMAC,strHost;
  384. strProto = get_proto_name( pIpHeader->proto ); //协议
  385. HdrLen = pIpHeader->header_len&0xf;
  386. HdrLen *= 4;
  387. totallen = ntohs(pIpHeader->total_len);
  388. totallen-=HdrLen;
  389. iProtocol = pIpHeader->proto;
  390. if((iProtocol==IPPROTO_TCP) && (ParamTcp))
  391. {
  392. pTCPHead=(struct TCPPacketHead *)(buf+HdrLen);
  393. sourport = ntohs(pTCPHead->SourPort);
  394. destport = ntohs(pTCPHead->DestPort);
  395. strSourPort.Format("%d",sourport);
  396. strDestPort.Format("%d",destport);
  397. if(strSourPort==Port1)
  398. break;
  399. if(strDestPort==Port2)
  400. break;
  401. HdrLen = (pTCPHead->HLen)>>4;  
  402. HdrLen *= 4;
  403. pdata=((BYTE *)pTCPHead)+HdrLen;
  404. totallen -= HdrLen;
  405. strData.Format("  %s",pdata);
  406. strSize.Format("%d",totallen);
  407. //str = strIP+strL4+strData;
  408. pDlg->AddData(strProto,szSource,strSourPort,szDest,strDestPort,strSize,strData);
  409. }
  410. if((iProtocol==IPPROTO_UDP) && (ParamUdp))
  411. {
  412. pUDPHead=(struct UDPPacketHead *)(buf+HdrLen);
  413. sourport = ntohs(pUDPHead->SourPort);
  414. destport = ntohs(pUDPHead->DestPort);
  415. strSourPort.Format("%d",sourport);
  416. strDestPort.Format("%d",destport);
  417. if(strSourPort==Port1)
  418. break;
  419. if(strDestPort==Port2)
  420. break;
  421. pdata=((BYTE *)pUDPHead)+UDP_HEAD_LEN;
  422. totallen -= UDP_HEAD_LEN;
  423. strData.Format("  %s",pdata);
  424. strSize.Format("%d",totallen);
  425. //str = strIP+strL4+strData;
  426. pDlg->AddData(strProto,szSource,strSourPort,szDest,strDestPort,strSize,strData);
  427. }
  428. if((iProtocol==IPPROTO_ICMP) && (ParamIcmp))
  429. {
  430. pICMPHead=(struct ICMPPacketHead *)(buf+HdrLen);
  431. strSourPort = "-";
  432. strDestPort = "-";
  433. pdata=((BYTE *)pICMPHead)+ICMP_HEAD_LEN;
  434. totallen -= ICMP_HEAD_LEN;
  435. strData.Format("type:%d code:%d data:%s",pICMPHead->Type,pICMPHead->Code,pdata);
  436. strSize.Format("%d",totallen);
  437. //str = strIP+strL4+strData;
  438. pDlg->AddData(strProto,szSource,strSourPort,szDest,strDestPort,strSize,strData);
  439. }
  440. }
  441. if( iLen < iRet )
  442. {
  443. iRet -= iLen ;
  444. bufwork  += iLen ;
  445.          pIpHeader = (IPHEADER *)bufwork ;
  446. }
  447. else
  448. break ; 
  449. }
  450. else
  451. { // read last part of buf. I wrote it , but always recv() read exactly 
  452.                       // the lenght of the packet
  453. int iLast = iLen - iRet ;
  454. pLastBuf = new char [ iLen ] ;
  455. int iReaden = iRet ;
  456. memcpy( pLastBuf , bufwork , iReaden ) ;
  457. iRet =  recv( pDlg->m_s , pLastBuf + iReaden , iLast , 0 ) ;
  458. if( iRet == SOCKET_ERROR )
  459. {
  460. dwErr = WSAGetLastError() ;
  461. sprintf( szErr , "Error recv() = %ld " , dwErr ) ;
  462. break ;
  463. }
  464. else
  465. {
  466. bufwork = pLastBuf ;
  467.         pIpHeader = (IPHEADER *)bufwork ;
  468. if( iRet == iLast )
  469. iRet = iLen ;
  470. else
  471. { // read all last data
  472. iReaden += iRet ;
  473. iLast -= iRet ;
  474. while( TRUE )
  475. {
  476. iRet = recv( pDlg->m_s , pLastBuf +iReaden , iLast , 0 ) ;
  477. if( iRet == SOCKET_ERROR )
  478. {
  479. dwErr = WSAGetLastError() ;
  480. sprintf( szErr , "Error recv() = %ld " , dwErr ) ;
  481. break ;
  482. }
  483. else
  484. {
  485.         iReaden += iRet ;
  486.         iLast -= iRet ;
  487.     if( iLast <= 0 ) 
  488.     break ;
  489. }
  490. } // while
  491. }
  492. }
  493. }
  494. }   // while
  495. if( pLastBuf )
  496. delete [ ] pLastBuf ;
  497. }
  498. else
  499. {
  500. AfxMessageBox( "No data on network" ) ;
  501. continue ;
  502. }
  503. }
  504. return TRUE ;
  505. }