基于winpcap的嗅探器设计与实现

基于winpcap的嗅探器设计与实现
基于winpcap的嗅探器设计与实现

计算机与信息学院

《计算机网络系统实践》报告

2013 年 9 月 25

设计题目:嗅探器的设计与实现

学生姓名:***

学 号:2010****

专业班级:信息安全****

一、设计要求

1.不限平台,可以使用Libpcap、WinPcap 或 Linux的原始套接字;

2.实现一个功能比较简单的、具有图形界面的Sniffer,主线程响应用户界

面操作,工作线程完成抓包等工作;

3.能够解析出IP层和传输层的协议头,能够过滤TCP、UDP等数据包;

4.能够输出文本方式传送的数据包的内容;

5.能够进行简单的流量统计。

二、开发环境与工具

操作系统:windows7

开发工具:visual studio

开发语言:C++

附加库:Winpcap

三、设计原理

网络嗅探器是一种常用的监听网络的工具。所谓嗅探器( Sniffer) ,是一种利用计算机网络接口截获网络数据的软件或硬件,可用于网络管理、网络协议分析以及网络安全等众多方面。嗅探器不同于一般的键捕获工具,后者只能捕获当地终端控制台上的按键内容,而嗅探器所“嗅”到的是动态的以信息包形式( 如IP 数据包或者以太网包) 封装的信息流。其中可能携带了重要数据或敏感信息。可以将这些捕获到的信息包存档,以利用相应工具可以作进一步分析。

计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。

网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模式: 网卡能够可以接收一切通过它的数据信息。

四、系统功能描述及软件模块划分

系统功能设计

本系统的基本功能为实现网络数据包的捕获, 并将其数据内容解析显示。网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调用winPcap提供的丰富的API函数来实现; 数据解析及显示部分主要负责界面数据转化、解析、处理、格式化、协议分析等, 这一部分主要通过MFC 来设计一个单文档图形用户界面GUI,解析结果将通过MFC的类库显示到GUI中

系统总系结构

网络嗅探器的整体设计由三个模块组成, 自底向上分别是嗅探器设置模块, 数据包捕获模块, 解析和显示模块。嗅探器设置模块主要调用w inP c aP 提供的API,分为获取网络设备信息,设置并编译过滤器,打开网络设备三个步骤。数据包捕获模块创建了新的线程,利用了winPcap的非回调函数Pcap_ next_ex()函数从winPcap底层驱动的数据缓冲区中读取数据包,并将数据包存储在系统临时文件中, 以便之后的分析。用Pcap_open_offline()函数从离线文件中读取包。读取到的任意一个符合捕获条件数据包, 将其内容解析, 并显示本数据包。捕获完成后, 进人解析和显示模块。(嗅探器总体结构如图1 )

图1.嗅探器总体结构

五、设计步骤

嗅探器的设置模块

a .获取已连接的网络设备列表, winPcap提供了pcap_findalldevs_ex()函

数, 这个函数返回一个PcaP-if结构的链表, 每个这样的结构都包含了一个适配器的详细信息。

b.打开网络设备,winPcap提供了pcap_open()函数,该函数第一参数制定要

捕获数据包的哪些部分, 第二参数用来制定适配器是否为混杂模式, 第三参数为读取数据的超时时间, 当适配器被打开后, 就可以进行捕获工作了;

c.设置过滤器, winPcap中用来过滤数据包的函数是pcap_compile()和pc

ap_setfilter()。pcap_compile()它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。pcap_setfilter()将一个过滤器与内核捕获会话相关联。当pcap_set_filter()被调用时, 这个过滤器将被应用到来自网络的所有数据包, 并且, 所有的符合要求的数据包(即那些经过过滤器以后, 布尔表达式为真的包), 将会立即复制给应用程序。

数据包的捕获模块

该部分创建了一个用于捕获数据包的线程, 在该线程中调用winPcap提供的pcap_next_ex()函数从底层驱动数据缓冲区中读取数据包, 该函数接受已打开的网络设备句柄, 返回捕获数据包的实体,并用pcap_dump函数将每一个数据包写人临时文件中。

解析与显示模块

该部分在接收到用户发出的捕获完成消息后, 将数据包从离线文件中逐条取出并进行解析和显示。将解析完毕数据包中的各项内容填人已经预先声明的协议的数据结构中, 包括(序号,捕获时间,以太帧长度,传输层协议,源IP 地址,目的IP地址,源MAC地址,目的MAC地址),然后将数据结构添加到列表视图中

WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。大多数Windows网络应用程序都是通过Winsock API (Windows套接口)这类高级编程接口访问网络的。这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。

然而,有时候“简便方法”并不能满足实际需要。有些程序希望绕过TCP/IP 协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。

络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。

2、WinPcap的目的和用途

开发WinPcap的目的是为Win32应用程序提供一种直接访问底层网络的能力。通过WinPcap,网络应用程序可以实现如下功能: 1) 捕获原始数据包,包括发送到本主机以及在共享网络上的数据包。

2) 数据过滤。在将数据包发送给应用程序之前按照用户的规定对捕获的数据包进行过滤。

3) 发送原始数据包。向网络发送原始数据包。 4) 数据包统计。对网络通信进行统计。

3、基于WinPcap可以开发的网络应用程序

基于WinPcap可以开发很多网络应用程序,典型的包括: 1) 网络和协议分析软件2) 网络监听软件 3) 网络通信量记录软件 4) 网络数据生成软件 5) 用户机网桥和路由器 6) 网络入侵探测系统 7) 网络扫描软件 8) 网络安全工具

二、WinPcap的体系结构分析

1、WinPcap的组成与结构

如图2.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。

4

向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持ANSI编码,而NT系统则提倡使用Unicode编码。

简单来讲,WinPcap典型的开发和运行环境是windows NT/2000/XP。当然,早期的WinPcap也支持windows 95/98/Me,但是,我们不推荐在windows 95/98/Me 下开发和运行基于WinPcap的网络应用。

二、WinPcap的体系结构分析

1、WinPcap的组成与结构

如图2.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。

1)数据包监听设备驱动程序技术实现上,为了实现抓包,系统必须

绕过操作系统的协议栈来访问在网络上传输的原始数据包(raw packet)。这就要求WinPcap的一部分运行在操作系统核心内部,直接与网络接口驱动交互。由于这个部分是系统依赖(system dependent)的,在Winpcap的解决方案中它被视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。Winpcap开发小组针对Windows95,Windows98,WindowsME,Windows NT 4,Windows2000和WindowsXP提供了不同版本的驱动(在Windows95/98/ME中是VXD文件,在WindowsNT/2000中是SYS文件)。这些驱动不仅提供了基本的特性(例如抓包、发送原始数据包——注入数据包),还有更高级的特性(例如可编程的过滤器系统和监视引擎)。前者可以被用来约束一个抓包会话只针对网络通信中的一个子集概括地讲,数据包监听设备驱动程序直接从数据链路层抓取网络数据包并过滤,将数据包不加修改地传递给运行在用户层的应用程序。它在不同的WINDOWS 系统下是不同。数据包监听设备驱动程序支持BPF过滤机制,可以灵活地设置过滤规则。

