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

📄 listendlg.cpp

📁 一个局域网检测程序,制作的非常的好,可以截获网内所有数据报,并进行内容分析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// listenDlg.cpp : implementation file
//

#include "stdafx.h"
#include "listen.h"
#include "listenDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CListenDlg dialog

BOOL b_IsRun=FALSE;

UINT RecvIpPro(LPVOID lpParam);
char* GetIp();
CString GetNowTime();
BOOL CreateLogFile(char *strInfo,char *strFileName="log.txt");
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,
						 WPARAM wParam,LPARAM lParam);

CListenDlg::CListenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CListenDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CListenDlg)
	m_iWprot = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_IsAllPort=TRUE;
	m_IsAllIp=TRUE;
	m_IsAllProto=TRUE;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CListenDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CListenDlg)
	DDX_Control(pDX, IDC_LIST1, m_NewList);
	DDX_Text(pDX, IDC_EDIT1, m_iWprot);
	DDV_MinMaxInt(pDX, m_iWprot, 0, 10000);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CListenDlg, CDialog)
	//{{AFX_MSG_MAP(CListenDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
	ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
	ON_BN_CLICKED(IDC_RADIO7, OnRadio7)
	ON_BN_CLICKED(IDC_RADIO8, OnRadio8)
	ON_COMMAND(ID_COPY_SIP, OnCopySip)
	ON_COMMAND(ID_COPY_DIP, OnCopyDip)
	ON_WM_SYSCOMMAND()
	ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListenDlg message handlers

BOOL CListenDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 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
	if(!InitSock())
		return FALSE;
	//添加系统菜单
	CMenu *pMenu=GetSystemMenu(FALSE);
	AppendMenu(pMenu->m_hMenu,MF_SEPARATOR,0,NULL);
	AppendMenu(pMenu->m_hMenu,MF_STRING,IDM_SYSMENU,"关于...");

	//初始化控件
	((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(TRUE);
	((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
	((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(TRUE);

	//初始化临界区对象
	InitializeCriticalSection(&m_ls);
	//建立显示IP包窗口
	m_IpShowDlg.Create(IDD_IPDATA,this);
	m_IpShowDlg.ShowWindow(SW_SHOW);
	CRect rect;
	GetClientRect(&rect);
//	ClientToScreen(&rect);
	m_IpShowDlg.MoveWindow(10,265,rect.right-20,100);
	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 CListenDlg::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();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CListenDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CListenDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	CWinThread *pThread=NULL;
	CButton* pBtn=(CButton *)GetDlgItem(IDC_BUTTON1);
	int n=pBtn->GetCheck();
	m_HostIp=GetIp(); //得到本机IP
	if(1==n) //开始监听
	{
		if(CreateSock()!=0) //建立
		{
			AfxMessageBox("WinSock设置失败");
			DestroyWindow();
		}
		else
		{
			b_IsRun=TRUE;
			pThread=AfxBeginThread(RecvIpPro,this);
		}
		pBtn->SetWindowText("停止监听");
	}
	else //停止监听
	{
		b_IsRun=FALSE;
		if(pThread)
		{
			TerminateThread(pThread->m_hThread, 0);
			CloseHandle(pThread->m_hThread);
		}

		if(m_RawSock)
			closesocket(m_RawSock);
		pBtn->SetWindowText("开始监听");
	}


}
//在线程冲中不断接受IP包
UINT RecvIpPro(LPVOID lpParam)
{
	int err=0;
	int recvLen;
	CListenDlg* pDlg=(CListenDlg*)lpParam;
	char recvBuf[MAX_PACK_LEN]={0};
	while(b_IsRun)
	{
		recvLen=recv(pDlg->m_RawSock,recvBuf,MAX_PACK_LEN,0);//接受数据
		
		if(err==SOCKET_ERROR)
		{
			if(WSAGetLastError()==WSAEWOULDBLOCK) //如果错误为阻塞那么将继续接受
				continue;
			break;
		}
		//处理已经接受到的IP包
		EnterCriticalSection(&pDlg->m_ls);
		pDlg->SplitIpPack(recvBuf,recvLen); //分解IP包
		pDlg->ShowIpInfo(recvBuf,recvLen); //显示数据
		LeaveCriticalSection(&pDlg->m_ls);
	}
	return 0;

}

//加载SOCK
BOOL CListenDlg::InitSock()
{
	WSADATA wsaData;
	int err;
	if((err=WSAStartup(MAKEWORD(2,2),&wsaData))!=0) //加载失败
		return FALSE;
	if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion) != 2) 
	{
		WSACleanup();//未能要求到所需的版本
		return FALSE;
	}
	return TRUE;
}

//建立原始套接字
int CListenDlg::CreateSock()
{
	int err;
	char name[10];
	hostent *pHostent;
	int port=8310;
	SOCKADDR_IN sockaddr;
	m_RawSock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
	if(m_RawSock==INVALID_SOCKET)
	{
		return WSAGetLastError(); //socket创建失败
	}
	
	err=gethostname(name,10);
	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //取本机用户名失败
	}

	pHostent=gethostbyname (name);

	sockaddr.sin_family=AF_INET;
	sockaddr.sin_port=htons(port);
	memcpy(&sockaddr.sin_addr.s_addr,pHostent->h_addr_list[0],
		pHostent->h_length);

	//free(pHostent);
	
	err=bind(m_RawSock,(SOCKADDR *)&sockaddr,sizeof(sockaddr));//绑定
	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //取本机用户名失败
	}
	BOOL bOptval=TRUE;

	//设置套节字选项
	setsockopt(m_RawSock,SOL_SOCKET,SO_REUSEADDR,(char*)&bOptval,sizeof(bOptval));
	err=setsockopt(m_RawSock,IPPROTO_IP,IP_HDRINCL,(char*)&bOptval, //IP_HDRINCL该选项使之能操作IP头
		sizeof(bOptval));
	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //设置套节字选项失败
	}

	//把网卡置于混杂模式。获取IO操作的相关信息
	DWORD dwBufferLen[10] ;
	DWORD dwBufferInLen = 1 ;
	DWORD dwBytesReturned = 0 ;
	err=WSAIoctl (
		m_RawSock,                                               
		SIO_RCVALL,       //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包                           
		&dwBufferInLen,                                     
		sizeof(dwBufferInLen),                                       
		&dwBufferLen,                                    
		sizeof(dwBufferLen),                                      
		&dwBytesReturned,                              
		NULL,                           
		NULL  
		);//最后两参数设置非阻塞


	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //设置套节字选项失败
	}
	return 0;
}

