VC++编程实现网络嗅探器
基于C#的网络嗅探器设计与实现【开题报告】

毕业设计开题报告计算机科学与技术基于C#的网络嗅探器设计与实现一、选题的背景、意义1.历史背景网络嗅探器,它与当前的网络生活有很大的关系,一些网络管理员普遍采用它,也有很多黑客通过使用它来获得他们想要的信息资料。
与电话线路不同,计算机网络是共享通信通道的,这就意味着计算机能够接收到发给其他计算机的信息。
捕获在网络中传输的数据信息就称为“窃听” [3]。
在内部网上,黑客想要迅速获得大量的账号,最有效的手段是使用嗅探程序。
这种方法要求运行嗅探器程序的主机和被监听的主机必须在同一个以太网段上。
以太网窃听则是对以太网设备上传送的数据包进行侦听,来探测感兴趣的包。
如果发现符合条件的包,就把它存下来[1]。
网络嗅探器通常运行在路由器或有路由功能的主机,这样就能对大量的数据进行监控。
信息革命正在改造我们的生活,这场革命早在工业化进程中就开始孕育。
20世纪50年代前的电报电话等基础通信技术和计算机技术的出现,为20世纪60年代计算机联网实验提供了最初的条件,20世纪70年代半导体微电子技术的飞跃以及数字技术的成熟为计算机网络走出军事的封锁环境、研究所和校园的象牙塔奠定了技术基础。
美国著名的未来学家阿尔温深刻地指出:“电脑网络的建立与普及将彻底改变人类的生存及生活模式,而控制与掌握网络的人就是人类未来的主宰,谁掌握了信息,控制了网络,谁就拥有整个世界[2]。
”为了发觉信息革命的巨大潜能,美国率先提出了信息高速公路的构思,提倡实施国家信息基础设施,西方发达国家紧跟着提出全球信息基础设施的提倡。
我国也大力推动信息化,普通老百姓在家里上Internet 周游世界已经成为今天的社会现实。
人们热情高涨地推动着信息化,期盼着信息化带来的理想成真[6]。
信息技术一个面促进了生产力的发展,提高了生产的效率,但同时对社会的稳定、生产秩序、经济基础的危险也在加大。
从历史上看,每次生产力的飞跃往往带来更为残冷的战争,使人类遭受更大的痛苦。
课程设计--基于C#的网络嗅探器的设计和实现

网络与信息安全课程设计网络嗅探器的设计和实现学院:计算机科学与技术班级:网络工程08-1班姓名:学号:指导老师:目录一、什么是嗅探器--------------------------------------------1二、嗅探器的作用---------------------------------------------1三、网络嗅探器的原理-----------------------------------------1四、反嗅探技术----------------------------------------------7五、网络嗅探器的设计-----------------------------------------8六、结语---------------------------------------------------14参考书目--------------------------------------------------14网络嗅探器的实际与实现一、什么是嗅探器嗅探器,可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。
简单一点解释:一部电话的窃听装置, 可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。
可是,计算机直接所传送的数据,事实上是大量的二进制数据。
因此, 一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据,嗅探器也就必须能够识别出那个协议对应于这个数据片断,只有这样才能够进行正确的解码。
计算机的嗅探器比起电话窃听器,有他独特的优势:很多的计算机网络采用的是“共享媒体"。
也就是说,你不必中断他的通讯,并且配置特别的线路,再安装嗅探器,你几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据。
我们称这种窃听方式为“基于混杂模式的嗅探”(promiscuous mode)。
计算机网络课程设计实验报告