2)底层的动态连接库(packet.dll)和高层静态库(wpcap.dll)为了方便编程,WinPcap必须提供一个编程接口(API),这就是WinPcap的底层的动态连接库(packet.dll)和高层静态库(wpcap.dll)。这里,packet.dll提供了一个底层API,伴随着一个独立于Microsoft操作系统的编程接口,这些API可以直接用来访问驱动的函数;wpcap.dll导出了一组更强大的与libpcap一致的高层抓包函数库(capture primitives),这些函数使得数据包的捕获以一种与网络硬件和操作系统无关的方式进行

底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。

概括来讲,WinPcap包含了一个最优化的内核模式驱动——称作Netgroup Packet Filter(NPF),和一套与libpcap兼容的用户级函数库。WinPcap 使Unix平台下的应用程序能方便的移植到Win32平台下,并且它能使一套很大的Unix函数库只需通过简单的重新编译就立刻在Win32平台下使用。而且,由于网络监听的重要性,WinPcap还为此提供了特殊的系统调用函数。实际上,Windows 环境下的WinPcap与Unix环境下的Berkeley Packet Filter(BPF)在体系架构上是基本一致的。在Unix环境下,程序员只需要了解Libpcap提供的编程接口即可,Libpcap将应用程序与操作系统内核之间的相互作用隐藏起来,提供了一套与用户程序联系的函数和强大的捕获数据包的抽象接口。在Windows环境下,程序员主要基于wpcap.dll提供的编程接口开发应用程序。当然,程序要也可以使用packet.dll、NPF提供的编程接口,只是后者提供的API更加底层。

六、关键问题及其解决方法

界面初始化

BOOL CzszhangDlg::OnInitDialog()

{

CDialog::OnInitDialog();

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

}

}

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

ShowWindow(SW_MINIMIZE);

m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRI DLINES);

m_listCtrl.InsertColumn(0,_T("编号"),3,30); //1表示右,表示中,表示左

m_listCtrl.InsertColumn(1,_T("时间"),3,130);

m_listCtrl.InsertColumn(2,_T("长度"),3,72);

m_listCtrl.InsertColumn(3,_T("源MAC地址"),3,140);

m_listCtrl.InsertColumn(4,_T("目的MAC地址"),3,140);

m_listCtrl.InsertColumn(5,_T("协议"),3,70);

m_listCtrl.InsertColumn(6,_T("源IP地址"),3,145);

m_listCtrl.InsertColumn(7,_T("目的IP地址"),3,145);

m_combobox.AddString(_T("请选择一个网卡接口(必选)"));

m_comboBoxRule.AddString(_T("请选择过滤规则(可选)"));

if(sniffer_initCap()<0)

return FALSE;/*初始化接口列表*/

for(dev=alldev;dev;dev=dev->next)

{

if(dev->description)

m_combobox.AddString(CString(dev->description));

}

/*初始化过滤规则列表*/

m_comboBoxRule.AddString(_T("tcp"));

m_comboBoxRule.AddString(_T("udp"));

m_comboBoxRule.AddString(_T("ip"));

m_comboBoxRule.AddString(_T("icmp"));

m_comboBoxRule.AddString(_T("arp"));

m_combobox.SetCurSel(0);

m_comboBoxRule.SetCurSel(0);

m_buttonStop.EnableWindow(FALSE);

m_buttonSave.EnableWindow(FALSE);

return TRUE; // 除非将焦点设置到控件,否则返回TRUE

}

捕获数据包

//开始捕获

int CzszhangDlg::sniffer_startCap()

{

int if_index,filter_index,count;

u_int netmask;

struct bpf_program fcode;

CString Ncard;

sniffer_initCap();

//获得接口和过滤器索引

if_index = this->m_combobox.GetCurSel();

filter_index = this->m_comboBoxRule.GetCurSel();

if(0==if_index || CB_ERR == if_index)

{

MessageBox(_T("请选择一个合适的网卡接口"));

return -1;

}

if(CB_ERR == filter_index)

{

MessageBox(_T("过滤器选择错误"));

return -1;

}

/*获得选中的网卡接口*/

dev=alldev;

for(count=0;count

dev=dev->next;

if ((adhandle= pcap_open_live(dev->name, // 设备名

65536, //捕获数据包长度

1, // 混杂模式(非意味着是混杂模式)

1000, // 读超时设置

errbuf // 错误信息

)) == NULL)

{

MessageBox(_T("无法打开接口:"+CString(dev->description)));

pcap_freealldevs(alldev);

return -1;

}

/*检查是否为以太网*/

if(pcap_datalink(adhandle)!=DLT_EN10MB)

{

MessageBox(_T("这不适合于非以太网的网络!"));

pcap_freealldevs(alldev);

return -1;

}

if(dev->addresses!=NULL)

netmask=((struct sockaddr_in *)(dev->addresses->netmask))->sin_addr.S_un.S_addr;

else

netmask=0xffffff;

//编译过滤器

if(0==filter_index)

{

char filter[] = "";

if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 ) {

MessageBox(_T("语法错误,无法编译过滤器"));

pcap_freealldevs(alldev);

return -1;

}

}else{

CString str;

char *filter;

int len,x;

this->m_comboBoxRule.GetLBText(filter_index,str);

len = str.GetLength()+1;

filter = (char*)malloc(len);

for(x=0;x

{

filter[x] = str.GetAt(x);

}

if (pcap_compile(adhandle, &fcode, filter, 1, netmask) <0 ) {

MessageBox(_T("语法错误,无法编译过滤器"));

pcap_freealldevs(alldev);

return -1;

}

}

//设置过滤器

if (pcap_setfilter(adhandle, &fcode)<0)

{

MessageBox(_T("设置过滤器错误"));

pcap_freealldevs(alldev);

return -1;

}

/* 设置数据包存储路径*/

CFileFind file;

char thistime[30];

struct tm *ltime;

memset(filepath,0,512);

memset(filename,0,64);

if(!file.FindFile(_T("SavedData")))

{

CreateDirectory(_T("SavedData"),NULL);

}

time_t nowtime;

time(&nowtime);

ltime=localtime(&nowtime);

strftime(thistime,sizeof(thistime),"%Y%m%d %H%M%S",ltime);

strcpy(filepath,"SavedData\\");

strcat(filename,thistime);

strcat(filename,".zsz");

strcat(filepath,filename);

dumpfile =pcap_dump_open(adhandle, filepath);

if(dumpfile==NULL)

{

MessageBox(_T("文件创建错误!"));

return -1;

}

pcap_freealldevs(alldev);

/*接收数据,新建线程处理*/

LPDWORD threadCap=NULL;

m_ThreadHandle=CreateThread(NULL,0,sniffer_CapThread,this,0,threadCa p);

if(m_ThreadHandle==NULL)

{

int code=GetLastError();

CString str;

str.Format(_T("创建线程错误,代码为%d."),code);

MessageBox(str);

return -1;

}

return 1;

}

数据包处理

DWORD WINAPI sniffer_CapThread(LPVOID lpParameter)

{

int res,nItem ;

struct tm *ltime;

CString timestr,buf,srcMac,destMac;

time_t local_tv_sec;

struct pcap_pkthdr *header; //数据包头

const u_char *pkt_data=NULL,*pData=NULL; //网络中收到的字节流数据

u_char *ppkt_data;

CzszhangDlg *pthis = (CzszhangDlg*) lpParameter;

if(NULL == pthis->m_ThreadHandle)

{

MessageBox(NULL,_T("线程句柄错误"),_T("提示"),MB_OK);

return -1;

}

while((res = pcap_next_ex( pthis->adhandle, &header, &pkt_data)) >= 0) {

if(res == 0) //超时

continue;

struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt));

memset(data,0,sizeof(struct datapkt));

if(NULL == data)

{

MessageBox(NULL,_T("空间已满,无法接收新的数据包"),_T("Error"),MB_OK);

return -1;

}

//分析出错或所接收数据包不在处理范围内

if(analyze_frame(pkt_data,data,&(pthis->npacket))<0)

continue;

//将数据包保存到打开的文件中

if(pthis->dumpfile!=NULL)

{

pcap_dump((unsigned char*)pthis->dumpfile,header,pkt_data);

}

//更新各类数据包计数

pthis->sniffer_updateNPacket();

//将本地化后的数据装入一个链表中,以便后来使用

ppkt_data = (u_char*)malloc(header->len);

memcpy(ppkt_data,pkt_data,header->len);

pthis->m_localDataList.AddTail(data);

pthis->m_netDataList.AddTail(ppkt_data);

/*预处理,获得时间、长度*/

data->len = header->len; //链路中收到的数据长度

local_tv_sec = header->https://www.360docs.net/doc/f27936138.html,_sec;

ltime = localtime(&local_tv_sec);

data->time[0] = ltime->tm_year+1900;

data->time[1] = ltime->tm_mon+1;

data->time[2] = ltime->tm_mday;

data->time[3] = ltime->tm_hour;

data->time[4] = ltime->tm_min;

data->time[5] = ltime->tm_sec;

/*为新接收到的数据包在listControl中新建一个item*/

buf.Format(_T("%d"),pthis->npkt);

nItem = pthis->m_listCtrl.InsertItem(pthis->npkt,buf);

/*显示时间戳*/

timestr.Format(_T("%d/%d/%d %d:%d:%d"),data->time[0],

data->time[1],data->time[2],data->time[3],data->time[4],data->time[5]);

pthis->m_listCtrl.SetItemText(nItem,1,timestr);

/*显示长度*/

buf.Empty();

buf.Format(_T("%d"),data->len);

pthis->m_listCtrl.SetItemText(nItem,2,buf);

/*显示源MAC*/

buf.Empty();

buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->src [0],data->ethh->src[1],

data->ethh->src[2],data->ethh->src[3],data->ethh->src[4],data->ethh->src[5]);

