mysimpsnifferdlg.cpp

来自「一个关于局域网简单抓包工具」· C++ 代码 · 共 1,943 行 · 第 1/5 页

CPP
1,943
字号
						ina.S_un.S_addr = pIpHead->ip_dstIP ;
						pDest = inet_ntoa( ina ) ;
						strcpy( szDest , pDest ) ;
						CString str, strProto, strSourPort, strDestPort, strData, strSize;

*//* 
							if( pIpHeader->sourceIP == ( pDlg->m_ipcheckedhost ? 
								           pDlg->m_ipcheckedhost : pDlg->m_iphostsource ) )
								strIP.Format("%s -> %s len = %d ttl=%d proto=%s" , szSource , szDest ,
						 					iLen , pIpHeader->ttl , get_proto_name( pIpHeader->proto ) ) ;
							else
								strIP.Format("%s -> %s len = %d ttl=%d proto=%s" , szSource , szDest ,
											iLen , pIpHeader->ttl , get_proto_name( pIpHeader->proto ) ) ;
*/	/*

						strProto = pDlg->CheckProtocol( pIpHead->ip_proto );
							
						HdrLen = pIpHead->ip_verlen&0xf;
						HdrLen *= 4;
						totallen = ntohs(pIpHead->ip_len);
						totallen-=HdrLen;
						switch(pIpHead->ip_proto)
						{
						case IPPROTO_ICMP:
							{
								pICMPHead=(ICMP_HEADER *)(buf+HdrLen);
								strSourPort = "-";
								strDestPort = "-";
								pdata=((BYTE *)pICMPHead)+4;//ICMP_HEAD_LEN;
								totallen -= 4;//ICMP_HEAD_LEN;
								break;
							}
						case IPPROTO_TCP:
							{
								pTCPHead=(TCP_HEADER *)(buf+HdrLen);
								sourport = ntohs(pTCPHead->tcp_SrcPort);
								destport = ntohs(pTCPHead->tcp_DstPort);
								strSourPort.Format("%d",sourport);
								strDestPort.Format("%d",destport);
								HdrLen = (pTCPHead->tcp_lenres)>>4;  //in fact only 4 bits
								HdrLen *= 4;
								pdata=((BYTE *)pTCPHead)+HdrLen;
								totallen -= HdrLen;
								break;
							}
						case IPPROTO_UDP:
							{
								pUDPHead=(UDP_HEADER *)(buf+HdrLen);
								sourport = ntohs(pUDPHead->udp_Srcport);
								destport = ntohs(pUDPHead->udp_Dstport);
								strSourPort.Format("%d",sourport);
								strDestPort.Format("%d",destport);
								pdata=((BYTE *)pUDPHead)+8;//UDP_HEAD_LEN;
								totallen -= 8;//UDP_HEAD_LEN;
								break;
							}
						} // end switch

						if(pIpHead->ip_proto == IPPROTO_ICMP)
							strData.Format("type:%d code:%d data:%s",pICMPHead->ic_type,pICMPHead->ic_code,pdata);
						else strData.Format("  %s",pdata);
							strSize.Format("%d",totallen);

						pDlg->AddData(strProto,szSource,strSourPort,szDest,strDestPort,strSize,strData);

			  			//pDlg->m_list.AddString( str ) ;    
						//pDlg->m_list.InsertString(0,str);  

						// Sleep stabilize work of list , otherwise  sometimes pressing on scroll
						// cased close of program

						//Sleep(50) ; 
					
						if( iLen < iRet )
						{
							iRet -= iLen ;
							bufwork  += iLen ;
							pIpHead = (IP_HEADER *)bufwork ;
						}else
							break ; //pIpHead->ip_len == iRet and go out
					}else{ // read last part of buf. I wrote it , but always recv() read exactly 
						AfxMessageBox("data too big!");
						// the lenght of the packet
						int iLast = iLen - iRet ;
						pLastBuf = new char [ iLen ] ;
						int iReaden = iRet ;
						memcpy( pLastBuf , bufwork , iReaden ) ;
						iRet = 	recv( pDlg->SockRaw , pLastBuf + iReaden , iLast , 0 ) ;
						if( iRet == SOCKET_ERROR )
						{
							dwErr = WSAGetLastError() ;
							sprintf( szErr , "Error recv() = %ld " , dwErr ) ;
							break ;
						}else{
							bufwork = pLastBuf ;	
       						pIpHead = (IP_HEADER *)bufwork ;
							if( iRet == iLast )
								iRet = iLen ;
							else{ // read all last data
								iReaden += iRet ;
								iLast -= iRet ;
								while( TRUE )
								{
									iRet = recv( pDlg->SockRaw , pLastBuf +iReaden , iLast , 0 ) ;
									if( iRet == SOCKET_ERROR )
									{
										dwErr = WSAGetLastError() ;
										sprintf( szErr , "Error recv() = %ld " , dwErr ) ;
										break ;
									}else{
					        			iReaden += iRet ;
					        			iLast -= iRet ;
						    			if( iLast <= 0 ) 
											break ;
									}	
								} // while
							}
						}
					}
				} //end while
				if( pLastBuf )
					delete [ ] pLastBuf ;
			}else{
				AfxMessageBox( "No data on network" ) ;
				continue ;
			}
		}
		//Sleep( 100 ) ; //  Polling each 100 millisecond  	
	} 
	return TRUE ;
} */

