logo资料库

sniffer程序分析与设计 实验报告.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
一、实验目的
二、实验环境
三、实验内容
四、实验代码分析
一、实验目的 学习 TCP/IP 协议相关知识,编写 sniffer 程序,捕获网络数据包,并分析相关协议。 二、实验环境 操作系统:XP 编程环境:VC++6.0 三、实验内容 1、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 下的捕获函数库)的函数库。 2、网络数据包捕获的原理 以太网(Ethernet)具有共享介质的特征,信息是以明文的形式在网络上传输,当网络 适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方 式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传 输的数据包。IEEE802.3 标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这 种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息 捕获系统能够拦截的我们所要的信息,这是捕获数据包的物理基础。 3、利用 winpcap 进行网络数据包的捕获和过滤的设计步骤 (1)打开网卡,并设为混杂模式。 (2)回调函数 Network Tap 在得到监听命令后,从网络设备驱动程序处收集数据包把 监听到的数据包负责传送给过滤程序。 图 3NDIS 驱动程序结构 (3)当 Packet filter 监听到有数据包到达时,NDIS 中间驱动程序首先调用分组驱 动程序,该程序将数据传递给每一个参与进程的分组过滤程序。 (4)然后由 Packet filter 过滤程序决定哪些数据包应该丢弃,哪些数据包应该接收,
是否需要将接收到的数据拷贝到相应的应用程序。 (5)通过分组过滤器后,将数据未过滤掉的数据包提交给核心缓冲区。然后等待系统 缓冲区满后,再将数据包拷贝到用户缓冲区。监听程序可以直接从用户缓冲区中读取捕获的 数据包。 (6)关闭网卡。 四、实验代码分析 根据用 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 OVERLAPPED PVOID UINT PVOID UINT BOOLEAN hEvent; OverLapped; Buffer; Length; Next; ulBytesReceived; bloComplete; //控制接受包的开始和结束 数据包捕获实现的步骤的主要源代码: (1)要获得适配器列表。 #define char int char ULONG AdapterLength=1024; } PACKET, *LPPACKET: Max__Num__Adapter 10 Adapterlist [Max__Num__Adapter[512]] i=0 AdapterNames[512], *tempa,*templa; //获得适配器列表 (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 号适配器。 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; }
分享到:
收藏