pthis->m_listCtrl.SetItemText(nItem,3,buf);

/*显示目的MAC*/

buf.Empty();

buf.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),data->ethh->de st[0],data->ethh->dest[1],

data->ethh->dest[2],data->ethh->dest[3],data->ethh->dest[4],data->ethh->de st[5]);

pthis->m_listCtrl.SetItemText(nItem,4,buf);

/*获得协议*/

pthis->m_listCtrl.SetItemText(nItem,5,CString(data->pktType));

/*获得源IP*/

buf.Empty();

if(0x0806== data->ethh->type)

{

buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_srcip[0], data->arph->ar_srcip[1],data->arph->ar_srcip[2],data->arph->ar_srcip[3]);

}else if(0x0800 == data->ethh->type) {

struct in_addr in;

in.S_un.S_addr = data->iph->saddr;

buf = CString(inet_ntoa(in));

}else if(0x86dd ==data->ethh->type ){

int n;

for(n=0;n<8;n++)

{

if(n<=6)

buf.AppendFormat(_T("%02x:"),data->iph6->saddr[n]);

else

buf.AppendFormat(_T("%02x"),data->iph6->saddr[n]);

}

}

pthis->m_listCtrl.SetItemText(nItem,6,buf);

/*获得目的IP*/

buf.Empty();

if(0x0806 == data->ethh->type)

{

buf.Format(_T("%d.%d.%d.%d"),data->arph->ar_destip[0], data->arph->ar_destip[1],data->arph->ar_destip[2],data->arph->ar_destip[3]);

}else if(0x0800 == data->ethh->type){

struct in_addr in;

in.S_un.S_addr = data->iph->daddr;

buf = CString(inet_ntoa(in));

}else if(0x86dd ==data->ethh->type ){

int n;

for(n=0;n<8;n++)

{

if(n<=6)

buf.AppendFormat(_T("%02x:"),data->iph6->daddr[n]);

else

buf.AppendFormat(_T("%02x"),data->iph6->daddr[n]);

}

}

pthis->m_listCtrl.SetItemText(nItem,7,buf);

/*对包计数*/

pthis->npkt++;

}

return 1;

}

数据解析函数

/*分析链路层*/

int analyze_frame(const u_char * pkt,struct datapkt * data,struct pktcount *npacket)

{

int i;

struct ethhdr *ethh = (struct ethhdr*)pkt;

data->ethh = (struct ethhdr*)malloc(sizeof(struct ethhdr));

if(NULL == data->ethh)

return -1;

for(i=0;i<6;i++)

{

data->ethh->dest[i] = ethh->dest[i];

data->ethh->src[i] = ethh->src[i];

}

npacket->n_sum++;

data->ethh->type = ntohs(ethh->type);

//处理ARP还是IP包?

switch(data->ethh->type)

{

case 0x0806:

return analyze_arp((u_char*)pkt+14,data,npacket); //mac 头大小为

break;

case 0x0800:

return analyze_ip((u_char*)pkt+14,data,npacket);

break;

case 0x86dd:

return analyze_ip6((u_char*)pkt+14,data,npacket);

return -1;

break;

default:

npacket->n_other++;

return -1;

break;

}

return 1;

}

/*分析网络层:ARP*/

int analyze_arp(const u_char* pkt,datapkt *data,struct pktcount *npacket)

{

int i;

struct arphdr *arph = (struct arphdr*)pkt;

data->arph = (struct arphdr*)malloc(sizeof(struct arphdr));

if(NULL == data->arph )

return -1;

//复制IP及MAC

for(i=0;i<6;i++)

{

if(i<4)

{

data->arph->ar_destip[i] = arph->ar_destip[i];

data->arph->ar_srcip[i] = arph->ar_srcip[i];

}

data->arph->ar_destmac[i] = arph->ar_destmac[i];

data->arph->ar_srcmac[i]= arph->ar_srcmac[i];

}

data->arph->ar_hln = arph->ar_hln;

data->arph->ar_hrd = ntohs(arph->ar_hrd);

data->arph->ar_op = ntohs(arph->ar_op);

data->arph->ar_pln = arph->ar_pln;

data->arph->ar_pro = ntohs(arph->ar_pro);

strcpy(data->pktType,"ARP");

npacket->n_arp++;

return 1;

}

