WinPcap编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Packet.dll应用步骤
基本程序代码如下: if ( ! ( dwVersion > = 0X80000000 && dwWindowsMajorVersion > = 4) ) { / / Windows NT AdapterLength = sizeof (AdapterName) ; (1)得到网卡名称 if ( PacketGetAdapterNames ( ( PTSTR ) AdapterName ,&AdapterLength) = = FALSE) { return FALSE; } ⋯⋯ }
Packet.dll相关函数
6> BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type) 返回某个网络适配器的MAC类型。 NetType结构里包含了LinkSpeed(速度)和 LinkType(类型)。其中LinkType包含以下几种 情况: NdisMedium802_3: Ethernet(802.3) NdisMediumWan: WAN NdisMedium802_5: Token Ring(802.5) NdisMediumFddi: FDDI NdisMediumAtm: ATM NdisMediumArcnet878_2: ARCNET(878.2)
PacketSetBpf() PacketSetBuff()
PacketSetReadTimeout() 设置读操作等待时间
PacketAllocatePacket() 设置(分配)用户缓冲区 PacketInitPacket() PacketReceivePacket() 初始化用户缓冲区 捕获网络数据包
Packet.dll相关的数据结构
typedef struct NetType NetType 描述网络类型的数据结构。
typedef struct npf_if_addr npf_if_addr 描述一个网络适配器的ip地址。 Struct bpf_stat 当前捕获数据报的统计信息
Packet.dll相关函数
Packet.dll相关的数据结构
typedef struct _PACKET *LPPACKET 描述一组网络数据包的结构。 它包含了以下几个域: OVERLAPPED OverLapped PVOID Buffer UINT Length PVOID ulBytesReceived BOOLEAN bIoComplete OverLapped是用来处理对驱动器的异步调用。Buffer是用 来指向缓存的指针,该缓存包含了数据包的数据。Length是 该缓存区的大小。而ulBytesReceived表明了该缓存中包含的 有效数据的大小。BIoComplete是在异步调用中用来表示该 Packet是否包含有效的数据。
WinPcap
WinPcap包括三个部分 第一个模块:内核级的包过滤驱动程序
Leabharlann Baidu
NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件, 是架构的核心(在Win95/98 中是一个VXD文件,在NT/2000 中是 一个SYS 文件) ,它的主要功能是过滤数据包,在包上附加时间戳、 数据包长度等信息。
Packet.dll相关的数据结构
struct bpf_hdr 数据报头部。 它包含以下几个域: struct timeval bh_tstamp UNIT bh_caplen UNIT bh_datalen USHORT bh_hdrlen bh_tstamp是一个时间戳,它包含两个域: tv_sec和tv_usec,用来表示报文的捕获时间。 bh_caplen是封装报文后的报文长度。bh_datalen是 原始报文长度。bh_hdrlen是封装报文的报头长度。
Packet.dll应用步骤
3) 设置过滤器,将网卡设置为混杂模式,这样可以监听流过本机的数据包 if ( PacketSetHwFilter ( lpAdapter ,NDIS_PACKET_TYPE_PROMISCUOUS) = = FALSE) { return FALSE; } 4) 设置缓冲区大小 if (PacketSetBuff (lpAdapter ,512000) = = FALSE) { return FALSE; } 5) 设置接收一个数据包的超时时间 PacketSetReadTimeout ( lpAdapter , 1000) / / set a 1 second read timeout
Packet.dll相关函数
15> BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites) 设置调用PacketSendPacket()函数发送一个数 据报副本的最大重发次数。 16> BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout) 设置读操作等待时间 。
1> LPPACKET PacketAllocatePacket(void) 如果运行成功,返回一个_PACKET结构的指针, 否则返回NULL。成功返回的结果将会传送到 PacketReceivePacket()函数,接收来自驱动的网络 数据报。 2> VOID PacketFreePacket(LPPACKET lpPacket) 释放参数提供的_PACKET结构。 3> VOID PacketCloseAdapter(LPADAPTER lpAdapter) 关闭参数中提供的网络适配器,释放相关的 ADAPTER结构。
Packet.dll相关函数
9> VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer, UINT Length) 初始化一个_PACKET结构。 10> LPADAPTER PacketOpenAdapter(LPTSTR AdapterName) 打开一个网络适配器。 11> BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync) 从NPF驱动程序读取网络数据报及统计信息。 数据报编码结构: |bpf_hdr|data|Padding|bpf_hdr|data|Padding|
Packet.dll应用步骤
2) 打开指定的网卡 lpAdapter = PacketOpenAdapter(AdapterList [0 ]) ; if ( ! lpAdapter | | (lpAdapter - > hFile = = INVALID_HANDLE_VALUE) ) { dwErrorCode = GetLastError() ; sprintf ( szErr ,″Unable to open the adapter ,error code : %lx″, dwErrorCode) ; AfxMessageBox(szErr) ; return FALSE; }
Packet.dll相关函数
7> BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s) 返回几个关于当前捕获报告的统计信息。 其中bpf_stat结构包含: bs_recv, bs_drop,ps_ifdrop,bs_capt bs_recv: 从网络适配器开始捕获数据报 开始所接收到的所有数据报的数目,包括丢失 的数据报; bs_drop: 丢失的数据报数目。 8> PCHAR PacketGetVersion() 返回关于dll的版本信息。
Packet.dll相关函数
12> BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET lpPacket, BOOLEAN Sync) 发送一个或多个数据报的副本。 13> BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim) 设置捕获数据报的内核级缓冲区大小。
WinPcap体系结构
NPF
Packet.dll相关的数据结构
typedef struct _ADAPTER *LPADAPTER 描述一个网络适配器。 它包含了两个域: HANDLE hFile TCHAR SymbolicLink hFile是一个指向驱动器句柄的指针。通过该句柄, 我们可以直接与驱动器进行通信,如接收或发送 数据包。SymbolicLink是一个字符串,它包含了 当前打开的网络适配器的名称。
Packet.dll相关函数
14> BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter) 为接收到的数据报设置硬件过滤规则。
以下为一些典型的过滤规则: NDIS_PACKET_TYPE_PROMISCUOUS: 设置为混 杂模式,接收所有流过的数据报; NDIS_PACKET_TYPE_DIRECTED: 只有目的地为 本地主机网络适配器的数据报才会被接收; NDIS_PACKET_TYPE_BROADCAST: 只有广播数 据报才会被接收; NDIS_PACKET_TYPE_MULTICAST: 只有与本地 主机网络适配器相对应的多播数据报才会被接收; NDIS_PACKET_TYPE_ALL_MULTICAST: 所有多 播数据报均被接收; NDIS_PACKET_TYPE_ALL_LOCAL: 所有本地数 据报均被接收。
Windows平台下的抓包技术
虽然Unix 平台上的BSD 包截获系统提供了一组供 应用程序直接调用的网络数据包截获函数,允许应 用程序与网卡间直接进行交互, 但在Win32 平台上, 目前主要使用WinPcap 体系结构。 WinPcap 是基于Win32 平台的网络包截获和分析 的系统,它具有丰富的网络数据包处理函数,其功能 比BSD 包截获系统更强,如“包监视”和“包发送” 等功能函数在早先的Unix 平台上是不具备的。 WinPcap是一个重要的抓包工具,它是libpcap的 Windows版本
第二个模块:低级动态链接库packet.dll,在Win32 平台 上提供了与NPF 的一个通用接口。 packet.dll数据包驱 动程序库是与libpcap 相兼容的一组用户级的函数库。 第三个模块:用户级的Wpcap.dll。通过调用packet.dll 提供的函数生成,它包括了过滤器生成等一系列可以被 用户级调用的高级函数,另外还有诸如数据包统计及发 送功能。
以上介绍的包含了packet.dll里的大部分函数。如果想更 深层的了解winpcap,请访问相关网站,主页地址: http://winpcap.polito.it
Packet.dll监听流程图
PacketGetAdapterName() 选择网卡 PacketOpenAdapter() PacketSetHwFilter() 打开网络适配器 设置接收模式(一般设置为混杂模式) 编辑设置过滤规则 设置核心缓冲区大小
Packet.dll相关函数
4> BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize) 返回可以得到的网络适配器列表及描述。 5> BOOLEAN PacketGetNetInfoEx(LPTSTR AdapterNames,npf_ip_addr *buff, PLONG NEntries) 返回某个网络适配器的全面地址信息。 其中npf_ip_addr结构包含: IPAddress: ip地址 SubnetMask: 子网掩码 Broadcast: 广播地址