实验6利用WinPcap技术捕获数据包教材.docx

上传人:b****8 文档编号:10397244 上传时间:2023-02-10 格式:DOCX 页数:11 大小:144.03KB
下载 相关 举报
实验6利用WinPcap技术捕获数据包教材.docx_第1页
第1页 / 共11页
实验6利用WinPcap技术捕获数据包教材.docx_第2页
第2页 / 共11页
实验6利用WinPcap技术捕获数据包教材.docx_第3页
第3页 / 共11页
实验6利用WinPcap技术捕获数据包教材.docx_第4页
第4页 / 共11页
实验6利用WinPcap技术捕获数据包教材.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

实验6利用WinPcap技术捕获数据包教材.docx

《实验6利用WinPcap技术捕获数据包教材.docx》由会员分享,可在线阅读,更多相关《实验6利用WinPcap技术捕获数据包教材.docx(11页珍藏版)》请在冰豆网上搜索。

实验6利用WinPcap技术捕获数据包教材.docx

实验6利用WinPcap技术捕获数据包教材

实验6 利用WinPcap技术捕获数据包

实验目的:

通过掌握WinPcap函数库的结构和功能,实现在windows环境下对网卡进行编程,进行网络数据包的捕获。

实验准备:

(1)winpcap简介

WinPcap是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows操作平台上来实现对底层包的截取过滤。

WinPcap为用户级的数据包提供了Windows下的一个平台。

WinPcap是BPF模型和Libpcap函数库在Windows平台下网络数据包捕获和网络状态分析的一种体系结构,这个体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库Packet.dll和一个高层的独立于系统的函数库Libpcap组成。

底层的包捕获驱动程序实际为一个协议网络驱动程序,通过对NDIS中函数的调用为Win95、Win98、WinNT、和Win2000提供一类似于UNIX系统下BerkeleyPacketFilter的捕获和发送原始数据包的能力。

Packet.dll是对这个BPF驱动程序进行访问的API接口,同时它有一套符合Libpcap接口(UNIX下的捕获函数库)的函数库。

WinPcap的结构图如图1。

WinPcap包括三个部分:

第一个模块NPF(NetgroupPacketFilter),是一个虚拟设备驱动程序文件。

它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码。

第二个模块packet.dll为win32平台提供了一个公共的接口。

不同版本的Windows系统都有自己的内核模块和用户层模块。

Packet.dll用于解决这些不同。

调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译。

第三个模块Wpcap.dll是不依赖于操作系统的。

它提供了更加高层、抽象的函数。

packet.dll和Wpcap.dll:

packet.dll直接映射了内核的调用。

Wpcap.dll提供了更加友好、功能更加强大的函数调用。

WinPcap的优势提供了一套标准的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。

图1WinPcap结构图

(2)网络数据包捕获的原理

以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。

IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。

运用这一原理使信息捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。

以太网是一种总线型的网络,从逻辑上来看是由一条总线和多个连接在总线上的站点所组成各个站点采用上面提到的CSMA/CD协议进行信道的争用和共享。

每个站点(这里特指计算机通过的接口卡)网卡来实现这种功能。

网卡主要的工作是完成对于总线当前状态的探测,确定是否进行数据的传送,判断每个物理数据帧目的地是否为本站地址,如果不匹配,则说明不是发送到本站的而将它丢弃。

如果是的话,接收该数据帧,进行物理数据帧的CRC校验,然后将数据帧提交给LLC子层。

网卡具有如下的几种工作模式:

1)广播模式(BroadCastModel):

它的物理地址(MAC)地址是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。

2)多播传送(MultiCastModel):

多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。

但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。

3)直接模式(DirectModel):

工作在直接模式下的网卡只接收目地址是自己Mac地址的帧。

4)混杂模式(PromiscuousModel):

工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。

网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。

如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。

(3)在windows情况下捕获数据包的结构

图2捕获数据包的结构图

Wndows下捕获数据包的结构如图2,其中NDIS及其特点是:

 NDIS(NetworkDriverInterfaceSpecification)是Microsoft和3Com公司联合制定的网络驱动规范,并提供了大量的操作函数。

它为上层的协议驱动提供服务,屏蔽了下层各种网卡的差别。

NDIS向上支持多种网络协议,比如TCP/IP、NWLinkIPX/SPX、NETBEUI等,向下支持不同厂家生产的多种网卡。