/*分析网络层:IP*/

int analyze_ip(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

int i;

struct iphdr *iph = (struct iphdr*)pkt;

data->iph = (struct iphdr*)malloc(sizeof(struct iphdr));

if(NULL == data->iph)

return -1;

data->iph->check = iph->check;

npacket->n_ip++;

data->iph->saddr = iph->saddr;

data->iph->daddr = iph->daddr;

data->iph->frag_off = iph->frag_off;

data->iph->id = iph->id;

data->iph->proto = iph->proto;

data->iph->tlen = ntohs(iph->tlen);

data->iph->tos = iph->tos;

data->iph->ttl = iph->ttl;

data->iph->ihl = iph->ihl;

data->iph->version = iph->version;

data->iph->op_pad = iph->op_pad;

int iplen = iph->ihl*4; //ip头长度

switch(iph->proto)

{

case PROTO_ICMP:

return analyze_icmp((u_char*)iph+iplen,data,npacket);

break;

case PROTO_TCP:

return analyze_tcp((u_char*)iph+iplen,data,npacket);

break;

case PROTO_UDP:

return analyze_udp((u_char*)iph+iplen,data,npacket);

break;

default :

return-1;

break;

}

return 1;

}

/*分析网络层:IPV6*/

int analyze_ip6(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

int i;

struct iphdr6 *iph6 = (struct iphdr6*)pkt;

data->iph6 = (struct iphdr6*)malloc(sizeof(struct iphdr6));

if(NULL == data->iph6)

return -1;

npacket->n_ip6++;

data->iph6->version = iph6->version;

data->iph6->flowtype = iph6->flowtype;

data->iph6->flowid = iph6->flowid;

data->iph6->plen = ntohs(iph6->plen);

data->iph6->nh = iph6->nh;

data->iph6->hlim =iph6->hlim;

for(i=0;i<16;i++)

{

data->iph6->saddr[i] = iph6->saddr[i];

data->iph6->daddr[i] = iph6->daddr[i];

}

switch(iph6->nh)

{

case 0x3a:

return analyze_icmp6((u_char*)iph6+40,data,npacket);

break;

case 0x06:

return analyze_tcp((u_char*)iph6+40,data,npacket);

break;

case 0x11:

return analyze_udp((u_char*)iph6+40,data,npacket);

break;

default :

return-1;

break;

}

return 1;

}

/*分析传输层:ICMP*/

int analyze_icmp(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

struct icmphdr* icmph = (struct icmphdr*)pkt;

data->icmph = (struct icmphdr*)malloc(sizeof(struct icmphdr));

if(NULL == data->icmph)

return -1;

data->icmph->chksum = icmph->chksum;

data->icmph->code = icmph->code;

data->icmph->seq =icmph->seq;

data->icmph->type = icmph->type;

strcpy(data->pktType,"ICMP");

npacket->n_icmp++;

return 1;

}

/*分析传输层:ICMPv6*/

int analyze_icmp6(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

int i;

struct icmphdr6* icmph6 = (struct icmphdr6*)pkt;

data->icmph6 = (struct icmphdr6*)malloc(sizeof(struct icmphdr6));

if(NULL == data->icmph6)

return -1;

data->icmph6->chksum = icmph6->chksum;

data->icmph6->code = icmph6->code;

data->icmph6->seq =icmph6->seq;

data->icmph6->type = icmph6->type;

data->icmph6->op_len = icmph6->op_len;

data->icmph6->op_type = icmph6->op_type;

for(i=0;i<6;i++)

{

data->icmph6->op_ethaddr[i] = icmph6->op_ethaddr[i];

}

strcpy(data->pktType,"ICMPv6");

npacket->n_icmp6++;

return 1;

}

/*分析传输层:TCP*/

int analyze_tcp(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

struct tcphdr *tcph = (struct tcphdr*)pkt;

data->tcph = (struct tcphdr*)malloc(sizeof(struct tcphdr));

if(NULL == data->tcph)

return -1;

data->tcph->ack_seq = tcph->ack_seq;

data->tcph->check = tcph->check;

data->tcph->doff = tcph->doff;

data->tcph->res1 = tcph->res1;

data->tcph->cwr = tcph->cwr;

data->tcph->ece = tcph->ece;

data->tcph->urg = tcph->urg;

data->tcph->ack = tcph->ack;

data->tcph->psh = tcph->psh;

data->tcph->rst = tcph->rst;

data->tcph->syn = tcph->syn;

data->tcph->fin = tcph->fin;

data->tcph->dport = ntohs(tcph->dport);

data->tcph->seq = tcph->seq;

data->tcph->sport = ntohs(tcph->sport);

data->tcph->urg_ptr = tcph->urg_ptr;

data->tcph->window= tcph->window;

data->tcph->opt = tcph->opt;

//http??

if(ntohs(tcph->dport) == 80 || ntohs(tcph->sport)==80)

{

npacket->n_http++;

strcpy(data->pktType,"HTTP");

}

else{

npacket->n_tcp++;

strcpy(data->pktType,"TCP");

}

return 1;

}

/*分析传输层:UDP*/