计算机网络课程设计报告姓名:学号:班级:指导老师:湖南科技大学计算机科学与工程学院2013年6月实验一1。
实验名称:网络聊天程序的设计与实现2。
实验目的:通过本实验能够了解socket通信的原理并在此基础上编写一个聊天程序了解TCP/IP的基础知识,发现TCP与UDP的优缺点以及在网络通信的应用.3.实验原理:从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
当网络的边缘部分中的两个主机使用网络的两个主机使用网络的核心部分进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
从IP层来说,通信的两端是两个主机,IP数据报的首部明确的标志了这两个主机的IP地址.但是严格的讲,两个主机进行通信就是两个主机中的应用进程互相通信。
根据应用程序的不同需求,运输层需要有两种不同的运输协议,即是面向连接的TCP和无连接的UDP。
在使用这两个协议时运输层向高层用户屏蔽了下面的网络核心的细节,它使应用进程看见的就是好像在两个运输层实体间有一条端到端的逻辑通信信道,但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别.当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。
但当运输层采用无连接的UDP协议时,这种逻辑通信信道仍然是一条不可靠信道.由于我在课程设计中采用的是UDP协议进行通信的,这里就只简述一下一些关于UDP的内容,UDP在传送数据之前不需要先建立连接。
远地主机的运输层在收到UDP报文后,不需要给出任何确认。
虽然UDP不提供可靠的交付,但在某些情况下UDP却是一种最有效的工作方式.为此当我们使用UTP协议使两个计算机中的进程要互相通信,不仅必需知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。
用VC++6.0实现网络监听的程序