NDIS还支持多种工作模式,支持多处理器,提供一个完备的NDIS库(Library)。

但库中所提供的各个函数都是工作在核心模式下的,用户不宜直接操作,这就需要寻找另外的接口。

NDIS驱动程序的结构如图3。

(4)利用winpcap进行网络数据包的捕获和过滤的设计步骤

1)打开网卡,并设为混杂模式。

2)回调函数NetworkTap在得到监听命令后,从网络设备驱动程序处收集数据包把监听到的数据包负责传送给过滤程序。

图3NDIS驱动程序结构

3)当Packetfilter监听到有数据包到达时,NDIS中间驱动程序首先调用分组驱动程序,该程序将数据传递给每一个参与进程的分组过滤程序。

4)然后由Packetfilter过滤程序决定哪些数据包应该丢弃,哪些数据包应该接收,是否需要将接收到的数据拷贝到相应的应用程序。

5)通过分组过滤器后,将数据未过滤掉的数据包提交给核心缓冲区。

然后等待系统缓冲区满后,再将数据包拷贝到用户缓冲区。

监听程序可以直接从用户缓冲区中读取捕获的数据包。

6)关闭网卡。

(5)主要源代码

根据用Windows分组捕获库WinPcap提供功能首先要初始化两个结构体,一个是适配器的结构体LpAdapter,一个是存放接收到的数据包的结构体RecvPacket。

使用Packet.dll动态连接库编写源代码:

#defineMAX__LINK__NAME__LENGTH64

适配器结构:

typedefstruct__ADAPTER

{

HANDLEhFile;

TCHARSymboliclink[MAX__LINK__NAME__LENGTH];

IntNumWrites;

}ADAPTER,*LPADAPTER;

说明:

hFile是一个指向该网络适配器Handle的指针,通过它可以对网络适配器进行操作。

symboliclink包含当前打开的网络适配器的名字。

数据包结构:

typedefstruct_PACKET

{

HANDLEhEvent;

OVERLAPPEDOverLapped;

PVOIDBuffer;

UINTLength;

PVOIDNext;

UINTulBytesReceived;

BOOLEANbloComplete;//控制接受包的开始和结束

数据包捕获实现的步骤的主要源代码:

1)要获得适配器列表。

#defineMax__Num__Adapter10//获得适配器列表

charAdapterlist[Max__Num__Adapter[512]]

inti=0

charAdapterNames[512],*tempa,*templa;

ULONGAdapterLength=1024;}PACKET,*LPPACKET:

2)获得系统中网络适配器的名字。

PacketGetAdapterNames(AdapterNamea,&AdapterLength);

tempa=AdapterNamea;

templa=Adapternamea;

while((*tempa!

=’\0’)∣∣(*tempa-1!

=’\0))

{

if(*tempa==’\0’)

{

memcpy(AdapterList[i],temla,tempa-templa);//内存数据拷贝

templa=tempa+1;

i++

}

tempa++

}

3)从适配器列表中选择一个默认的0号适配器。

LPADAPTERlpAdapter

lpAdapter=PacketOpenAdapter(AdapterList[0]);

if(!

lpAdapter∣∣(lpAdapter->hFile==INVALID__HANDLE__VALUE))

{

dwErrorCode=GetLastError();

returnFALSE;

}

4)将所选择的适配器lpAdapter设置为混杂模式。

PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)

5)设置BPF内核中包过滤的过滤器的代参政。

利用这个函数右以完成对于原始数据包的初始的过滤处理,如根据其中端口号、IP地址等。

PacketSetBpf(LpAdapterAdapterObject,structbpf_program*fp)

6)设置缓冲池为512K字节。

PacketSetBuff(lpAdapter,512000);

7)分配一个数据包对象,并连接已分配的缓冲。

PacketInitPacket(lpPacket,(char*)bufferReceive,512000);

8)捕获多个数据包。

从网卡lpAdapter接收数据包,并将数据包放入lpPacket所指向的数据包结构体中,若接收成功返回TRUE,否则返回FALSE。

PacketReceivePacket(lpAdapter,lpPacket,TRUE);

9)通过触发回调函数,把捕获符合过滤器规则的数据包转发给网络协议分析模块进行分析处理。

10)结束接收数据包,释放数据包对象。

