www.pudn.com > SnifferPro.rar > MulPackView.cpp
// MulPackView.cpp : implementation file // #include "stdafx.h" #include "SnifferPro.h" #include "MulPackView.h" #include "MainFrm.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern CString a; extern u_char hardware_destination[6]; CString srcip,srcmac,desip; ///////////////////////////////////////////////////////////////////////////// // CMulPackView IMPLEMENT_DYNCREATE(CMulPackView, CListView) CMulPackView::CMulPackView() { totalmem=0; //tempmem=0; delta=0; time=0; index=-1; } CMulPackView::~CMulPackView() { } BEGIN_MESSAGE_MAP(CMulPackView, CListView) //{{AFX_MSG_MAP(CMulPackView) ON_MESSAGE(WM_MESSAGE_PACKET_RECEIVE,OnPacketReceive) ON_NOTIFY_REFLECT(NM_CLICK, OnClick) ON_MESSAGE(WM_MESSAGE_ONTIMER,OnMessageTimer) ON_NOTIFY_REFLECT(LVN_ITEMCHANGING, OnItemchanging) ON_WM_TIMER() ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMulPackView drawing void CMulPackView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // TODO: add draw code here } ///////////////////////////////////////////////////////////////////////////// // CMulPackView diagnostics #ifdef _DEBUG void CMulPackView::AssertValid() const { CListView::AssertValid(); } void CMulPackView::Dump(CDumpContext& dc) const { CListView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMulPackView message handlers void CMulPackView::OnInitialUpdate() { CListView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class ((CMainFrame *)AfxGetApp()->GetMainWnd())->mulPackView=this; CListCtrl &ctrl=this->GetListCtrl(); //设置风格 DWORD log = GetWindowLong(ctrl.GetSafeHwnd(),GWL_STYLE); log |= LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS; SetWindowLong(ctrl.GetSafeHwnd(),GWL_STYLE,log); HICON hIcon[2]; hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_STOP); hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_START); m_imageList.Create(12,12,0,3,3); m_imageList.Add(hIcon[0]); m_imageList.Add(hIcon[1]); ctrl.SetImageList(&m_imageList,TVSIL_NORMAL); //设置列信息 ctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT); ctrl.InsertColumn(0,"Order",LVCFMT_RIGHT,50); ctrl.InsertColumn(1,"IP Identification",LVCFMT_RIGHT,100); ctrl.InsertColumn(2,"Source Address",LVCFMT_RIGHT,150); ctrl.InsertColumn(3,"Destination Address",LVCFMT_RIGHT,150); ctrl.InsertColumn(4,"IP Length",LVCFMT_RIGHT,80); ctrl.InsertColumn(5,"Type",LVCFMT_RIGHT,50); ctrl.InsertColumn(6," ",LVCFMT_LEFT,100); } UINT SendPacket(LPVOID param) { libnet_t *l; libnet_ptag_t protocol_tag; char *device=NULL; char error_information[LIBNET_ERRBUF_SIZE]; char *destination_ip_str; //目的IP地址 char *source_ip_str=(char *)(LPCSTR)desip; u_char hardware_source[6]={0x00,0x1E,0x37,0x33,0x15,0x4A}; u_long destination_ip; u_long source_ip; //判断需要发的包 destination_ip_str=(char *)(LPCSTR)srcip; destination_ip=libnet_name2addr4(l,destination_ip_str,LIBNET_RESOLVE); source_ip=libnet_name2addr4(l,source_ip_str,LIBNET_RESOLVE); l=libnet_init( LIBNET_LINK_ADV, device, error_information); protocol_tag=libnet_build_arp( ARPHRD_ETHER, ETHERTYPE_IP, 6, 4, ARPOP_REPLY, hardware_source, (u_int8_t *)&source_ip, hardware_destination, (u_int8_t *)&destination_ip, NULL, 0, l, 0 ); protocol_tag=libnet_autobuild_ethernet( hardware_destination, ETHERTYPE_ARP, l ); libnet_write(l); libnet_destroy(l); return 0; } void CMulPackView::OnPacketReceive(const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) { int index=0; int count=0; char str[10]; char iplen[6]; struct pcap_pkthdr *header; const u_char *data; unsigned char *pos=(unsigned char *)pkt_data; int type; CListCtrl &ctrl=this->GetListCtrl(); //将所捕获包的内容复制下来,并保存到CArray中,以备将来使用 header=new pcap_pkthdr; header->caplen=pkt_header->caplen; header->len=pkt_header->len; data=new unsigned char[header->len]; memcpy((void *)data,pkt_data,header->len); this->pkt_headers.Add(header); this->pkt_datas.Add(data); //在ListCtrl中插入新的包 index=pkt_headers.GetSize()-1; sprintf(str,"%00005d",index+1); count=ctrl.InsertItem(index,str,0); pos+=12;//进行判断包类型 type=(*pos)*0x100; pos++; type+=(*pos); if(type==0x0800){//IP,在ListCtrl中添加一行 IPGram ip(data+14,header->len-14); this->totalmem += ip.datalen+ip.IHL*4+14; sprintf(iplen,"%4d",ip.totallen); ctrl.SetItemText(count,1,ip.GetID()); ctrl.SetItemText(count,2,ip.GetSrcAddr()); ctrl.SetItemText(count,3,ip.GetDestAddr()); ctrl.SetItemText(count,4,iplen); ctrl.SetItemText(count,5,ip.GetService()); } else if(type==0x0806){//ARP,在ListCtrl中添加一行 ARPGram arp(data+14,header->len-14); this->totalmem +=42; srcip=arp.GetSrcPrtAddr(); srcmac=arp.GetSrcHdwAddr(); desip=arp.GetDestPrtAddr(); ctrl.SetItemText(count,1,""); ctrl.SetItemText(count,2,arp.GetSrcPrtAddr()); ctrl.SetItemText(count,3,arp.GetDestPrtAddr()); ctrl.SetItemText(count,4,""); ctrl.SetItemText(count,5,"ARP"); AfxBeginThread(AFX_THREADPROC(SendPacket),(LPVOID)this); } else if(type==0x8035){//RARP,在ListCtrl中添加一行 RARPGram rarp(data+14,header->len-14); this->totalmem +=42; ctrl.SetItemText(count,1,""); ctrl.SetItemText(count,2,rarp.GetSrcPrtAddr()); ctrl.SetItemText(count,3,rarp.GetDestPrtAddr()); ctrl.SetItemText(count,4,""); ctrl.SetItemText(count,5,"RARP"); } } void CMulPackView::OnClick(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here *pResult = 0; } void CMulPackView::OnMessageTimer() //每秒钟统计抓到的包信息,每1000ms触发一次(收到一个WM_MESSAGE_ONTIMER消息) { // TODO: Add your message handler code here and/or call default time+=1; //Set Status Bar CString status; status.Format("Total Packets: %d Total Memory: %d,%003d KB Time Elapsed: %u Seconds",pkt_headers.GetSize(),totalmem/0x100000,(totalmem%1000000)/0x400,time); ((CMainFrame *)AfxGetApp()->GetMainWnd())->m_wndStatusBar.SetPaneText(0,""+status,TRUE); ((CMainFrame *)AfxGetApp()->GetMainWnd())->m_progStatusBar.OnProgress(delta*8*100/10000000); delta=0; } void CMulPackView::OnItemchanging(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 0; } void CMulPackView::OnTimer(UINT nIDEvent) { CListView::OnTimer(nIDEvent); } void CMulPackView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here if(((CMainFrame *)AfxGetApp()->GetMainWnd())->stcView->isReassembly){//处于重组状态 if(MessageBox("处于重组状态,显示一个报文内容会丢失组装后的数据,是否继续?",NULL,MB_OKCANCEL)==IDCANCEL) return; } CListCtrl &ctrl=this->GetListCtrl(); ctrl.DeleteColumn(6); ctrl.InsertColumn(6," ",LVCFMT_LEFT,100); int count=ctrl.GetItemCount(); if(count==0) return; index=pNMListView->iItem; int i=((CMainFrame *)AfxGetApp()->GetMainWnd())->mulPackView->pkt_datas.GetSize(); //通知CSinPackView和CStcView刷新为新选中的报文内容 ::PostMessage(*((CMainFrame *)AfxGetApp()->GetMainWnd())->sinPackView,WM_MESSAGE_PACKET_SELECT,(WPARAM)this->pkt_headers.GetAt(index),(LPARAM)this->pkt_datas.GetAt(index)); ::PostMessage(*((CMainFrame *)AfxGetApp()->GetMainWnd())->stcView,WM_MESSAGE_PACKET_SELECT,(WPARAM)this->pkt_headers.GetAt(index),(LPARAM)this->pkt_datas.GetAt(index)); *pResult = 0; }