//{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.// Used by SniffApp.rc//#define IDM_ABOUTBOX 0x0010#define IDD_ABOUTBOX 100#define IDS_ABOUTBOX 101#define IDD_SNIFFAPP_DIALOG 102#define IDR_MAINFRAME 128#define IDI_ICON1 129#define IDC_LIST1 1000#define IDC_BEGINLISTEN 1001#define IDC_CANCEL 1002// Next default values for new objects//#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_V ALUE 130#define _APS_NEXT_COMMAND_V ALUE 32771#define _APS_NEXT_CONTROL_V ALUE 1003#define _APS_NEXT_SYMED_V ALUE 101#endif#endif下一部分// SniffApp.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "SniffApp.h"#include "SniffAppDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CSniffAppAppBEGIN_MESSAGE_MAP(CSniffAppApp, CWinApp)//{{AFX_MSG_MAP(CSniffAppApp)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSniffAppApp constructionCSniffAppApp::CSniffAppApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CSniffAppApp objectCSniffAppApp theApp;/////////////////////////////////////////////////////////////////////////////// CSniffAppApp initializationBOOL CSniffAppApp::InitInstance(){AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endif//初始化套接字WSADA TA data;AfxSocketInit(&data);//WSAStartup(2,&data);CSniffAppDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is// dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is// dismissed with Cancel}// Since the dialog has been closed, return FALSE so that we exit the// application, rather than start the application's message pump.return FALSE;}再下一篇// SniffApp.h : main header file for the SNIFFAPP application//#if !defined(AFX_SNIFFAPP_H__2D147315_8DFA_4AD1_9CA1_7C609AB716B0__INCLUD ED_)#define AFX_SNIFFAPP_H__2D147315_8DFA_4AD1_9CA1_7C609AB716B0__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CSniffAppApp:// See SniffApp.cpp for the implementation of this class//#include "winsock2.h"#pragma comment (lib,"ws2_32.lib")#include "AFXSOCK.H"class CSniffAppApp : public CWinApp{public:CSniffAppApp();// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CSniffAppApp)public:virtual BOOL InitInstance();//}}AFX_VIRTUAL// Implementation//{{AFX_MSG(CSniffAppApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft V isual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_SNIFFAPP_H__2D147315_8DFA_4AD1_9CA1_7C609AB716B0__INCLUDE D_)下下// SniffAppDlg.cpp : implementation file//#include "stdafx.h"#include "SniffApp.h"#include "SniffAppDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DA TA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSniffAppDlg dialogPROTONAME protos[11] = {{IPPROTO_IP ,"IP"},{IPPROTO_ICMP,"ICMP"},{IPPROTO_IGMP,"IGMP"},{IPPROTO_GGP,"GGP"},{IPPROTO_TCP,"TCP"},{IPPROTO_PUP,"PUP"},{IPPROTO_UDP,"UDP"},{IPPROTO_IDP,"IDP"},{IPPROTO_ND,"ND"},{IPPROTO_RA W,"RA W"},{IPPROTO_MAX,"MAX"}};char* get_protoname(int protoID){for (int i= 0; i<11; i++)if (protoID == protos[i].value){return protos[i].protoname;}return "";}CSniffAppDlg::CSniffAppDlg(CWnd* pParent /*=NULL*/): CDialog(CSniffAppDlg::IDD, pParent){//{{AFX_DA TA_INIT(CSniffAppDlg)//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_pThread = NULL;}void CSniffAppDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CSniffAppDlg)DDX_Control(pDX, IDC_LIST1, m_List);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CSniffAppDlg, CDialog)//{{AFX_MSG_MAP(CSniffAppDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BEGINLISTEN, OnBeginlisten)ON_BN_CLICKED(IDC_CANCEL, OnCancel)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CSniffAppDlg message handlersBOOL CSniffAppDlg::OnInitDialog(){CDialog::OnInitDialog();// 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_SEPARA TOR);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 dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconm_List.SetExtendedStyle(LVS_EX_FLA TSB|LVS_EX_GRIDLINES|LVS_EX_TWOCLICK ACTIV A TE);m_List.InsertColumn(0,"协议",LVCFMT_LEFT,80);m_List.InsertColumn(1,"源IP地址",LVCFMT_LEFT,120);m_List.InsertColumn(2,"目的IP地址",LVCFMT_LEFT,120);m_List.InsertColumn(3,"通信端口",LVCFMT_LEFT,80);m_List.InsertColumn(4,"大小",LVCFMT_LEFT,100);m_List.InsertColumn(5,"数据",LVCFMT_LEFT,120);return TRUE; // return TRUE unless you set the focus to a control}void CSniffAppDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// 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 CSniffAppDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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 icondc.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 CSniffAppDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CSniffAppDlg::OnOK(){}//线程函数UINT ThreadFun( LPVOID pParam ){CSniffAppDlg* pDlg = static_cast<CSniffAppDlg*>(pParam);MSG msg;char buffer[1000],sourceip[32] ,*tempbuf;char *ptemp;BYTE* pData = NULL; //实际数据报中的数据UINT sourceport ;CString str;HEADIP* pHeadIP;HEADICMP* pHeadICMP;HEADUDP* pHeadUDP;HEADTCP* pHeadTCP;in_addr addr;int ret;while (TRUE){pData = NULL;if(PeekMessage(&msg,pDlg->m_hWnd,WM_CLOSE,WM_CLOSE,PM_NOREMOVE )) {closesocket(pDlg->m_Sock);break;}memset(buffer,0,1000);ret = recv(pDlg->m_Sock,buffer,1000,0);if (ret == SOCKET_ERROR){continue;}else //接收到数据{tempbuf = buffer;pHeadIP = (HEADIP*)tempbuf;//获取数据报总长度WORD len = ntohs(pHeadIP->totallen);//获取源IPpDlg->m_List.InsertItem(pDlg->m_List.GetItemCount(),"");addr.S_un.S_addr = pHeadIP->sourceIP;ptemp = inet_ntoa(addr);pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,1,ptemp);//获取目的IPaddr.S_un.S_addr = pHeadIP->destIP;ptemp = inet_ntoa(addr);pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,2,ptemp);//获取协议名称ptemp = get_protoname(pHeadIP->proto);strcpy(sourceip,ptemp);pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,0,sourceip);//获取IP数据报总长度WORD ipSumLen = ntohs(pHeadIP->totallen);//IP数据报头总长度int ipHeadLen = 20;//获得去除IP层数据的长度WORD netlen = ipSumLen - ipHeadLen;//根据不同大协议获得不同协议的数据switch (pHeadIP->proto){case IPPROTO_ICMP:{pHeadICMP = (HEADICMP*)(tempbuf+20);pData = (BYTE*)(pHeadICMP)+4; //ICMP数据报头共4个字节//获取数据的长度netlen -= 4;break;}case IPPROTO_UDP:{pHeadUDP = (HEADUDP*)(tempbuf+20);pData = (BYTE*)pHeadUDP+8; //UDP数据报头共8个字节sourceport = ntohs(pHeadUDP->SourcePort);str.Format("%d",sourceport);//设置源端口pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str);str.Empty();netlen -= 8;break;}case IPPROTO_TCP:{pHeadTCP = (HEADTCP*)(tempbuf+20);sourceport = ntohs(pHeadTCP->SourcePort);pData = (BYTE*)pHeadTCP+20; //TCP数据报头共20个字节str.Format("%d",sourceport);//设置源端口pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,3,str);str.Empty();netlen-= 20;break;}}//设置数据大小str.Format("%d",netlen);pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,4,str);str.Empty();//设置数据if (pData != NULL){str.Format(" %s",pData);pDlg->m_List.SetItemText(pDlg->m_List.GetItemCount()-1,5,str);}str.Empty();}}return 0;}void CSniffAppDlg::OnBeginlisten(){//创建套接字m_Sock = socket(AF_INET,SOCK_RA W, IPPROTO_IP );char name[128];memset(name,0,128);hostent* phostent;phostent = gethostbyname(name);DWORD ip;ip = inet_addr(inet_ntoa(*(in_addr*)phostent->h_addr_list[0]));int timeout = 4000; //超时4秒//设置接收数据的超时时间setsockopt(m_Sock,SOL_SOCKET,SO_RCVTIMEO,(constchar*)&timeout,sizeof(timeout));sockaddr_in skaddr;skaddr.sin_family = AF_INET;skaddr.sin_port = htons(700);skaddr.sin_addr.S_un.S_addr = ip;//绑定地址if ( bind(m_Sock,(sockaddr*)&skaddr,sizeof(skaddr))==SOCKET_ERROR){MessageBox("地址绑定错误");return;}DWORD inBuffer=1;DWORD outBuffer[10];DWORD reV alue = 0;if(WSAIoctl(m_Sock,SIO_RCV ALL,&inBuffer,sizeof(inBuffer),&outBuffer,sizeof(outBuffer),&re V alue,NULL,NULL)==SOCKET_ERROR){MessageBox("设置缓冲区错误.");closesocket(m_Sock);return;}elsem_pThread = AfxBeginThread(ThreadFun,(void*)this);}void CSniffAppDlg::OnCancel(){if (m_pThread){//m_pThread->ExitInstance();delete m_pThread;}closesocket( m_Sock) ;CDialog::OnCancel();}// stdafx.cpp : source file that includes just the standard includes// SniffApp.pch will be the pre-compiled header// stdafx.obj will contain the pre-compiled type information#include "stdafx.h"了L// stdafx.h : include file for standard system include files,// or project specific include files that are used frequently, but// are changed infrequently//#if !defined(AFX_STDAFX_H__06E1D1F4_1E22_45B1_9F88_3D9B9C31074A__INCLUDED _)#define AFX_STDAFX_H__06E1D1F4_1E22_45B1_9F88_3D9B9C31074A__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers#include <afxwin.h> // MFC core and standard components#include <afxext.h> // MFC extensions#include <afxdisp.h> // MFC Automation classes#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls#ifndef _AFX_NO_AFXCMN_SUPPORT#include <afxcmn.h> // MFC support for Windows Common Controls#endif // _AFX_NO_AFXCMN_SUPPORT//{{AFX_INSERT_LOCA TION}}// Microsoft V isual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_STDAFX_H__06E1D1F4_1E22_45B1_9F88_3D9B9C31074A__INCLUDED_)。
C语言实现LINUX下网络嗅探程序SNIFFER