int analyze_udp(const u_char* pkt,datapkt *data,struct pktcount *npacket) {

struct udphdr* udph = (struct udphdr*)pkt;

data->udph = (struct udphdr*)malloc(sizeof(struct udphdr));

if(NULL == data->udph )

return -1;

data->udph->check = udph->check;

data->udph->dport = ntohs(udph->dport);

data->udph->len = ntohs(udph->len);

基于winpcap的嗅探器设计与实现

基于winpcap的嗅探器设计与实现

计算机与信息学院 《计算机网络系统实践》报告 设计题目:嗅探器的设计与实现 学生姓名:*** 学号:2010**** 专业班级:信息安全****

2013 年9 月25 一、设计要求 1.不限平台,可以使用Libpcap、WinPcap 或 Linux的原始套接字; 2.实现一个功能比较简单的、具有图形界面的Sniffer,主线程响应用户界 面操作,工作线程完成抓包等工作; 3.能够解析出IP层和传输层的协议头,能够过滤TCP、UDP等数据包; 4.能够输出文本方式传送的数据包的内容; 5.能够进行简单的流量统计。 二、开发环境与工具

操作系统:windows7 开发工具:visual studio 开发语言:C++ 附加库:Winpcap 三、设计原理 网络嗅探器是一种常用的监听网络的工具。所谓嗅探器( Sniffer) ,是一种利用计算机网络接口截获网络数据的软件或硬件,可用于网络管理、网络协议分析以及网络安全等众多方面。嗅探器不同于一般的键捕获工具,后者只能捕获当地终端控制台上的按键内容,而嗅探器所“嗅”到的是动态的以信息包形式( 如IP 数据包或者以太网包) 封装的信息流。其中可能携带了重要数据或敏感信息。可以将这些捕获到的信息包存档,以利用相应工具可以作进一步分析。 计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。 网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模式: 网卡能够可以接收一切通过它的数据信息。 四、系统功能描述及软件模块划分 系统功能设计 本系统的基本功能为实现网络数据包的捕获, 并将其数据内容解析显示。网络数据包捕获功能主要负责从网络中捕获和过滤数据,这可以通过调

网络嗅探器的设计与实现

计算机网络课程设计 题目网络嗅探器的设计与实现 系 (部) 姓名 学号 指导教师 2015年7月18日

计算机网络课程设计任务书

网络嗅探器的设计与实现 摘要:网络嗅探器是对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法。本设计是关于网络嗅探器的设计与实现,其功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。 关键字:网络嗅探器;数据包捕获; 套接字 引言 由于网络技术的发展,计算机网络的应用越来越广泛,其作用也越来越重要。计算机网络安全问题更加严重,网络破坏所造成的损失越来越大。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。 嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。嗅探器是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。 1 基本概念 1.1 嗅探器 每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式: a)广播方式:该模式下的网卡能够接收网络中的广播信息。 b)组播方式:设置在该模式下的网卡能够接收组播数据。 c)直接方式:在这种模式下,只有目的网卡才能接收该数据。

(2020年编辑)网络嗅探器的设计与实现

《网络与信息安全》课程设计报告 班级学号:姓名: 题目: 评阅: 成绩: 2011年1月

目录 一、开发背景 1、网络安全现状。 2、开发意义。 二、设计分析 1、实现目标。 2、开发技术简介。 三、详细设计 1、嗅探原理。 2、代码设计。 四、测试运行 五、总结 六、参考文献

摘要 网络嗅探器是作用在网络上的一种监听程序,它是系统管理员的一个得力助手,管理员可以用它来分析网络。例如当网络繁忙时可利用它来查找是哪一段网络繁忙,数据报文是属于哪一种协议,这样可以计算出哪种业务受欢迎。但是当有黑客使用它时,它又变得很可怕。它可以非法获取一些保密性信息,如帐号、密码等,它带来的负面破坏是非常大的。作为从事网络安全技术方面的人员来说,要想有效地利用它、防范它就得深入地学习、分析网络嗅探技术。 1、本设计的基本任务是设计一个嗅探软件,实现对常用网络数据包抓取、分析。 2、软件所要完成对本机在网络中的通信数据,比如协议类型,源、目的地址和端口、数据包 的大小等加以分析的功能。 3、本设计用到的开发工具为Microsoft Visual Studio 2010 开发环境为Windows 7。 4、程序由韩瑞彬同学和我共同完成,本人主要负责主界面的设计和网络数据包的抓取,韩 瑞彬同学负责对数据包的解析设计。 关键字:嗅探器,安全,黑客,数据报文 一、开发背景

1、网络安全现状 随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet 的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。 2、开发意义 本次设计只是对抓取到的本机在网络中的通信数据,比如说协议类型,源、目的地址和端口、数据包的大小等加以分析,而无法做到像Sniffer 或者影音神探那种成熟的嗅探器所拥有的强大功能。作为从事网络技术方面的人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对网络安全技术这门课的学以致用,不断提高自我的一种有效途径。 二、设计分析 1、实现目标 (1)实现网络嗅探器的界面。 (2)实现抓取数据包的功能。

WinPcap开发-零基础知识入门基础

WinPcap开发(一):零基础入门 *原创作者:追影人 0×00 前言 网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题。而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具。 0×01 winpcap是什么? winpcap(windows packet capture)是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程。著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程。 有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了。需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。所以它只能“嗅探”到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目。 0×02 你需要准备些什么?

本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计及网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解。在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建及快速编写核心代码。但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpc ap开发库支持的编程语言,自己能动手实践编写一些例子。Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、python,好像连易语言都有。本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践。 0×03 你能学到什么? 有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:

网络嗅探器的设计实现

- - -. 《网络与信息安全》课程设计报告

2011年1月 目录 一、开发背景 1、网络安全现状。 2、开发意义。 二、设计分析 1、实现目标。 2、开发技术简介。 三、详细设计 1、嗅探原理。 2、代码设计。 四、测试运行 五、总结

六、参考文献 摘要 网络嗅探器是作用在网络上的一种监听程序,它是系统管理员的一个得力助手,管理员可以用它来分析网络。例如当网络繁忙时可利用它来查找是哪一段网络繁忙,数据报文是属于哪一种协议,这样可以计算出哪种业务受欢迎。但是当有黑客使用它时,它又变得很可怕。它可以非法获取一些XX性信息,如XX、密码等,它带来的负面破坏是非常大的。作为从事网络安全技术方面的人员来说,要想有效地利用它、防X它就得深入地学习、分析网络嗅探技术。 1、本设计的基本任务是设计一个嗅探软件,实现对常用网络数据包抓取、分析。 2、软件所要完成对本机在网络中的通信数据,比如协议类型,源、目的地址和端口、数据包 的大小等加以分析的功能。 3、本设计用到的开发工具为Microsoft Visual Studio 2010 开发环境为Windows 7。 4、程序由韩瑞彬同学和我共同完成,本人主要负责主界面的设计和网络数据包的抓取,韩 瑞彬同学负责对数据包的解析设计。 关键字:嗅探器,安全,黑客,数据报文

一、开发背景 1、网络安全现状 随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet 的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题

《网络嗅探器》课程设计报告

《网络与信息安全技术》课程报告 课题名称:网络嗅探器提交报告时间:2010年12月17 日 网络嗅探器 专业 组号指导老师 [摘要]随着网络技术的飞速发展,网络安全问题越来越被人重视。嗅探技术作为网络安全攻防中最基础的技术,既可以用于获取网络中传输的大量敏感信息,也可以用于网络管理。通过获取网络数据包的流向和内容等信息,可以进行网络安全分析和网络威胁应对。因此对网络嗅探器的研究具有重要意义。 本课程设计通过分析网络上常用的嗅探器软件,在了解其功能和原理的基础上,以VC为开发平台,使用Windows环境下的网络数据包捕获开发库WinPcap,按照软件工程的思想进行设计并实现了一个网络嗅探工具。该嗅探工具的总体架构划分为5部分,分别是最底层的数据缓存和数据访问,中间层的数据捕获,协议过滤,协议分析和最顶层的图形画用户界面。 本嗅探器工具完成了数据包捕获及分析,协议过滤的主要功能,实现了对网络协议,源IP 地址,目标IP地址及端口号等信息的显示,使得程序能够比较全面地分析出相关信息以供用户参考决策。 关键词:网络嗅探;WinPcap编程接口;数据包;网络协议;多线程 (中文摘要在150字左右。摘要正文尽量用纯文字叙述。用五号宋体字。姓名与摘要正文之间空二行。关键词与摘要之间不空行。“摘要”这两个字加粗) 关键词:入侵检测系统;感应器;分析器;分布式入侵检测系统模型 Network sniffer Major: software engineering Group Number: 29 [Abstract] With the rapid development of network technology, network security is increasingly being attention. Sniffing network security technology as the most basic offensive and defensive

