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

📄 getpacketlistview.cpp

📁 这是一个用vc++编写的
💻 CPP
字号:
// GetPacketListView.cpp : implementation file
//

#include "stdafx.h"
#include "GetPacket.h"
#include "GetPacketListView.h"
#include "mainfrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//global variables
CONTROL_BLOCK cbAdapter;
PVOID    pPacket;
BOOL     bSniff=FALSE;

GetPacketListView* pThreadParam;
DWORD WINAPI GetPacketThread(LPVOID param)
{
	unsigned int j;
	ADAPTER_DESC adapterDescs[5];

	if(PacketGetAdapterNames(adapterDescs, 5, &j)==FALSE)
		MessageBox(NULL,"PacketGetAdapterNames","error",MB_OK);
	
	cbAdapter.hFile = (LPADAPTER)PacketOpenAdapter(adapterDescs[0].szAdapterName);
	cbAdapter.hMem=GlobalAlloc(GMEM_MOVEABLE,1514);
	cbAdapter.BufferSize=1514;
	cbAdapter.lpMem=(LPBYTE)GlobalLock(cbAdapter.hMem);
	//PacketAdapterDesc(cbAdapter.hFile, uBuffer, sizeof(uBuffer), &i);
	/*
	if(cbAdapter.hMem==NULL)
	{
		MessageBox(NULL,"GlobalAlloc","Error",MB_OK);
		return -1;
	}
	*/
    //open adapter
	/*cbAdapter.hFile=PacketOpenAdapter(cbAdapter.AdapterName);
    if (cbAdapter.hFile == NULL)
	{
		MessageBox(NULL,"PacketOpenAdapter","Error",MB_OK);
		return -1;
	}*/

	//set NIC to PROMISCUOUS status
	PacketSetFilter((LPADAPTER)cbAdapter.hFile,NDIS_PACKET_TYPE_PROMISCUOUS);

	//allocate packet
    pPacket=PacketAllocatePacket((LPADAPTER)cbAdapter.hFile);
	if(!pPacket)
	{
		MessageBox(NULL,"PacketAllocatePacket","Error",MB_OK);
		return -1;
	}

	PacketInitPacket((LPPACKET)pPacket,cbAdapter.lpMem,1514);

	bSniff=TRUE;
	while(bSniff)
	{
		PacketReceivePacket((LPADAPTER)cbAdapter.hFile,(LPPACKET)pPacket,TRUE,&cbAdapter.PacketLength);
		//the packet is valid***total frame size should exceeds 14+20+20=54
		if (cbAdapter.PacketLength > (sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER)))
		{
			ETHER_PACKET   *pEthPkt = (ETHER_PACKET *) cbAdapter.lpMem;
			
			ETH_HEADER     *pEthHdr = (ETH_HEADER *) cbAdapter.lpMem;
			IP_HEADER      *pIpHdr = (IP_HEADER *) ((char *) pEthPkt + sizeof(ETH_HEADER));
			TCP_HEADER     *pTcpHdr = (TCP_HEADER *) ((char *) pIpHdr + sizeof(IP_HEADER));
			int             i_IPH_Size = pIpHdr->ihl * 4;
			int             i_TCPH_Size = pTcpHdr->doff * 4;
			
			//determine if this is a valid IP packet
			if(pEthPkt->ETH.h_proto!=8)
				continue;
			if (pIpHdr->protocol != 6)
				continue;

			int  iDataSize = ((int) ntohs(pIpHdr->tot_len) -  i_IPH_Size - i_TCPH_Size);
			if(!iDataSize)
				continue;
			BYTE *pPktData = (BYTE *) pTcpHdr + i_TCPH_Size;
			*(pPktData+iDataSize)='\0';
			pThreadParam->SetData(pIpHdr->saddr,pTcpHdr->source,pIpHdr->daddr,pTcpHdr->dest,pPktData,iDataSize);
		}
	}//end while

	PacketFreePacket((LPPACKET)pPacket);
	PacketCloseAdapter((LPADAPTER)cbAdapter.hFile);
	GlobalUnlock(cbAdapter.hMem);
	GlobalFree(cbAdapter.hMem);
	WSACleanup();
	return 0;
}
/////////////////////////////////////////////////////////////////////////////
// GetPacketListView

IMPLEMENT_DYNCREATE(GetPacketListView, CListView)

GetPacketListView::GetPacketListView()
{
	pThreadParam=this;
	//bIsSniffing=FALSE;
}

GetPacketListView::~GetPacketListView()
{
}


BEGIN_MESSAGE_MAP(GetPacketListView, CListView)
	//{{AFX_MSG_MAP(GetPacketListView)
	ON_COMMAND(ID_FILE_START, OnFileStart)
	ON_COMMAND(ID_FILE_STOP, OnFileStop)
	ON_COMMAND(ID_EDIT_FILTER, OnEditFilter)
	ON_UPDATE_COMMAND_UI(ID_FILE_START, OnUpdateFileStart)
	ON_UPDATE_COMMAND_UI(ID_FILE_STOP, OnUpdateFileStop)
	ON_COMMAND(ID_EDIT_CLEARALL, OnEditClearall)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// GetPacketListView drawing