C语言实现LINUX下网络嗅探程序SNIFFER#include#include#include#include#include#include#include#include#include#includeint main(int argc,char**argv){int sock,n;char buffer[2048];unsigned char*iphead,*ethhead;struct ifreq ethreq;int no=0;//设置原始套接字方式为接收所有的数据包if((sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP)))<0) {perror("\n原始套接字建立失败\n");exit(1);}//设置网卡工作方式为混杂模式,SIOCGIFFLAGS请求表示需要获取接口标志strncpy(ethreq.ifr_name,"eth0",IFNAMSIZ);//Interface Name size if(ioctl(sock,SIOCGIFFLAGS,ðreq)==-1){perror("\n设置混杂工作模式失败\n");close(sock);exit(1);}//开始捕获数据并进行简单分析while(1){n=recvfrom(sock,buffer,2048,0,NULL,NULL);no++;printf("\n************%d packet%d bytes************\n",no,n);//检查包是否包含了至少完整的以太帧(14),IP(20)和TCP/UDP(8)包头if(n<42){perror("recvfrom():");exit(0);} ethhead=buffer;printf("Dest MAC address:%02x:%02x:%02x:%02x:%02x:%02x\n",ethhead[0],ethhead[1],ethhead[2],ethhead[3],ethhead[4],ethhead[5]);printf("Source MAC address:%02x:%02x:%02x:%02x:%02x:%02x\n",ethhead[6],ethhead[7],ethhead[8],ethhead[9],ethhead[10],ethhead[11]);iphead=buffer+14;/*跳过Ethernet header*/if(*iphead==0x45){/*Double check for IPv4*and no options present*/printf("Source host:%d.%d.%d.%d,",iphead[12],iphead[13],iphead[14],iphead[15]);printf("Dest host:%d.%d.%d.%d\n",iphead[16],iphead[17],iphead[18],iphead[19]);printf("Source port:%d,Dest port:%d",(iphead[20]<<8)+iphead[21],(iphead[22]<<8)+iphead[23]); if(iphead[9]==6)printf("TCP\n");else if(iphead[9]==17)printf("UDP\n");else printf("protocol id:%d\n",iphead[9]);}}}。
C#利用SharpPcap实现网络包捕获嗅探