//分解IP包
void CListenDlg::SplitIpPack(char *pData, int len)
{
	IP_HEADER* pIpHead;
	pIpHead=(IP_HEADER*)pData; //转为IP头结构
	SOCKADDR_IN saSource,saDest; //中间变量分别为源IP地址结构和目标IP地址结构 

	//得到包中协议
	int iProtocol;
	iProtocol=pIpHead->proto;
	//得到协议字符形式表示m_szProtocol
	strncpy(m_szProtocol,CheckProtocol(iProtocol),MAX_PROTO_TEXT_LEN);


	//得到源IP
	saSource.sin_addr.s_addr=pIpHead->sourceIP;
	strncpy(m_szSourceIP,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN);

	//得到目标IP
	saDest.sin_addr.s_addr=pIpHead->destIP;
	strncpy(m_szDestIP,inet_ntoa(saDest.sin_addr),MAX_ADDR_LEN);

	//得到TTL
	int ttl;
	ttl=pIpHead->ttl;
	wsprintf(m_szTTL,"%d",ttl);

	//得到头长度
	int ihLen=sizeof(unsigned long)*(pIpHead->h_lenver & 0xf);

	m_ihLen=ihLen;
	unsigned short srcPort=0,destPort=0;
	switch(iProtocol) {
	case IPPROTO_TCP:
		TCP_HEADER* pTcpHead;
		pTcpHead=(TCP_HEADER*)(pData+ihLen);
		srcPort=ntohs(pTcpHead->th_sport);
		destPort=ntohs(pTcpHead->th_dport);
		wsprintf(m_szSourcePort,"%d",srcPort);
		wsprintf(m_szDestPort,"%d",destPort);
		break;
	case IPPROTO_UDP:
		UDP_HEADER* pUdpHead;
		pUdpHead=(UDP_HEADER*)(pData+ihLen);
		srcPort=ntohs(pUdpHead->uh_sport);
		destPort=ntohs(pUdpHead->uh_dport);	
		wsprintf(m_szSourcePort,"%d",srcPort);
		wsprintf(m_szDestPort,"%d",destPort);
		break;
	case IPPROTO_ICMP:
		ICMP_HEADER* pIcmpHead;
		pIcmpHead=(ICMP_HEADER*)(pData+ihLen);
		wsprintf(m_szSourcePort,"%s","");
		wsprintf(m_szDestPort,"%s","");
		break;
	default:
		wsprintf(m_szSourcePort,"%s","");
		wsprintf(m_szDestPort,"%s","");
	}

⌨️ 快捷键说明

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