void GetPacketListView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// GetPacketListView diagnostics

#ifdef _DEBUG
void GetPacketListView::AssertValid() const
{
	CListView::AssertValid();
}

void GetPacketListView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// GetPacketListView message handlers

void GetPacketListView::OnInitialUpdate() 
{
	CListView::OnInitialUpdate();
	/*CWnd *pmain;
	pmain=AfxGetMainWnd();
	pmain->SetWindowText("GetPacket1.0");*/
	//set list control's style
	LONG dwLong = GetWindowLong(GetListCtrl().m_hWnd, GWL_STYLE);	
	dwLong ^= LVS_REPORT|LVS_SINGLESEL ;
	LONG err=SetWindowLong(GetListCtrl().m_hWnd, GWL_STYLE, dwLong);
	ListView_SetExtendedListViewStyle(GetListCtrl(), LVS_EX_FULLROWSELECT); 
	//insert 5 columns
	LV_COLUMN lv_column;
	lv_column.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM ;
	lv_column.cx=110;
	lv_column.pszText="  Source IP";
	GetListCtrl().InsertColumn( 0, &lv_column);

	lv_column.cx=80;
	lv_column.pszText="Source Port";
	GetListCtrl().InsertColumn( 1, &lv_column);

	lv_column.cx=110;
	lv_column.pszText="    Dest IP";
	GetListCtrl().InsertColumn( 2, &lv_column);

	lv_column.cx=80;
	lv_column.pszText="  Dest Port";
	GetListCtrl().InsertColumn( 3, &lv_column);

	lv_column.cx=370;
	lv_column.pszText="            packet content";
	GetListCtrl().InsertColumn( 4, &lv_column);
}