C#利⽤SharpPcap实现⽹络包捕获嗅探本⽂是利⽤SharpPcap实现⽹络包的捕获的⼩例⼦,实现了端⼝监控,数据包捕获等功能,主要⽤于学习分享。
什么是SharpPcap?SharpPcap 是⼀个.NET 环境下的⽹络包捕获框架,基于著名的 pcap/WinPcap 库开发。
提供了捕获、注⼊、分析和构建的功能,适⽤于 C# 和 VB NET 开发语⾔。
SharpPcap有两部分组成:1> SharpPcap.dll 负责数据的捕获 2> PacketDotNet.dll负责数据包的解析思路:通过进程名字获取对应的端⼝号。
SharpPcap获取对应的数据包,通过解析数据包过滤相关的端⼝。
涉及知识点:Process 获取相关进程信息。
netstat命令:netstat -ano|find "3844" 获取进程对应的端⼝SharpPcap相关信息:通过CaptureDeviceList的静态⽅法获取设备列表。
通过OnPacketArrival事件接收数据包。
通过PacketDotNet来解析数据包效果图下:SharpPcap核⼼代码:/// <summary>/// 开始捕捉/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStart_Click(object sender, EventArgs e){if (bDevice.SelectedIndex > -1){StartCapture(bDevice.SelectedIndex);this.btnStart.Enabled = false;this.btnStop.Enabled = true;}else {MessageBox.Show(this,"请选择⼀个设备","提⽰",MessageBoxButtons.OK);}}/// <summary>/// 停⽌捕捉/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnStop_Click(object sender, EventArgs e){Shutdown();this.btnStop.Enabled = false;this.btnStart.Enabled = true;}private void StartCapture(int itemIndex){packetCount = 0;device = CaptureDeviceList.Instance[itemIndex];packetStrings = new Queue<PacketWrapper>();bs = new BindingSource();dgvData.DataSource = bs;LastStatisticsOutput = DateTime.Now;// start the background threadbackgroundThreadStop = false;backgroundThread = new Thread(BackgroundThread);backgroundThread.Start();// setup background capturedevice.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);device.OnCaptureStopped += new CaptureStoppedEventHandler(device_OnCaptureStopped);device.Open();// tcpdump filter to capture only TCP/IP packetsstring filter = "ip and tcp";device.Filter = filter;// force an initial statistics updatecaptureStatistics = device.Statistics;UpdateCaptureStatistics();// start the background capturedevice.StartCapture();btnStop.Enabled = true;}/// <summary>/// 设备接收事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void device_OnPacketArrival(object sender, CaptureEventArgs e){// print out periodic statistics about this devicevar Now = DateTime.Now;var interval = Now - LastStatisticsOutput;if (interval > new TimeSpan(0, 0, 2)){Console.WriteLine("device_OnPacketArrival: " + e.Device.Statistics);captureStatistics = e.Device.Statistics;statisticsUiNeedsUpdate = true;LastStatisticsOutput = Now;}lock (QueueLock){PacketQueue.Add(e.Packet);}}/// <summary>/// 设备停⽌事件/// </summary>/// <param name="sender"></param>/// <param name="status"></param>private void device_OnCaptureStopped(object sender, CaptureStoppedEventStatus status){if (status != pletedWithoutError){MessageBox.Show("Error stopping capture", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);}}private void UpdateCaptureStatistics(){tlblStatistic.Text = string.Format("接收包: {0}, 丢弃包: {1}, 接⼝丢弃包: {2}", captureStatistics.ReceivedPackets,captureStatistics.DroppedPackets, captureStatistics.InterfaceDroppedPackets); }以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
网络嗅探器实验报告

