网络编程-Windows平台下的抓包技术.ppt
《网络编程-Windows平台下的抓包技术.ppt》由会员分享,可在线阅读,更多相关《网络编程-Windows平台下的抓包技术.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、虽然Unix平台上的BSD包截获系统提供了一组供应用程序直接调用的网络数据包截获函数,允许应用程序与网卡间直接进行交互,但在Win32平台上,目前主要使用WinPcap体系结构。WinPcap是基于Win32平台的网络包截获和分析的系统,它具有丰富的网络数据包处理函数,其功能比BSD包截获系统更强,如“包监视”和“包发送”等功能函数在早先的Unix平台上是不具备的。WinPcap是一个重要的抓包工具,它是libpcap的Windows版本Windows平台下的抓包技术WinPcap包括三个部分第一个模块:内核级的包过滤驱动程序内核级的包过滤驱动程序 NPF(Netgroup Packet Fi
2、lter),是一个虚拟设备驱动程序文件,是架构的核心(在Win95/98中是一个VXD文件,在NT/2000中是一个SYS文件),它的主要功能是过滤数据包,在包上附加时间戳、数据包长度等信息。第二个模块:低级动态链接库低级动态链接库packet.dll,在Win32平台上提供了与NPF的一个通用接口。packet.dll数据包驱动程序库是与libpcap 相兼容的一组用户级的函数库。第三个模块:用户级的用户级的Wpcap.dll。通过调用packet.dll提供的函数生成,它包括了过滤器生成等一系列可以被用户级调用的高级函数,另外还有诸如数据包统计及发送功能。WinPcapWinPcap体系结
3、构NPFPacket.dllPacket.dllPacket.dllPacket.dll相关的数据结构相关的数据结构typedef struct _ADAPTER*LPADAPTERtypedef struct _ADAPTER*LPADAPTER描述一个网络适配器。它包含了两个域:HANDLE hFile TCHAR SymbolicLinkhFile是一个指向驱动器句柄的指针。通过该句柄,我们可以直接与驱动器进行通信,如接收或发送数据包。SymbolicLink是一个字符串,它包含了当前打开的网络适配器的名称。Packet.dllPacket.dll相关的数据结构相关的数据结构typede
4、f struct _PACKET*LPPACKETtypedef struct _PACKET*LPPACKET 描述一组网络数据包的结构。它包含了以下几个域:OVERLAPPED OverLapped PVOID Buffer UINT Length PVOID ulBytesReceived BOOLEAN bIoComplete OverLapped是用来处理对驱动器的异步调用。Buffer是用来指向缓存的指针,该缓存包含了数据包的数据。Length是该缓存区的大小。而ulBytesReceived表明了该缓存中包含的有效数据的大小。BIoComplete是在异步调用中用来表示该Pack
5、et是否包含有效的数据。Packet.dllPacket.dll相关的数据结构相关的数据结构struct bpf_hdrstruct bpf_hdr 数据报头部。它包含以下几个域:struct timeval bh_tstampUNIT bh_caplenUNIT bh_datalenUSHORT bh_hdrlen bh_tstamp是一个时间戳,它包含两个域:tv_sec和tv_usec,用来表示报文的捕获时间。bh_caplen是封装报文后的报文长度。bh_datalen是原始报文长度。bh_hdrlen是封装报文的报头长度。Packet.dllPacket.dll相关的数据结构相关的数
6、据结构 typedef struct NetType NetType typedef struct NetType NetType 描述网络类型的数据结构。typedef struct npf_if_addr npf_if_addrtypedef struct npf_if_addr npf_if_addr 描述一个网络适配器的ip地址。Struct bpf_stat Struct bpf_stat 当前捕获数据报的统计信息Packet.dll相关函数 1LPPACKET PacketAllocatePacket(void)如果运行成功,返回一个_PACKET结构的指针,否则返回NULL。成功
7、返回的结果将会传送到PacketReceivePacket()函数,接收来自驱动的网络数据报。2 VOID PacketFreePacket(LPPACKET lpPacket)释放参数提供的_PACKET结构。3VOID PacketCloseAdapter(LPADAPTER lpAdapter)关闭参数中提供的网络适配器,释放相关的ADAPTER结构。Packet.dll相关函数4BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize)返回可以得到的网络适配器列表及描述。5BOOLEAN PacketGetNetInfoEx(
8、LPTSTR AdapterNames,npf_ip_addr*buff,PLONG NEntries)返回某个网络适配器的全面地址信息。其中npf_ip_addr结构包含:IPAddress:ip地址SubnetMask:子网掩码Broadcast:广播地址 Packet.dll相关函数6BOOLEAN PacketGetNetType(LPADAPTER AdapterObject,NetType*type)返回某个网络适配器的MAC类型。NetType结构里包含了LinkSpeed(速度)和LinkType(类型)。其中LinkType包含以下几种情况:NdisMedium802_3:E
9、thernet(802.3)NdisMediumWan:WANNdisMedium802_5:Token Ring(802.5)NdisMediumFddi:FDDINdisMediumAtm:ATMNdisMediumArcnet878_2:ARCNET(878.2)Packet.dll相关函数7BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat*s)返回几个关于当前捕获报告的统计信息。其中bpf_stat结构包含:bs_recv,bs_drop,ps_ifdrop,bs_captbs_recv:从网络适配器开始捕获数
10、据报开始所接收到的所有数据报的数目,包括丢失的数据报;bs_drop:丢失的数据报数目。8PCHAR PacketGetVersion()返回关于dll的版本信息。Packet.dll相关函数9VOID PacketInitPacket(LPPACKET lpPacket,PVOID Buffer,UINT Length)初始化一个_PACKET结构。10 LPADAPTER PacketOpenAdapter(LPTSTR AdapterName)打开一个网络适配器。11 BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET
11、 lpPacket,BOOLEAN Sync)从NPF驱动程序读取网络数据报及统计信息。数据报编码结构:|bpf_hdr|data|Padding|bpf_hdr|data|Padding|Packet.dll相关函数12 BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync)发送一个或多个数据报的副本。13 BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim)设置捕获数据报的内核级缓冲区大小。Packet.dll相关函数14 BOO
12、LEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter)为接收到的数据报设置硬件过滤规则。以下为一些典型的过滤规则:NDIS_PACKET_TYPE_PROMISCUOUS:设置为混杂模式,接收所有流过的数据报;NDIS_PACKET_TYPE_DIRECTED:只有目的地为本地主机网络适配器的数据报才会被接收;NDIS_PACKET_TYPE_BROADCAST:只有广播数据报才会被接收;NDIS_PACKET_TYPE_MULTICAST:只有与本地主机网络适配器相对应的多播数据报才会被接收;NDIS_PACKET_TYPE_
13、ALL_MULTICAST:所有多播数据报均被接收;NDIS_PACKET_TYPE_ALL_LOCAL:所有本地数据报均被接收。Packet.dll相关函数15 BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites)设置调用PacketSendPacket()函数发送一个数据报副本的最大重发次数。16 BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout)设置读操作等待时间。以上介绍的包含了packet.dll里的大部分函数。如果想更深层的了解w
14、inpcap,请访问相关网站,主页地址:http:/winpcap.polito.itPacket.dll监听流程图PacketGetAdapterName()选择网卡选择网卡PacketOpenAdapter()打开网络适配器打开网络适配器PacketSetHwFilter()设置接收模式(一般设置为混杂模式)设置接收模式(一般设置为混杂模式)PacketSetBpf()编辑设置过滤规则编辑设置过滤规则PacketSetBuff()设置核心缓冲区大小设置核心缓冲区大小PacketSetReadTimeout()设置读操作等待时间设置读操作等待时间PacketAllocatePacket()设
15、置(分配)用户缓冲区设置(分配)用户缓冲区PacketInitPacket()初始化用户缓冲区初始化用户缓冲区PacketReceivePacket()捕获网络数据包捕获网络数据包Packet.dll应用步骤基本程序代码如下:if(!(dwVersion =0X80000000&dwWindowsMajorVersion =4)/Windows NTAdapterLength=sizeof(AdapterName);(1)得到网卡名称if(PacketGetAdapterNames(PTSTR)AdapterName,&AdapterLength)=FALSE)return FALSE;Pac
16、ket.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应用步骤3)设置过滤器,将网卡设置为混杂模式,这样可以监听流过本机的数据包if(Packe
17、tSetHwFilter(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应用步骤6)为Packet 结构分配内存if(lpPacket=PacketAllocatePacket()=NULL)return false;7
18、)初始化一个Packet 结构,即将Packet 结构中的buffer 设置为传递的buffer 指针.PacketInitPacket(lpPacket,(char 3)buffer,256000)Packet.dll应用步骤8)从NPF driver 上读取网络数据包.while(!bStop)if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)=FALSE)return FALSE;/显示捕获数据9)释放参数提供的Packet 结构.PacketFreePacket(lpPacket)10)关闭网卡.PacketCloseAdapter(lpAd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 编程 Windows 平台 技术
限制150内