网络嗅探器的设计与实现论文总结

目录 1 引言 (1) 1.1 开发背景 (1) 1.2 开发意义 (1) 2 系统分析 (2) 2.1 设计概述 (2) 2.1.1 实现目标 (2) 2.1.2 开发环境 (2) 2.2 开发相关技术简介 (2) 2.2.1 C#语言简介 (2) 2.2.2 嗅探技术简介 (3) 2.2.3 TCP/IP协议 (4) 2.2.4 数据包简介 (6) 2.3 可行性分析 (8) 3 详细设计 (9) 3.1 设计原理 (9) 3.2 功能说明 (12) 3.3 系统实施 (12) 3.4 系统测试 (14) 4 论文总结 (19) 5 参考文献 (20) 6 致谢 (21)

1 引言 1.1 开发背景 随着各种新的网络技术的不断出现、应用和发展,计算机网络的应用越来越广泛,其作用也越来越重要。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。计算机网络安全问题越来越严重,网络破坏所造成的损失越来越大。Internet的安全已经成为亟待解决的问题。多数黑客入侵成功并植入后门后的第一件事就是选择一个合适当前网络的嗅探器,以获得更多的受侵者的信息。嗅探器是一种常用的收集有用数据的方法,可以作为分析网络数据包的设备。网络嗅探器就是利用计算机的网络接口截获其他计算机的数据报文的一种工具,而且它与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器捕获的则是真实的网络报文.如果把网络嗅探器放置于网络节点处,对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法,可以分析各种信息包并描述出网络的结构和使用的机器,由于它接收任何一个在同一网段上传输的数据包,所以也就存在着捕获密码、各种信息、秘密文档等一些没有加密的信息的可能性。这成为黑客们常用的扩大战果的方法,用来夺取其他主机的控制权。当然嗅探器的正当用处主要是网络管理人员分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器截获网络中的数据包,分析问题的所在。[1] 1.2 开发意义 本次毕业设计是基于C#的网络嗅探器的设计与实现,由于本人能力上的限度,只是对抓取到的本机在网络中的通信数据,比如说协议类型,源、目的地址和端口、数据包的大小等加以分析,而无法做到像Sniffer或者影音神探那种成熟的嗅探器所拥有的强大功能。作为从事网络技术方面的人员来说,要想有效地利用它、防范它,就得深入地学习、分析网络嗅探技术。最为重要的是,对于网络嗅探器的设计与实现,使我对网络通信,数据传输和网络信息安全等有了切身的体会与融入,同时也是对大学四年的学以致用,不断提高自我的一种有效途径。