网络攻击与防御技术实验报告实验目的:本实验通过研究Winpcap中常用的库函数的使用方式来实现了一个小型的网络数据包抓包器,并通过对原始包文的分析来展示当前网络的运行状况。
实验内容:1.实现对网络基本数据包的捕获2.分析捕获到的数据包的详细信息实验环境:1.WpdPack_4_0_1支持库2.VC++6.0开发环境3.Windows操作系统实验设计:系统在设计过程中按照MVC的设计模式,整体分为三层。
第一层为Control层即控制层,这里为简化设计,将Control层分为两个部分,一部分为网络报文输入,另一部分为用户输入;第二层是Model层即模型层;第三层为View层即显示层。
系统的整体运行过程为:从Control层得到数据,交到Model层进行处理,将处理完的结果交View层进行显示。
Control层主要用于网络数据包的捕获以及获得用户的输入;Model层主要用于分析数据包,处理用户的输入;View层主要用于对处理后的结果进行显示。
详细过程:程序在执行过程中有两个核心的工作,一是调用Winpcap函数库实现下层抓包。
二是对抓到的包文进行分析。
下面分别列出两个核心过程的基本算法与相关的实现代码。
抓包算法:第一:初始化Winpcap开发库第二:获得当前的网卡列表,同时要求用户指定要操作的网卡第三:获得当前的过滤规则,可为空第四:调用库函数,pcap_loop(),同时并指定其回调函数,其中其回调函数为数据包分析过程。
对应的相应核心代码为:I f((pCap=pcap_open_live(getDevice()->name,65536,1,1000,strErrorBuf))==NULL){ return -1; }If(pcap_compile(pCap, &fcode, filter, 1, NetMask) < 0){ return -1; }if(pcap_setfilter(pCap, &fcode)<0){ return -1; }do{pcap_loop(pCap,1,pcap_handle,NULL);}while(nFlag);分析算法:第一:得到数据包,先将其转存到内存里,以备以后再用。
基于Winpcap的网络嗅探器的设计与实现.

