⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mulpackview.cpp

📁 这是一个嗅探器
💻 CPP
字号:
// MulPackView.cpp : implementation file
//

#include "stdafx.h"
#include "SnifferPro.h"
#include "MulPackView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

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

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

⌨️ 快捷键说明

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