winpcap环境部署(VC6.0出现找不到“pcap.h_'”文件解决方法)

Winpcap 环境部署 (VC6.0出现“pcap.h': No such file or directory”问题解决方法)Winpcap简介及Winpcap安装包和开发包下载地址: Winpcap是一个强大的网络开发库,可以实现许多功能:获取可用的网络适配器;获取指定适配器信息(比如名称和描述信息);捕获指定网卡的数据封包;发送数据封包;过滤捕获的包以获取特定包等。 首先到https://www.360docs.net/doc/f27936138.html,/install/default.htm下载安装winpcap 驱动和DLL组件。 注意下图被红线圈起来的地方,即使下载地址,点击进入 然后到https://www.360docs.net/doc/f27936138.html,/devel.htm.下载winpcap开发包,解压到指定目录,这里我解压到C:\WpdPack_4_0_2\WpdPack,可以看到里面包含了:Lib,Include,文档

和示例程序。 把安装包和开发包下载下来后,执行安装包,这样你的机子就能运行winpcap程序了,解压开发包里面有 具体解决方法: 这里的include和lib文件夹里的东西因为vc6.0里没有,所以编译一些程序时我们要手动添加。如果出现fatal error C1083: Cannot open include file: 'pcap.h': No such file or directory这个问题,就需要添加了。 下面是具体添加步骤: 第一步:

点菜单栏上的“工具”,再点击下拉菜单中的“选项”弹出“选项”对话框 点“目录”在“目录【S】”的下面选择include files然后按底下的添加符号,把你写的winpcap 开发包解压到的具体路径添加进去,如上图我的路径是

wireshark捕获过滤器与显示过滤器

Wireshark 捕获过滤器与显示过滤器 使用Wireshark 时最常见的问题,是当您使用默认设置时,会得到大量冗余信息,以至于很难找到自己需要的部分。 过犹不及。 这就是为什么过滤器会如此重要。它们可以帮助我们在庞杂的结果中迅速找到我们需要的信息。 - - 捕捉过滤器:用于决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。 显示过滤器:在捕捉结果中进行详细查找。他们可以在得到捕捉结果后随意修改。 那么我应该使用哪一种过滤器呢? 两种过滤器的目的是不同的。 捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。 显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。 两种过滤器使用的语法是完全不同的。我们将在接下来的几页中对它们进行介绍: 1. 捕捉过滤器 2. 显示过滤器 1. 捕捉过滤器 捕捉过滤器的语法与其它使用Lipcap (Linux )或者Winpcap (Windows )库开发的软件一样,比如著名的TCPdump 。捕捉过滤器必须在开始捕捉前设置完毕,这一点跟显示过滤器是不同的。 设置捕捉过滤器的步骤是: - 选择 capture -> options 。 - 填写"capture filter"栏或者点击"capture filter"按钮为您的过滤器起一个名字并保存,以便在今后的捕捉中继续使用这个过滤器。 - 点击开始(Start )进行捕捉。

语法: 例子:tcp dst 10.1.1.1 80 and tcp dst 10.2.2.2 3128 Protocol(协议): 可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp. 如果没有特别指明是什么协议,则默认使用所有支持的协议。 Direction(方向): 可能的值: src, dst, src and dst, src or dst

WinpCap 编写抓包程序

利用WinpCap 编写抓包程序 网友:yeahilly 发布于:2008.05.20 11:12(共有条评论) 查看评论| 我要评论 WinpCap是一个公开的免费的抓包驱动加开发包,利用它,可以大大缩短我们的开发周期。 首先,先枚举系统中的所有网卡: /* 获取设备列表*/ if (pcap_findalldevs(&alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } /* 数据列表*/ for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } 然后选择网卡,然后设备。 if ( (adhandle= pcap_open_live(d->name, //设备名 65536, // 捕捉完整的数据包 1 , // 混在模式 1, // 读入超时

errbuf // 错误缓冲 ) ) == NULL) { printf("Unable to open the adapter"); pcap_freealldevs(alldevs); return; } 打开设备之后,我们就可以利用adhandle句柄来正式抓包了,先新建一个回调函数,形如 void packet_handler(u_char* packets,const struct pcap_pkthdr *header,const u_char *data) { } 然 后调用pcap_loop(adhandle, 0, packet_handler, NULL);pcap_loop的最后一个参数和packet_handler的packets参数是对应的,用于在函数间传递数据。WinpCap每收 到一个包就自动调用packet_handler函数,将包的内容作为data参数,我们对data作强制类型转化就可以得到数据包各部分的内容。 事实上,WinpCap开发包除了可以用回调函数抓包外,还可以用非回调的方法。在得到adhandle后不调用pcap_loop,而用下面的方法:while(1) { res = pcap_next_ex(adhandle,&header,&data); if(res==0) { Sleep(100); continue; } } 用pcap_next_ex读取数据包内容,至于if(res==0)这一段是为了防止没数据包到达时重复循环。

Winpcap的体系结构与性能研究

Winpcap的体系结构与性能研究 摘要: Winpcap有一系列创新(如数据包监视和数据包注入)的特点,这在以前的操作系统中是见不到的。介绍了Winpcap的系统结构及其功能。关键词: Winpcap;数据包监测;数据包注入 网络分析软件通常依赖底层调用抓取数据包,进行数据包监视或流量分析等。大多数的Unix系统都提供这些功能(至少是数据包抓取),而Windows提供的这些功能却不令人满意。Windows提供了一些与各种内核组件相关的API,但这些API存在严重的缺陷,如并不是所有的Netmon API都可用,而且其扩展存在很多限制。IP过滤驱动程序(IP filter driver)只存在Windows 2000及以上系统中,而且它只支持IP协议,虽然它能够控制和丢弃数据包但却不能监测和构造数据包。PCAUSA提供了一个商业产品,该产品含有数据包捕获和BPF兼容的过滤器,然而它的用户接口处于底层且没有提供过滤器构造这样的抽象方法。随着原本在Unix系统上的应用不断转向Windows系统,这些特性的缺失成了不可忽视的问题。本文主要介绍一个强大可扩展的Win32平台的网络监听框架系统Winpcap的结构及其功能。该体系结构填补了Unix和Windows间网络监听能力的间隔,使得Unix应用到Windows的移植更简单,而且Winpcap把性能放在最首位,使其能满足更苛刻的需求。1 Winpcap的体系结构Winpcap的基本结构,由1个过滤引擎、2个缓冲区(内核层与用户层)以及一系列供开发人员使用的组件库组成。尽管Libpcap具有稳固的结构并且功能强大,但Winpcap在结构和数据捕获上仍然有自己独到的地方,而且甚至可以认为是对Libpcap的创新。 Winpcap的过滤可从用户层开始(与Libpcap兼容),开发人员可以自定义包过滤条件(如picks up all udp packets);Winpcap会把它们编译成一些虚拟指令(如if the packet is ip and the protocol type field is equal to 17,then return true),同时把这些虚拟指令发送到过滤引擎,并且激活这些功能。要实现这些目的,内核模块必须能够执行指令,因此需要一个“虚拟BPF”用来在每个接收的数据包执行这些虚拟代码。其中内核层的过滤引擎是获得高性能的关键。NPF与BPF在体系上最大的不同是对循环缓冲区的使用选择[1]。Winpcap每次复制一部分数据包,Winpcap的缓冲区不再是固定大小(Libpcap 的内核缓冲区与用户缓冲区都是32 KB),而且在将数据包从内核缓冲区复制到用户缓冲区的过程中对数据包进行更新,而不是复制完后更新。在复制过程中,将已经传送的数据包所占用的空间立即释放,因为尽管Winpcap工作在较高的优先级并且可能一直垄断CPU,但内核层的捕获程序可能会中断复制过程。只要交换缓冲区允许占用一般的内存,Winpcap的缓冲区就可以存放大量的数据包。内核缓冲区仅通过一个read函数就可以完全复制,这可以减少大量的系统调用并且避免程序在内核层与用户层之间频繁切换。因为环境的切换之前必须保存任务状态(CPU描述符与任务状态大约有几百个字节),频繁切换会导致CPU使用率下降。Winpcap的内核缓冲区比BPF的要大(为1 MB),因为较小的内核缓存也会带来一些问题,特别是当程序无法与捕获数据包的驱动程序的速度保持一致情况下,这种情况在将数据发往硬盘或网络数据量激增的情况下很常见。相反,用户缓冲区需要小一些,通常情况下为256 KB。内核缓冲区与用户缓冲区都可以在运行时调整。用户缓冲区的大小至关重要,因为它决定了仅通过一个调用最多可以从内核读多少数据,同时,一次从内核中至少应该读多少数据也很重要。如果给出一个较大的值,则内核可以在数据送往用户缓冲区之前等待足够多的数据包到达,这可以减少一些系统调用。如果给出一个较小的值,则意味着内核可以将数据包尽快送往用户缓存。这对那些实时性要求比较高的应用来说很重要,一个好的捕获引擎会在两者之间做出好的平衡。NPF是可配置的,让用户选择程序具有好的执行效率或快速的反应。而Winpcap提供了一组函数可以设置数据包读延时和数据包拷贝的最小值。当读延时或内核

网络嗅探器的设计与实现

{ 计算机网络课程设计 题目网络嗅探器的设计与实现] 系 (部) 姓名 学号 指导教师 # 2015年7月18日

计算机网络课程设计任务书

网络嗅探器的设计与实现 摘要:网络嗅探器是对网络中的数据帧进行捕获的一种被动监听手段,是一种常用的收集有用数据的方法。本设计是关于网络嗅探器的设计与实现,其功能包括实现网络层抓包,对获得包的源和目的地址、端口、协议等进行分析和实现简单的包嗅探器功能。 关键字:网络嗅探器;数据包捕获; 套接字 引言 由于网络技术的发展,计算机网络的应用越来越广泛,其作用也越来越重要。计算机网络安全问题更加严重,网络破坏所造成的损失越来越大。但是由于计算机系统中软硬件的脆弱性和计算机网络的脆弱性以及地理分布的位置、自然环境、自然破坏以及人为因素的影响,不仅增加了信息存储、处理的风险,也给信息传送带来了新的问题。 嗅探器是一种常用的收集有用数据的方法,可以作为网络数据包的设备。嗅探器是通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。 1基本概念 1.1嗅探器 每一个在局域网(LAN)上的工作站都有其硬件地址,这些地址唯一地表示了网络上的机器。当用户发送一个数据包时,这些数据包就会发送到LAN上所有可用的机器。在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的数据包则不予响应。嗅探器工作在网络的底层,在网络上监听数据包来获取敏感信息。从原理上来说,在一个实际的系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,其内的单片程序接收数据帧的目的MAC地址,根据计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。对于网卡来说一般有四种接收模式: a)广播方式:该模式下的网卡能够接收网络中的广播信息。 b)组播方式:设置在该模式下的网卡能够接收组播数据。 c)直接方式:在这种模式下,只有目的网卡才能接收该数据。

Wireshark过滤语法

1. 捕捉过滤器 捕捉过滤器的语法与其它使用Lipcap(Linux)或者Winpcap(Windows)库开发的软件一样,比如著名的TCPdump。捕捉过滤器必须在开始捕捉前设置完毕,这一点跟显示过滤器是不同的。 设置捕捉过滤器的步骤是: - 选择 capture -> options。 - 填写"capture filter"栏或者点击"capture filter"按钮为您的过滤器起一个名字并保存,以便在今后的捕捉中继续使用这个过滤器。 - 点击开始(Start)进行捕捉。

语法: 例 子:tcp dst 10.1.1.1 80 and tcp dst 10.2.2.2 3128 Protocol(协议): 可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp. 如果没有特别指明是什么协议,则默认使用所有支持的协议。 Direction(方向): 可能的值: src, dst, src and dst, src or dst 如果没有特别指明来源或目的地,则默认使用 "src or dst" 作为关键字。例如,"host 10.2.2.2"与"src or dst host 10.2.2.2"是一样的。

网络嗅探器的实际与实现

网络与信息安全 课程设计 网络嗅探器的设计和实现 学院:计算机科学与技术 班级:网络工程06-1班 姓名:白俊生 学号:310609040105 指导老师:刘坤

目录 一、什么是嗅探器--------------------------------------------1 二、嗅探器的作用---------------------------------------------1 三、网络嗅探器的原理-----------------------------------------1 四、反嗅探技术----------------------------------------------7 五、网络嗅探器的设计-----------------------------------------8 六、结语---------------------------------------------------14参考书目--------------------------------------------------14

网络嗅探器的实际与实现 一、什么是嗅探器 嗅探器,可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃听装置, 可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。 可是,计算机直接所传送的数据,事实上是大量的二进制数据。因此, 一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据,嗅探器也就必须能够识别出那个协议对应于这个数据片断,只有这样才能够进行正确的解码。 计算机的嗅探器比起电话窃听器,有他独特的优势:很多的计算机网络采用的是“共享媒体"。也就是说,你不必中断他的通讯,并且配置特别的线路,再安装嗅探器,你几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据。我们称这种窃听方式为“基于混杂模式的嗅探”(promiscuous mode)。尽管如此,这种“共享” 的技术发展的很快,慢慢转向“交换” 技术,这种技术会长期内会继续使用下去,它可以实现有目的选择的收发数据。 二、嗅探器的作用 嗅探器是网络的抓包工具,可以对网络中大量数据抓取,从而方便使用者对网络中用户的一些信息进行分析,所以,通常被黑客运用于网络攻击。我们如果也能掌握网络嗅探器的原理和设计,可以将它运用与网络故障检测、网络状况的监视,还可以加强企业信息安全防护。 三、网络嗅探器原理 嗅探器是如何工作的?如何窃听网络上的信息? 网络的一个特点就是数据总是在流动中,从一处到另外一处,而互联网是由错综复杂的各种网络交汇而成的,也就是说:当你的数据从网络的一台电脑到另一台电脑的时候,通常会经过大量不同的网络设备,(我们用tracert命令就可以看到这种路径是如何进行的)。如果传输过程中,有人看到了传输中的数据,

基于WinPcap的网络数据包捕获与分析

基于WinPcap的网络数据包捕获与分析 一、WinPcap介绍 1.WinPcap简介 WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。 然而,有时候“简便方法”并不能满足实际需要。有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。 基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。 2.WinPcap的组成与结构 如图 1.1,WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet.dll)和一个高层的不依赖于操作系统的静态库(wpcap.dll)共三个部分构成。这里,NPF在操作系统的内核级,packet.dll、wpcap.dll在用户级。 1)数据包监听设备驱动程序Array技术实现上,为了实现抓包,系统必须绕过操作系统 的协议栈来访问在网络上传输的原始数据包(raw packet)。这就要求WinPcap的一部分运行在操作系统核心 内部,直接与网络接口驱动交互。由于这个部分是系统依 赖(system dependent)的,在Winpcap的解决方案中它被 视为是一个设备驱动,称作NPF(Netgroup Packet Filter)。 图1.1 WinPcap的组成和结构

