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; 
}