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 + -
显示快捷键?