if(lpPacket!

=NULL

{

PacketFreePacket(lpPacket);

lpPacket=NULL;

}

11)关闭网卡设备,将网卡恢复到正常接收状态。

if(lpAdapter!

=NULL

{

PacketCloseAdapter(lpAdapter);

lpAdapter=NULL;

}

数据包捕获技术是网络管理系统的关键技术,已经按照标题4中的流程进行了简单的实现。

如果在一个繁忙的网络上进行截获,而不设置任何过滤,那得到的数据包是非常多的,可能在一秒钟内得到上千的数据包。

如果应用程序不进行必要的性能优化,那么将会大量的丢失数据包。

对捕包性能的优化必不可少,考虑采用多线程来处理数据包。

若在程序中建立一个公共的数据包缓冲池,这个缓冲池是一个LILO的队列。

于是在程序中使用三个线程进行操作:

一个线程只进行捕获操作,它将从驱动程序获得的数据包添加到数据包队列的头部;另一个线程只进行过滤操作,它检查新到的队尾的数据包,检查其是否满足过滤条件,如果不满足则将其删除出队列;最后一个线程进行数据包处理操作,象根据接收的数据包发送新数据包这样的工作都由它来进行。

考虑尽可能少丢失数据包的条件,应该是进行捕获操作的线程的优先级最高,这样就可以得到更高的捕包性能。

实验步骤

通过java程序也可以获取网卡的数据包,具体使用开源的WinPcap,jNetPcap;jNetPcap是对接了WinPcap来截获网卡数据包。

一、截获网卡步骤:

1、电脑上安装WinPcap;

2、下载jNetPcap,解压后得到所要用的jnetpcap.jar,jnetpcap.dll文件;

3、在eclipse中新建工程,把jnetpcap.jar加入library,编写Java代码实现网卡截包。

二、Java代码

importjava.util.ArrayList;

importjava.util.List;

importorg.jnetpcap.Pcap;

importorg.jnetpcap.PcapIf;

importorg.jnetpcap.packet.JPacket;

importorg.jnetpcap.packet.JPacketHandler;

importorg.jnetpcap.protocol.tcpip.Http;

importorg.jnetpcap.protocol.tcpip.Tcp;

publicclassApplication{

publicstaticvoidmain(String[]args)throwsInterruptedException{

Listalldevs=newArrayList();//Willbefilledwith

//NICs

StringBuildererrbuf=newStringBuilder();

intr=Pcap.findAllDevs(alldevs,errbuf);

if(r==Pcap.NOT_OK||alldevs.isEmpty()){

System.err.printf("Can'treadlistofdevices,erroris%s",

errbuf.toString());

return;

}

for(PcapIfpif:

alldevs){

System.out.println(pif.getName());

}

PcapIfpif=alldevs.get(0);//selectthedevicewhichyouwantto

//monitor

intsnaplen=64*1024;//Captureallpackets,notrucation

intflags=Pcap.MODE_PROMISCUOUS;//captureallpackets

inttimeout=10*1000;//10secondsinmillis

Pcappcap=Pcap.openLive(pif.getName(),snaplen,flags,timeout,

errbuf);

if(pcap==null){

System.err.printf("Errorwhileopeningdeviceforcapture:

"

+errbuf.toString());

return;

}

pcap.loop(Pcap.LOOP_INFINITE,newJPacketHandler(){

finalTcptcp=newTcp();

finalHttphttp=newHttp();

publicvoidnextPacket(JPacketpacket,StringBuildererrbuf){

if(packet.hasHeader(Tcp.ID)){

packet.getHeader(tcp);

System.out.printf("tcp.dst_port=%d%n",tcp.destination());

System.out.printf("tcp.src_port=%d%n",tcp.source());

System.out.printf("tcp.ack=%x%n",tcp.ack());

}

if(packet.hasHeader(tcp)){

//System.out.printf("tcpheader:

:

%s%n",tcp.toString());

}

if(packet.hasHeader(tcp)&&packet.hasHeader(http)){

System.out.printf("httpheader:

:

%s%n",http);

}

}

},errbuf);

pcap.close();

}

}

三、编写代码运行前,需要加上jvm参数(为了让jnetpcap找到jnetpcap.dll),在vmparameters加入以下参数:

-Djava.library.path=E:

\jnetpcap(该目录下有jnetpcap.dll文件)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1