void CMySimpSnifferDlg::SetTree()
{
	m_TreeDetail.DeleteAllItems();
	HTREEITEM hLetter[5];
	hLetter[0]=m_TreeDetail.InsertItem("IP:  ***** IP  Header *****");	//根Root
	m_TreeDetail.InsertItem("IP: Version             = ",hLetter[0]); 
	//m_TreeDetail.InsertItem(ss,hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Header Length       = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Type of Service     = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Total Length        = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Identification      = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Flags               = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Fragment Offset     = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Time to Live        = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Protocol            = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Header Checksum     = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Source Address      = ",hLetter[0]); 
	m_TreeDetail.InsertItem("IP: Destination Address = ",hLetter[0]); 
	
	hLetter[1]=m_TreeDetail.InsertItem("TCP: ***** TCP Header *****");
	m_TreeDetail.InsertItem("TCP: Source Port        = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Destination Port   = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Sequence Number    = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Ack Number         = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Data Offset(HLen)  = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Reserved Bits      = ",hLetter[1]); 
	hLetter[2]=m_TreeDetail.InsertItem("TCP: Flags              = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP:        ..1..... = URG",hLetter[2]); 
	m_TreeDetail.InsertItem("TCP:        ...1.... = ACK",hLetter[2]); 
	m_TreeDetail.InsertItem("TCP:        ....1... = PSH",hLetter[2]); 
	m_TreeDetail.InsertItem("TCP:        .....1.. = RST",hLetter[2]); 
	m_TreeDetail.InsertItem("TCP:        ......1. = SYN",hLetter[2]); 
	m_TreeDetail.InsertItem("TCP:        .......1 = FIN",hLetter[2]); 
	m_TreeDetail.InsertItem("TCP: Window Size        = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Checksum           = ",hLetter[1]); 
	m_TreeDetail.InsertItem("TCP: Urgent Pointer     = ",hLetter[1]); 
	//m_TreeDetail.InsertItem("TCP: **************     = ",hLetter[1]); 
	//hLetter[3] = m_TreeDetail.GetRootItem();
	//CString s=m_TreeDetail.GetItemText(hLetter[3]);
	//AfxMessageBox(s);
}

