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

📄 netcapdlg.cpp

📁 一个关于sniffe嗅探的程序
💻 CPP
字号:
// NetcapDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Netcap.h"
#include "NetcapDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About



/////////////////////////////////////////////////////////////////////////////
// CNetcapDlg dialog

CNetcapDlg::CNetcapDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNetcapDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNetcapDlg)
		// NOTE: the ClassWizard will add member initialization here
	m_edit=_T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_nCurSel=0;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CNetcapDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNetcapDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
    DDX_Control(pDX, IDC_LIST1, m_list);
	DDX_Text(pDX, IDC_EDIT1, m_edit);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CNetcapDlg, CDialog)
	//{{AFX_MSG_MAP(CNetcapDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(IDM_EXIT, OnExit)
	ON_COMMAND(IDM_START, OnStart)
	ON_COMMAND(IDM_STOP, OnStop)
	ON_COMMAND(IDM_FILTER, OnFilter)
	ON_NOTIFY(NM_CLICK, IDC_CAPTURE_LIST, OnClickCaptureList)
	ON_NOTIFY(LVN_KEYDOWN, IDC_CAPTURE_LIST, OnKeydownCaptureList)
	ON_COMMAND(IDM_CLEAR_LIST, OnClearList)
	ON_COMMAND(IDM_DELETE_ITEM, OnDeleteItem)
	//}}AFX_MSG_MAP
	ON_MESSAGE(MSG_RECEIVE, OnReceive)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNetcapDlg message handlers

BOOL CNetcapDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);
	SetIcon(m_hIcon, FALSE);
	if(!m_wndToolBar.Create(this))
	{
		return FALSE;
	}
	if(!m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
	{
		EndDialog(IDCANCEL);
		return FALSE;
	}
	CString strLables[] =
	{
		TEXT("时间"),
		TEXT("长度"),
		TEXT("TTL"),
		TEXT("协议"),
		TEXT("源地址"),
		TEXT("目的地址"),
	};
	LVCOLUMN lvc;
	lvc.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
	lvc.fmt=LVCFMT_LEFT;
	lvc.pszText=(char *)(LPCTSTR)strLables[0];
	lvc.cx=strLables[0].GetLength()*18;
	m_list.InsertColumn(0, &lvc);
	for(int i=1; i<6; i++)
	{
		lvc.iSubItem=i;
		lvc.pszText=(char *)(LPCTSTR)strLables[i];
		lvc.cx=strLables[i].GetLength()*18;
		m_list.InsertColumn(i, &lvc);
	}
	CRect rcTB;
	CWnd* PWnd=GetDlgItem(IDC_TB);
	PWnd->GetWindowRect(&rcTB);
	this->ScreenToClient(&rcTB);
	m_wndToolBar.MoveWindow(&rcTB,FALSE);
	m_wndToolBar.SendMessage(TB_SETSTATE, IDM_STOP,MAKELONG(TBSTATE_INDETERMINATE, 0));
	return TRUE;
	
	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}


// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CNetcapDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}


void CNetcapDlg::OnExit()
{
	m_listener.StopListen();
	OnClearList();
	EndDialog(IDOK);
}