void GetPacketListView::OnFileStart() 
{
	iNetworkTraffic=0;

	DWORD dwThreadID;
	hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GetPacketThread,
		                (LPVOID)NULL,(DWORD)0,&dwThreadID);
	((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText( 0, "START RETRIEVING PACKETS...", TRUE );

	/*//if(bIsSniffing)
	//	return;
	//bIsSniffing=TRUE;
	
	//wsastartup , I don't know why
	WORD   wVersionRequested = MAKEWORD(2, 0);
    if (WSAStartup(wVersionRequested, &wsaData) != 0)
	{
		MessageBox("WSAStartup error","",MB_OK);
		return;
	}

	//get adapter's name
	ULONG NameLength=64;
	PacketGetAdapterNames(Adapter.AdapterName,&NameLength);
	
	Adapter.BufferSize=1514;
	Adapter.hMem=GlobalAlloc(GMEM_MOVEABLE,1514);
	Adapter.lpMem=(LPBYTE)GlobalLock(Adapter.hMem);

    //open adapter
	Adapter.hFile=PacketOpenAdapter(Adapter.AdapterName);
    if (Adapter.hFile == NULL)
	{
		MessageBox("PacketOpenAdapter error",Adapter.AdapterName,MB_OK);
		return;
	}

	//set NIC to PROMISCUOUS status
	PacketSetFilter((LPADAPTER)Adapter.hFile,NDIS_PACKET_TYPE_PROMISCUOUS);

	//allocate packet
    Packet=PacketAllocatePacket((LPADAPTER)Adapter.hFile);
    if (Packet != NULL) 
	{
		PacketInitPacket((LPPACKET)Packet,Adapter.lpMem,1514);
		
		int i=0;
		while(bIsSniffing)
		{
			PacketReceivePacket((LPADAPTER)Adapter.hFile,(LPPACKET)Packet,TRUE,&Adapter.PacketLength);

			//the packet is valid***total frame size should exceeds 14+20+20=54
			if (Adapter.PacketLength > (sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER)))
			{
				ETHER_PACKET   *pEthPkt = (ETHER_PACKET *) Adapter.lpMem;
	            
				ETH_HEADER     *pEthHdr = (ETH_HEADER *) Adapter.lpMem;
			    IP_HEADER      *pIpHdr = (IP_HEADER *) ((char *) pEthPkt + sizeof(ETH_HEADER));
				TCP_HEADER     *pTcpHdr = (TCP_HEADER *) ((char *) pIpHdr + sizeof(IP_HEADER));
				int             i_IPH_Size = pIpHdr->ihl * 4;
				int             i_TCPH_Size = pTcpHdr->doff * 4;

				//determine if this is a valid IP packet
				if(pEthPkt->ETH.h_proto!=8)
					continue;
				if (pIpHdr->protocol != 6)
			        continue;
		        {
			        int  iDataSize = ((int) ntohs(pIpHdr->tot_len) -  i_IPH_Size - i_TCPH_Size);
					if(!iDataSize)
						continue;
				    BYTE *pPktData = (BYTE *) pTcpHdr + i_TCPH_Size;
					*(pPktData+iDataSize)='\0';
					SetData(pIpHdr->saddr,pTcpHdr->source,pIpHdr->daddr,pTcpHdr->dest,pPktData,iDataSize);
				}
				i++;
				if(i==1000)
					return;
			}
		}//end while
	}*/

}

void GetPacketListView::OnFileStop() 
{
	bSniff=FALSE;
	
	char buffer[128];
	MessageBox(_itoa( iNetworkTraffic , buffer, 10 ) , "Total network traffic is" , MB_OK);
	//TerminateThread(hThread,0);
/*if(!bIsSniffing)
		return;
	bIsSniffing=FALSE;
	WSACleanup();	
    PacketCloseAdapter((LPADAPTER)Adapter.hFile);
	if(Packet!=NULL)
		PacketFreePacket((LPPACKET)Packet);
	PacketSetFilter((LPADAPTER)Adapter.hFile,NDIS_PACKET_TYPE_DIRECTED);*/
}


void GetPacketListView::SetData(__u32 saddr, __u16 source, __u32 daddr, __u16 dest, BYTE * pPktData, int iDataSize)
{
	static char     SourceAddress[512] = "";
 	static char     DestAddress[512] = "";
	char buffer[1024],data[2048],temp[512],*dot;
    struct in_addr  iaddr;
	int iSourcePort,iDestPort,i;
	CGetPacketApp *pApp;
	pApp=(CGetPacketApp*)AfxGetApp();

	//save packet data
	strcpy(data,(char*)pPktData);

	memset(&iaddr,0,sizeof(struct in_addr));
    iaddr.s_addr = saddr;
    strcpy(SourceAddress, inet_ntoa(iaddr));//source IP address

	if(pApp->SourceIP.GetSize()>0)
	{
		for(i=0;i<pApp->SourceIP.GetSize();i++)
			if(!strcmp(SourceAddress,pApp->SourceIP.GetAt(i)))
				break;
		if(i==pApp->SourceIP.GetSize())
			return;
	}

	memset(&iaddr,0,sizeof(struct in_addr));
    iaddr.s_addr = daddr;
	strcpy(DestAddress,inet_ntoa(iaddr));   //dest IP address
	if(pApp->DestIP.GetSize()>0)
	{
		for(i=0;i<pApp->DestIP.GetSize();i++)
			if(!strcmp(DestAddress,pApp->DestIP.GetAt(i)))
				break;
		if(i==pApp->DestIP.GetSize())
			return;
	}
	
	iSourcePort=(int) ntohs(source);   //source port no
	if(pApp->SourcePort.GetSize()>0)
	{
		for(i=0;i<pApp->SourcePort.GetSize();i++)
			if((unsigned int)iSourcePort==pApp->SourcePort.GetAt(i))
				break;
		if(i==pApp->SourcePort.GetSize())
			return;
	}
	
	iDestPort  =(int) ntohs(dest  );   //destination port no
	if(pApp->DestPort.GetSize()>0)
	{
		for(i=0;i<pApp->DestPort.GetSize();i++)
			if((unsigned int)iDestPort==pApp->DestPort.GetAt(i))
				break;
		if(i==pApp->DestPort.GetSize())
			return;
	}
	//have been filtered, can be insert into listview.
	int index;
	index=GetListCtrl().InsertItem(0,SourceAddress);
	if(index!=-1)
	{
		GetListCtrl().SetItem( index, 1, LVIF_TEXT , _itoa( iSourcePort, buffer, 10 ), 0, 0, 0,0);
		GetListCtrl().SetItem( index, 2, LVIF_TEXT , DestAddress     , 0, 0, 0,0);
		GetListCtrl().SetItem( index, 3, LVIF_TEXT , _itoa( iDestPort, buffer, 10 ), 0, 0, 0,0);
		GetListCtrl().SetItem( index, 4, LVIF_TEXT , data, 0, 0, 0,0);
	}
	
	//caculate network traffic for xwang
	if(data!=NULL)
		iNetworkTraffic = iNetworkTraffic + strlen(data) + sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER);

    return ;
}

void GetPacketListView::OnEditFilter() 
{
	CFileterDlg FilterDlg;
	int ret=FilterDlg.DoModal();
	if(ret==IDOK)
	{
		
	}
}

void GetPacketListView::OnUpdateFileStart(CCmdUI* pCmdUI) 
{
	if(bSniff)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void GetPacketListView::OnUpdateFileStop(CCmdUI* pCmdUI) 
{
	if(!bSniff)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void GetPacketListView::OnEditClearall() 
{
	GetListCtrl().DeleteAllItems();
}

⌨️ 快捷键说明

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