void CMySimpSnifferDlg::SetTree(char Ptype, char *pData = NULL)
{
	if(pData == NULL) 
	{
		m_TreeDetail.DeleteAllItems();
		return;
	}

	HTREEITEM hLetter[3];

	switch (Ptype)
	{
	case IPPROTO_IP: 
		{	// 将IP头内容转为树状
			IP_HEADER *pIPHead;
			if(pData!=NULL) pIPHead = (IP_HEADER *)pData;

			m_TreeDetail.DeleteAllItems();
			hLetter[0]=m_TreeDetail.InsertItem("IP:  ***** IP  Header *****");	//根Root
			m_TreeDetail.InsertItem("IP: Version             = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Header Length       = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Type of Service     = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Total Length        = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Identification      = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Flags               = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Fragment Offset     = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Time to Live        = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Protocol            = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Header Checksum     = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Source Address      = ",hLetter[0]); 
			m_TreeDetail.InsertItem("IP: Destination Address = ",hLetter[0]); 
			if (m_TreeDetail.Expand(hLetter[0],100)) AfxMessageBox("succ");
			//delete [] pIPHead;
			break;
		}
	case IPPROTO_TCP:
		{	// 将TCP头内容转为树状
			TCP_HEADER *pTCPHead;
			pTCPHead = (TCP_HEADER *)pData;
			hLetter[1]=m_TreeDetail.InsertItem("TCP: ***** TCP Header *****");
			m_TreeDetail.InsertItem("TCP: Source Port        = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Destination Port   = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Sequence Number    = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Ack Number         = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Data Offset(HLen)  = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Reserved Bits      = ",hLetter[1]); 
			hLetter[2]=m_TreeDetail.InsertItem("TCP: Flags              = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP:        ..1..... = URG",hLetter[2]); 
			m_TreeDetail.InsertItem("TCP:        ...1.... = ACK",hLetter[2]); 
			m_TreeDetail.InsertItem("TCP:        ....1... = PSH",hLetter[2]); 
			m_TreeDetail.InsertItem("TCP:        .....1.. = RST",hLetter[2]); 
			m_TreeDetail.InsertItem("TCP:        ......1. = SYN",hLetter[2]); 
			m_TreeDetail.InsertItem("TCP:        .......1 = FIN",hLetter[2]); 
			m_TreeDetail.InsertItem("TCP: Window Size        = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Checksum           = ",hLetter[1]); 
			m_TreeDetail.InsertItem("TCP: Urgent Pointer     = ",hLetter[1]); 
			break;
		}
	case IPPROTO_UDP:
		{	// 将UDP头内容转为树状
			UDP_HEADER *pUDPHead;
			pUDPHead = (UDP_HEADER *)pData;

			break;
		}
	case IPPROTO_ICMP: 
		{	// 将ICMP头内容转为树状
			ICMP_HEADER *pICMPHead;
			pICMPHead = (ICMP_HEADER *)pData;

			break;
		}
	}//end switch

}

int CMySimpSnifferDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here

	return 0;
}