static char *szProto[] = {"Reserved", "ICMP", "IGMP", "GGP", "IP", "ST", "TCP",
						  "UCL", "EGP", "IGP", "BBN-RCC-MON", "NVP-II", "PUP",
						  "ARGUS", "EMCON", "XNET", "CHAOS", "UDP", "MUX", 
						  "DCN-MEAS", "HMP", "PRM", "XNS-IDP", "TRUNK-1", "TRUNK-2",
						  "LEAF-1", "LEAF-2", "RDP", "IRTP", "ISO-TP4", "NETBLT",
						  "MFE-NSP", "MERIT-INP", "SEP", "3PC", "IDPR", "XTP", "DDP",
						  "IDPR-CMTP", "TP++", "IL", "SIP", "SDRP", "SIP-SR", 
						  "SIP-FRAG", "IDRP", "RSVP", "GRE", "MHRP", "BNA", "SIPP-ESP",
						  "SIPP-AH", "I-NLSP", "SWIPE", "NHRP", "unassigned", "unassigned",
						  "unassigned", "unassigned", "unassigned", "unassigned",
						  "any host internal protocol", "CFTP", "any local network",
						  "SAT-EXPAK", "KRYPTOLAN", "RVD", "IPPC", "any distributed file system",
						  "SAT-MON", "VISA", "IPCV", "CPNX", "CPHB", "WSN", "PVP",
						  "BR-SAT-MON", "SUN-ND", "WB-MON", "WB-EXPAK", "ISO-IP",  "VMTP",
						  "SECURE-VMTP", "VINES", "TTP", "NSFNET-IGP", "DGP", "TCF", "IGRP",
						  "OSPFIGP", "Sprite-RPC", "LARP", "MTP", "AX.25", "IPIP", "MICP",
						  "SCC-SP", "ETHERIP", "ENCAP", "any private encryption scheme", "GMTP"
};
void CNetcapDlg::OnReceive(WPARAM, LPARAM lParam)
{
	int tt=sizeof(szProto)/sizeof(char *);
	LONGLONG llFilter;
	WSABUF* pBuf=(WSABUF *)lParam;
	UCHAR* buf = (UCHAR *)pBuf->buf;
	ASSERT(pBuf->len >= 20);
	ULONG IP=(buf[12]<<24)|(buf[13]<<16)|(buf[14]<<8)|buf[15];
	llFilter=m_dlgFilter.GetSourceIPFilter();
	if(llFilter != 0xFFFFFFFFF)
	{
		if(IP != (llFilter & 0xFFFFFFFFF))
		{
			return;
		}
	}
	IP = (buf[16]<<24)|(buf[17]<<16)|(buf[18]<<8)|buf[19];
	llFilter=m_dlgFilter.GetDestIPFilter();
	if(llFilter != 0xFFFFFFFFF)
	{
		if(IP != (llFilter & 0xFFFFFFFFF))
		{
			return;
		}
	}

buf = (UCHAR *)::GlobalAlloc(GPTR, pBuf->len);
memcpy(buf,pBuf->buf, pBuf->len);
WSABUF *pbuf=new WSABUF;
pbuf->buf = (char *)buf;
pbuf->len = pBuf->len;
CString strItem;
int nIndex = m_list.GetItemCount();
CTime t = CTime::GetCurrentTime();
strItem.Format("%02d:%02d:%02d",t.GetHour(),t.GetMinute(),t.GetSecond());
m_list.InsertItem(nIndex, strItem, -1);
strItem.Format("%d",pBuf->len);
m_list.SetItemText(nIndex,2,strItem);
strItem.Format("%d",buf[8]);
m_list.SetItemText(nIndex,2,strItem);
if(buf[9]>99)
	strItem = _T("IP/UNKNOWN");
else
	strItem = szProto[buf[9]];
m_list.SetItemText(nIndex, 3, strItem);
strItem.Format("%d.%d.%d.%d",buf[12],buf[13],buf[14],buf[15]);
m_list.SetItemText(nIndex, 4, strItem);
strItem.Format("%d.%d.%d.%d",buf[16],buf[17],buf[18],buf[19]);
m_list.SetItemText(nIndex, 5, strItem);
m_list.SetItemText(nIndex, 6, strItem);
m_list.SetItemData(nIndex, (DWORD)pbuf);
}
// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
//开始捕获
void CNetcapDlg::OnStart()
{
	if(m_listener.StartListen ())
	{
		CMenu* pMenu = GetMenu();
		CMenu* pSub = pMenu->GetSubMenu(0);
		pSub->EnableMenuItem(IDM_START, MF_GRAYED);
		pSub->EnableMenuItem(IDM_STOP,MF_ENABLED);
		m_wndToolBar.SendMessage(TB_SETSTATE, IDM_START, MAKELONG(TBSTATE_PRESSED|TBSTATE_INDETERMINATE, 0));
		m_wndToolBar.SendMessage(TB_SETSTATE, IDM_STOP, MAKELONG(TBSTATE_ENABLED,0));
	}
	else
	{
		MessageBox(TEXT("failed to start capture!"),TEXT("Error"),MB_OK);
	}
}

void CNetcapDlg::OnStop()
{
	m_listener.StopListen();
	CMenu* pMenu = GetMenu();
	CMenu* pSub = pMenu->GetSubMenu(0);
    pSub->EnableMenuItem(IDM_STOP, MF_GRAYED);
	pSub->EnableMenuItem(IDM_START, MF_ENABLED);
	m_wndToolBar.SendMessage(TB_SETSTATE, IDM_STOP,MAKELONG(TBSTATE_INDETERMINATE,0));
	m_wndToolBar.SendMessage(TB_SETSTATE, IDM_START, MAKELONG(TBSTATE_ENABLED, 0));
}