开发基于winPcap的嗅探器.

网络安全课程设计报告(2015-2016 第一学期) 题目开发基于winPcap的嗅探器 专业 学号姓名 指导教师 日期

评 分分 细 评分项优秀良好中等差遵守机房规章制度 实验原理分析与设计 课题功能实现情况 设计验收与答辩 课程设计报告书写 简 短 评 语 教师签名: 年月日评 分 等 级 备 注

开发基于winPcap的嗅探器 一、实验目的 开发一个winpcap的嗅探器,用它来捕获所有流经网卡的数据包,并进行分析。二、实验环境 操作系统:Windows 2000/XP 编程环境:Visual c++6.0 附加库:Winpcap 三、实验内容和要求 内容:所开发的程序可以输出本机所有网卡的信息和捕获流经网卡的数据包并能够过滤出IP、TCP、UDP、ICM P等数据包 要求:掌握基于WinPcap的网络编程模式。 理解并能应用WinPcap设计并实现网络数据包的捕获与解析。 四、实验原理和步骤 原理:我们所要做的嗅探器是一种常用的网络数据收集软件,它是在广播式网络环境下利用计算机网络接口截获目的地为其它计算机的数据报文的一种工具。 在以太网中,信息是以明文的形式在网络上传输 ,当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。 首先,抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包,这就要求一部分运行在操作系统核心内部,直接与网络接口驱动交互。这个部分是系统依赖的,在Winpcap的解决方案里它被认为是一个设备驱动,称作NPF(Netgroup PacketFilter)。 Winpcap提供了两个不同的库:Packet.dll和Wpcap.dll。Wpcap.dll提供了更加友好、功能更加强大的函数调用。WinPcap的优势在于提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来,便于开

网络嗅探器的设计与实现

网络攻防技术实验报告 嗅探器的设计与实现 姓名:张梦学号: 一、嗅探器的设计原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket )方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。 二、嗅探器的开发基础 1、嗅探器的实现目标 (1)实现网络嗅探器的界面。 (2)实现抓取数据包的功能。 (3)实现暂停抓取数据包功能。 (4)实现清空列表功能。 2、嗅探器的技术支持简介 (1)TCP/IP 协议分析 TCP/IP 是供已连接因特网的计算机进行通信的通信协议。 TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。 TCP/IP 是一个四层的分层体系结构。高层为传输控制协议,它负责聚集信息或把文件拆分成更小的包。这些包通过网络传送到接收端的TCP层,接收端的TCP层把包还原为原始文件。低层是网际协议,它处理每个包的地址部分,使这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即使来自同一文件的分包路由也有可能不同,但最 后会在目的地汇合。TCP/IP 使用客户端/ 服务器模式进行通信。TCP/IP

相关文档
最新文档