新闻资讯
看你所看,想你所想

WpdPack

WpdPack

WpdPack是WinPcap的开发包,提供了使用WinPcap必须的头档案和库档案,现阶段开始SendPkt使用的是WinPcap 3.1及其对应的WpdPack。随着网路入侵的不断发展,网路安全变得越来越重要,于是网路入侵取证系统的研究也变得日益重要。在网路入侵取证系统中,对网路上传送的数据包进行有效的监听即捕获包是目前取证的关键技术,只有进行高效的数据包捕获,网路管理员才能对所捕获的数据进行一系列的分析,从而进行可靠的网路安全管理。

基本介绍

  • 中文名:WpdPack
  • 性质:WinPcap的开发包
  • 来源:由伯克利分组捕获库派生而来
  • 部分:三个

简介

WinPcap 是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows 操作平台上来实现对底层包的截取过滤。WinPcap 为用户级的数据包提供了Windows 下的一个平台。WinPcap 是 BPF 模型和 Libpcap 函式馆在 Windows 平台下网路数据包捕获和网路状态分析的一种体系结构,这个体系结构是由一个核心的包过滤驱动程式,一个底层的动态连线库 Packet.dll 和一个高层的独立于系统的函式馆 Libpcap 组成。底层的包捕获驱动程式
实际为一个协定网路驱动程式,通过对 NDIS 中函式的调用为 Win95、Win98、WinNT、和 Win2000 提供一类似于 UNIX 系统下 Berkeley Packet Filter 的捕获和传送原始数据包的能力。Packet.dll 是对这个 BPF 驱动程式进行访问的 API 接口,同时它有一套符合 Libpcap 接口(UNIX 下的捕获函式馆)的函式馆。WinPcap的结构图如图1。
WinPcap 包括三个部分:第一个模组NPF(Netgroup Packet Filter),是一个虚拟设备驱动程式档案。它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模组,这个过程中包括了一些作业系统特有的代码。第二个模组packet.dll为win32平台提供了一个公共的接口。不同版本的Windows系统都有自己的核心模组和用户层模组。Packet.dll用于解决这些不同。调用Packet.dll的程式可以运行在不同版本的Windows平台上,而无需重新编译。
第三个
模组 Wpcap.dll是不依赖于作业系统的。它提供了更加高层、抽象的函式。
packet.dll和Wpcap.dll:packet.dll直接映射了核心的调用。 Wpcap.dll提供了更加友好、功能更加强大的函式调用。WinPcap的优势提供了一套标準的抓包接口,与libpcap兼容,可使得原来许多UNIX平台下的网路分析工具快速移植过来便于开发各种网路分析工具,充分考虑了各种性能和效率的最佳化,包括对于NPF核心层次上的过滤器支持,支持核心态的统计模式,提供了传送数据包的能力。
2网路数据包捕获的原理
3在windows情况下捕获数据包的结构
4利用winpcap进行网路数据包的捕获和过滤的设计步骤
5主要原始码
根据用 Windows 分组捕获库 WinPcap 提供功能首先要初始化两个结构体,一个是适配器的结构体 LpAdapter, 一个是存放接收到的数据包的结构体 RecvPacket。
使用 Packet.dll 动态连线库编写原始码:
#define MAX__LINK__NAME__LENGTH 64

适配器结构

typedef struct__ADAPTER
{
HANDLE hFile;
TCHAR Symboliclink[MAX__LINK__NAME__LENGTH];
Int NumWrites;
} ADAPTER , *LPADAPTER;
说明:hFile 是一个指向该网路适配器 Handle 的指针,通过它可以对网路适配器进行操作。symboliclink 包含当前打开的网路适配器的名字。
数据包结构:
typedef struct _PACKET
{
HANDLE hEvent;
OVERLAPPED OverLapped;
PVOID Buffer;
UINT Length;
PVOID Next;
UINT ulBytesReceived;
BOOLEAN bloComplete; //控制接受包的开始和结束

实现的步骤

的主要原始码:
1)
要获得
适配器列表。
#define Max__Num__Adapter 10 //获得适配器列表
char Adapterlist [Max__Num__Adapter[512]]
int i=0
char AdapterNames[512], *tempa,*templa;
ULONG AdapterLength=1024; } PACKET, *LPPACKET:
2)获得系统中网路适配器的名字。
PacketGetAdapterNames(AdapterNamea,&AdapterLength);
tempa=AdapterNamea;
templa=
Adapternamea;
while ((*tempa!=’\0’)∣∣(*tempa-1!=’\0))
{
if (*tempa= =’\0’)
{
memcpy(AdapterList,temla,tempa-templa); //记忆体数据拷贝
templa=tempa+1;
i++
}
tempa++
}
3)从适配器列表中选择一个默认的 0 号适配器。
LPADAPTER lpAdapter
lpAdapter = PacketOpenAdapter (AdapterList[0]);
if (!lpAdapter∣∣(lpAdapter->hFile==INVALID__HANDLE__VALUE))
{
dwErrorCode=GetLastError();
return FALSE;
}
4)将所选择的适配器 lpAdapter 设定为混杂模式。
PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)
5)设定 BPF 核心中包过滤的过滤器的代参政。利用这个函式右以完成对于原始数据包的初始的过滤处理,如根据其中连线埠号、IP 地址等。
PacketSetBpf(LpAdapter AdapterObject,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;
}
6结束语
数据包捕获技术是网路管理系统的关键技术,已经按照标题4中的流程进行了简单的实现。如果在一个繁忙的网路上进行截获,而不设定任何过滤,那得到的数据包是非常多的,可能在一秒钟内得到上千的数据包。如果应用程式不进行必要的性能最佳化,那幺将会大量的丢失数据包。对捕包性能的最佳化必不可少,考虑採用多执行绪来处理数据包。若在程式中建立一个公共的数据包缓冲池,这个缓冲池是一个LILO的伫列。于是在程式中使用三个执行绪进行操作:一个执行绪只进行捕获操作,它将从驱动程式获得的数据包添加到数据包伫列的头部;另一个执行绪只进行过滤操作,它检查新到的队尾的数据包,检查其是否满足过滤条件,如果不满足则将其删除出伫列;最后一个执行绪进行数据包处理操作,象根据接收的数据包传送新数据包这样的工作都由它来进行。考虑儘可能少丢失数据包的条件,应该是进行捕获操作的执行绪的优先权最高,这样就可以得到更高的捕包性能。

转载请注明出处海之美文 » WpdPack

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:ailianmeng11@163.com