//set filter
void CNetcapDlg::OnFilter()
{
	m_dlgFilter.DoModal();
}
//当某个栏目被点中时,我们应该选择的索引
void CNetcapDlg::OnClickCaptureList(NMHDR* pNMHDR, LRESULT* pResult)
{
	if(pNMHDR->idFrom==IDC_CAPTURE_LIST)
	{
		POSITION pos = m_list.GetFirstSelectedItemPosition();
		do 
		{
			if(NULL==pos)
				break;
			if(m_nCurSel==pos)
				break;
			m_nCurSel = pos;
			OnSelectionChanged();
		} 
		while(FALSE);
	}
	*pResult = 0;
}

//在文本编辑控制里显示16进制
void CNetcapDlg::OnSelectionChanged()
{
	WSABUF *pBuf = (WSABUF *)m_list.GetItemData((int)m_nCurSel - 1);
	CString str;
	TCHAR *strBuf;
	UCHAR *p = (UCHAR *)pBuf->buf;
	strBuf=str.GetBuffer(((pBuf->len >> 4) + 1) * 60);
	for(int i = 0; i < (int) pBuf->len >> 4; i++)
	{
		for (int j=0; j<16; j++)
		{
			strBuf+= sprintf(strBuf, "%02X ", *p++ );
			if(j==7)
			{
				*strBuf++='-';
				*strBuf++=' ';
			}
		}
			*strBuf++=_T('\r');
			*strBuf++=_T('\n');
	}
	for(i <<= 4; i< (int)pBuf->len; i++)
	{
		strBuf += sprintf(strBuf, "%02X ", *p++);
		if(0 == (i + 1)% 8)
		{
			*strBuf++ = '-';
			*strBuf++ = '-';
		}
	}
	*strBuf = '\0';
	str.ReleaseBuffer();
	GetDlgItem(IDC_HEXVIEW)->SetWindowText(str);
}

//当 ->,<-,pgUp, PgDw 被按下,我们应该对可选项作出变化
void CNetcapDlg::OnKeydownCaptureList(NMHDR* pNMHDR, LRESULT* pResult)
{
	LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
	*pResult = 0;
	if(pNMHDR->idFrom == IDC_CAPTURE_LIST)
	{
		switch(pLVKeyDow->wVKey)
		{
		case VK_UP:
			if((int)m_nCurSel == 0)
				return;
			m_nCurSel--;
			break;
		case VK_DOWN:
			m_nCurSel++;
			break;
		case VK_PRIOR:
			m_nCurSel -= m_list.GetCountPerPage();
			break;
		case VK_NEXT:
			m_nCurSel = (POSITION)m_list.GetCountPerPage();
			break;
		default:
			return;
		}
		if((int)m_nCurSel <= 0)
			m_nCurSel = (POSITION)1;
		if((int)m_nCurSel > m_list.GetItemCount())
		m_nCurSel = (POSITION)m_list.GetItemCount();
		OnSelectionChanged();
	}
//清空列表


void CNetcapDlg::OnClearList() 
{
	// TODO: Add your command handler code here
	int nCount = m_list.GetItemCount();
	WSABUF *pBuf;
	for(int i = 0; i< nCount; i++)
	{
		pBuf = (WSABUF *)m_list.GetItemData(i);
		::GlobalFree(pBuf->buf);
		delete pBuf;
	}
	m_list.DeleteAllItems();
	m_nCurSel = NULL;
	GetDlgItem(IDC_HEXVIEW)->SetWindowText(_T(""));
}

void CNetcapDlg::OnDeleteItem() 
{
	// TODO: Add your command handler code here
	if(m_nCurSel != NULL)
	{
		int nIndex = (int)m_nCurSel - 1;
		WSABUF *pBuf = (WSABUF *)m_list.GetItemData(nIndex);
		::GlobalFree(pBuf->buf);
		delete pBuf;
		m_list.SetItemData(nIndex, (DWORD)0);
		m_list.DeleteItem(nIndex);
		m_nCurSel--;
		if(0==m_list.GetItemCount())
		{
			GetDlgItem(IDC_HEXVIEW)->SetWindowText(_T(""));
			return;
		}
		if((int)m_nCurSel <= 0)
			m_nCurSel = (POSITION)1;
		OnSelectionChanged();
	}
}

⌨️ 快捷键说明

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