void CMySimpSnifferDlg::OnItemchangedListData(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	HTREEITEM hLetter[3];
	CString strContent = "", strType="";
	CString strData = "";
	POSITION pos = m_listdata.GetFirstSelectedItemPosition();
	if (pos != NULL)
	{
		int nCurSel = m_listdata.GetNextSelectedItem(pos);	//选中的行号(从0算起)
		strData = m_listdata.GetItemText(nCurSel, 6);		//DATA
		m_Data.SetWindowText(strData);

		m_TreeDetail.DeleteAllItems();
		//IP头树形显示
		hLetter[0] = m_TreeDetail.InsertItem("IP:  ***** IP  Header *****");	//根Root
		strContent = m_listdata.GetItemText(nCurSel, 7);
		m_TreeDetail.InsertItem(_T("IP: Version             = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 8);
		m_TreeDetail.InsertItem(_T("IP: Header Length       = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 9);
		m_TreeDetail.InsertItem(_T("IP: Type of Service     = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 10);
		m_TreeDetail.InsertItem(_T("IP: Total Length        = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 11);
		m_TreeDetail.InsertItem(_T("IP: Identification      = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 12);
		m_TreeDetail.InsertItem(_T("IP: Flags               = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 13);
		m_TreeDetail.InsertItem(_T("IP: Fragment Offset     = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 14);
		m_TreeDetail.InsertItem(_T("IP: Time to Live        = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 0);
		strType	   = strContent;	//协议类型
		m_TreeDetail.InsertItem(_T("IP: Protocol            = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 15);
		m_TreeDetail.InsertItem(_T("IP: Header Checksum     = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 1);
		m_TreeDetail.InsertItem(_T("IP: Source Address      = ") + _T(strContent),hLetter[0]); 
		strContent = m_listdata.GetItemText(nCurSel, 3);
		m_TreeDetail.InsertItem(_T("IP: Destination Address = ") + _T(strContent),hLetter[0]); 

		if(strType=="TCP")
		{
			//TCP头树形显示
			hLetter[1] = m_TreeDetail.InsertItem("TCP: ***** TCP Header *****");
			strContent = m_listdata.GetItemText(nCurSel, 2);
			m_TreeDetail.InsertItem(_T("TCP: Source Port        = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 4);
			m_TreeDetail.InsertItem(_T("TCP: Destination Port   = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 16);
			m_TreeDetail.InsertItem(_T("TCP: Sequence Number    = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 17);
			m_TreeDetail.InsertItem(_T("TCP: Ack Number         = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 18);
			m_TreeDetail.InsertItem(_T("TCP: Data Offset(HLen)  = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 19);
			m_TreeDetail.InsertItem(_T("TCP: Reserved Bits      = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 20);
			hLetter[2]=m_TreeDetail.InsertItem(_T("TCP: Flags                ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 21);
			m_TreeDetail.InsertItem(_T("TCP:URG     ..1..... = ") + _T(strContent),hLetter[2]); 
			strContent = m_listdata.GetItemText(nCurSel, 22);
			m_TreeDetail.InsertItem(_T("TCP:ACK     ...1.... = ") + _T(strContent),hLetter[2]); 
			strContent = m_listdata.GetItemText(nCurSel, 23);
			m_TreeDetail.InsertItem(_T("TCP:PSH     ....1... = ") + _T(strContent),hLetter[2]); 
			strContent = m_listdata.GetItemText(nCurSel, 24);
			m_TreeDetail.InsertItem(_T("TCP:RST     .....1.. = ") + _T(strContent),hLetter[2]); 
			strContent = m_listdata.GetItemText(nCurSel, 25);
			m_TreeDetail.InsertItem(_T("TCP:SYN     ......1. = ") + _T(strContent),hLetter[2]); 
			strContent = m_listdata.GetItemText(nCurSel, 26);
			m_TreeDetail.InsertItem(_T("TCP:FIN     .......1 = ") + _T(strContent),hLetter[2]); 
			strContent = m_listdata.GetItemText(nCurSel, 27);
			m_TreeDetail.InsertItem(_T("TCP: Window Size        = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 28);
			m_TreeDetail.InsertItem(_T("TCP: Checksum           = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 29);
			m_TreeDetail.InsertItem(_T("TCP: Urgent Pointer     = ") + _T(strContent),hLetter[1]); 
		}
		if(strType=="UDP")
		{
			//UDP头树形显示
			hLetter[1] = m_TreeDetail.InsertItem("UDP: ***** UDP Header *****");
			strContent = m_listdata.GetItemText(nCurSel, 2);
			m_TreeDetail.InsertItem(_T("UDP: Source Port        = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 4);
			m_TreeDetail.InsertItem(_T("UDP: Destination Port   = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 18);
			m_TreeDetail.InsertItem(_T("UDP: Header Length      = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 28);
			m_TreeDetail.InsertItem(_T("UDP: CheckSum           = ") + _T(strContent),hLetter[1]); 
		}
		if(strType=="ICMP")
		{
			//ICMP头树形显示
			hLetter[1] = m_TreeDetail.InsertItem("ICMP: ***** ICMP Header *****");
			strContent = m_listdata.GetItemText(nCurSel, 7);
			m_TreeDetail.InsertItem(_T("ICMP: Type              = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 8);
			m_TreeDetail.InsertItem(_T("ICMP: Code              = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 9);
			m_TreeDetail.InsertItem(_T("ICMP: CheckSum          = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 10);
			m_TreeDetail.InsertItem(_T("ICMP: Identification    = ") + _T(strContent),hLetter[1]); 
			strContent = m_listdata.GetItemText(nCurSel, 11);
			m_TreeDetail.InsertItem(_T("ICMP: Sequence Number   = ") + _T(strContent),hLetter[1]); 
		}
		//展开树
		m_TreeDetail.Expand(hLetter[0], TVE_EXPAND); 
		m_TreeDetail.Expand(hLetter[1], TVE_EXPAND); 
		//m_TreeDetail.Expand(hLetter[2], TVE_EXPAND); 
		m_TreeDetail.SelectItem(hLetter[0]);
	}
	*pResult = 0;
}

void CMySimpSnifferDlg::OnColumnclickListData(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	//点击列表标题
	//AfxMessageBox("hear");
	*pResult = 0;
}

/*UINT threadFunc_Catch( LPVOID pthreadArg )
{
 	//CMySimpSnifferDlg *pDlg = static_cast<CMySimpSnifferDlg *>(pthreadArg);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?