收稿日期 :2008-11-053基金项目 :黄石理工学院 2008年科研项目 (08yjz18B 作者简介 :成俊 (1980— , 男 , 湖北大冶人 , 助教 , 本科。
文章编号 :1008-8245(2008 06-0022-04基于 W inpcap 的网络嗅探器的设计与实现3成俊李芳(黄石理工学院计算机学院摘要 :针对网络管理中的安全问题 , 以 W , V isual C ++为开发工具 , 设计了一个网络嗅探器。
, 捕获数据包的程序流程 , 最后给出具体实现的关键函数。
结果表明 , 捕获数据快 , 对网络的安全管理具有重要意义。
关键词 :; . 文献标识码 :ADesi gn and I mple ment ati on ofNetwork Sn i ffer Based on W i n pcapCHENG Jun L I Fang(School of Computer Science, Huangshi I nstitute of Technol ogy, Huangshi Hubei 435003Abstract:A i m ing at the security p r oble m s of net w ork management, the paper p r oposes a net w ork sniffer with W inpcap as devel opment p latfor m and V isual C++as devel opment t oolW inpcap and visual C++. The funda mental p rinci p le ofthe net w ork sniffer is analyzed and the p r ocedure during which W inpcap cap tures the packet is intr oduced . The key functi on is finally given. The results show that the net w ork sniffer has such advantages as si m p le structure and fast data cap ture, which is signifant t o the net w ork security and manage ment . Key words:packet cap ture; sniffer; W inpcap随着 I nternet 的迅猛发展 , 网络已日益成为工作和生活中不可或缺的工具。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++编程实现网络嗅探器VC++编程实现网络嗅探器中国电波传播研究所青岛分所郎锐引言从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sniffer)感到陌生,网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。
通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。
此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。
可见,嗅探器实际是一把双刃剑。
虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。
而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。
权衡利弊,有必要对网络嗅探器的实现原理进行介绍。
嗅探器设计原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。
但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。
而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。
显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。
具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。
在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。
为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。
至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。
但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。
通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。
由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。
下面先给出结构.数据包的总体结构:数据包IP头TCP头(或其他信息头)数据数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。
其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下:16位16位源端口目的端口UDP长度UDP校验和而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成:16位16位源端口目的端口顺序号确认号TCP 头长(保留)7位URGACKPSH RST SYN FIN 窗口大小校验和紧急指针可选项(0或更多的32位字)数据(可选项)对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义:typedef struct _TCP{ WORD SrcPort; // 源端口WORD DstPort; // 目的端口DWORD SeqNum; // 顺序号DWORD AckNum; // 确认号BYTE DataOff; // TCP头长BYTE Flags; // 标志(URG、ACK等)WORD Window; // 窗口大小WORD Chksum; // 校验和WORD UrgPtr; // 紧急指针} TCP;typedef TCP *LPTCP;typedef TCP UNALIGNED * ULPTCP;在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。
IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。
如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。
IP数据段头格式如下:16位16位版本 IHL 服务类型总长标识标志分段偏移生命期协议头校验和源地址目的地址选项(0或更多)同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义:typedef struct _IP{union{ BYTE Version; // 版本BYTE HdrLen; // IHL};BYTE ServiceType; // 服务类型WORD TotalLen; // 总长WORD ID; // 标识union{ WORD Flags; // 标志WORD FragOff; // 分段偏移};BYTE TimeToLive; // 生命期BYTE Protocol; // 协议WORD HdrChksum; // 头校验和DWORD SrcAddr; // 源地址DWORD DstAddr; // 目的地址BYTE Options; // 选项} IP;typedef IP * LPIP;typedef IP UNALIGNED * ULPIP;在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。
嗅探器的具体实现根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。
由于前面已经将程序的设计流程讲述的比较清楚了,因此这里就不在赘述了,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。
主要代码实现清单为:// 检查Winsock 版本号,WSAData为WSADATA结构对象WSAStartup(MAKEWORD(2, 2), &WSAData);// 创建原始套接字sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW));// 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));// 获取本机名gethostname((char*)LocalName, sizeof(LocalName)-1);// 获取本地IP 地址pHost = gethostbyname((char*)LocalName));// 填充SOCKADDR_IN结构addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IPaddr_in.sin_family = AF_INET;addr_in.sin_port = htons(57274);// 把原始套接字sock 绑定到本地网卡地址上bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));// dwValue为输入输出参数,为1时执行,0时取消DWORD dwValue = 1;// 设置SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。
其中SIO_RCVALL// 的定义为:#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)ioctlsocket(sock, SIO_RCVALL, &dwValue);前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。
然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析:while (true){// 接收原始数据包信息int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);if (ret > 0){// 对数据包进行分析,并输出分析结果ip = *(IP*)RecvBuf;tcp = *(TCP*)(RecvBuf + ip.HdrLen);TRACE("协议:%s\r\n",GetProtocolTxt(ip.Protocol));TRACE("IP源地址:%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));TRACE("IP目标地址: %s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));TRACE("TCP源端口号:%d\r\n",tcp.SrcPort);TRACE("TCP目标端口号:%d\r\n",tcp.DstPort);TRACE("数据包长度:%d\r\n\r\n\r\n",ntohs(ip.TotalLen));}}其中,在进行协议分析时,使用了GetProtocolTxt()函数,该函数负责将IP包中的协议(数字标识的)转化为文字输出,该函数实现如下:#define PROTOCOL_STRING_ICMP_TXT "ICMP"#define PROTOCOL_STRING_TCP_TXT "TCP"#define PROTOCOL_STRING_UDP_TXT "UDP"#define PROTOCOL_STRING_SPX_TXT "SPX"#define PROTOCOL_STRING_NCP_TXT "NCP"#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"……CString CSnifferDlg::GetProtocolTxt(int Protocol){switch (Protocol){case IPPROTO_ICMP : //1 /* control message protocol */return PROTOCOL_STRING_ICMP_TXT;case IPPROTO_TCP : //6 /* tcp */return PROTOCOL_STRING_TCP_TXT;case IPPROTO_UDP : //17 /* user datagram protocol */return PROTOCOL_STRING_UDP_TXT;default:return PROTOCOL_STRING_UNKNOW_TXT;}最后,为了使程序能成功编译,需要包含头文件winsock2.h和ws2tcpip.h。