资源预览内容
第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
第9页 / 共23页
第10页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
. .详谈调用winpcap驱动写arp多功能工具详谈调用winpcap驱动写arp多功能工具 一 winpcap驱动简介二 Packet.dll相关数据构造及函数三 T-ARP功能及原理介绍四 T-ARP主要代码分析五 T-ARP源代码一winpcap驱动简介winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个工程的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:1 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;2 在数据报发往应用程序之前,按照自定义的规那么将某些特殊的数据报过滤掉;3 在网络上发送原始的数据报;4 收集网络通信过程中的统计信息。winpcap的主要功能在于独立于主机协议如TCP-IP)而发送和接收原始数据报。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小局部是仅使用windows 95/98/Me,并且M$也已经放弃了对win9x的开发。因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。其实winpcap中的面向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比方说9x只支持ANSI编码,而NT系统那么提倡使用Unicode编码。本文讨论的是packet.dll所提供的各种函数,因为它们完全可以实现本文所希望的各项要求。但是如果你有其他特别的或更高级的要求,winpcap也提供了另一个动态连接库wpcap.dll。虽然wpcap.dll依靠于packet.dll,但是它却提供了一种更简单,直接,有力的方法来更好的利用编程环境。比方捕获一个数据报,创立一个数据报过滤装置或将监听到的数据报转存到某个文件等,wpcap.dll都会为你提供更加平安的实现方法。二Packet.dll相关数据构造及函数 本文的目的之一在于介绍如何利用winpcap驱动写ARP工具,因此有必要介绍一些相关的数据构造和函数,要不然看着一行行代码和函数,也许会有些不知所云。首先介绍一些相关的数据构造:1. typedef struct _ADAPTER ADAPTER /描述一个网络适配器;2. typedef struct _PACKET PACKET /描述一组网络数据报的构造;3. typedef struct NetType NetType /描述网络类型的数据构造;4. typedef struct npf_if_addr npf_if_addr /描述一个网络适配器的ip地址;5. struct bpf_hdr /数据报头部;6. struct bpf_stat /当前捕获数据报的统计信息。下面,将介绍T-ARP用到的各个函数,他们都是在packet.dll中定义的:1 LPPACKET PacketAllocatePacket(void)如果运行成功,返回一个_PACKET构造的指针,否那么返回NULL。成功返回的结果将会传送到PacketReceivePacket()函数,接收来自驱动的网络数据报。2 VOID PacketCloseAdapter(LPADAPTER lpAdapter)关闭参数中提供的网络适配器,释放相关的ADAPTER构造。3 VOID PacketFreePacket(LPPACKET lpPacket)释放参数提供的_PACKET构造。4 BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize)返回可以得到的网络适配器列表及描述。5 BOOLEAN PacketGetNetInfoEx(LPTSTR AdapterNames,npf_ip_addr *buff, PLONG NEntries)返回某个网络适配器的全面地址信息。其中npf_ip_addr构造包含:IPAddress,SubnetMask,BroadcastIPAddress: ip地址SubnetMask: 子网掩码Broadcast: 播送地址6 BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type)返回某个网络适配器的MAC类型。NetType构造里包含了LinkSpeed(速度和LinkType(类型。其中LinkType包含以下几种情况:NdisMedium802_3: Ethernet(802.3)NdisMediumWan: WANNdisMedium802_5: Token Ring(802.5)NdisMediumFddi: FDDINdisMediumAtm: ATMNdisMediumAret878_2: ARET(878.2)7 BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s)返回几个关于当前捕获报告的统计信息。其中bpf_stat构造包含:bs_recv, bs_drop,ps_ifdrop,bs_captbs_recv: 从网络适配器开场捕获数据报开场所接收到的所有数据报的数目,包括丧失的数据报;bs_drop: 丧失的数据报数目。在驱动缓冲区已经满时,就会发生数据报丧失的情况。8 PCHAR PacketGetVersion()返回关于dll的版本信息。9 VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer, UINT Length)初始化一个_PACKET构造。10 LPADAPTER PacketOpetAdapter(LPTSTR AdapterName)翻开一个网络适配器。11 BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync)从NPF驱动程序读取网络数据报及统计信息。数据报编码构造: |bpf_hdr|data|Padding|bpf_hdr|data|Padding|12 BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET lpPacket, BOOLEAN Sync)发送一个或多个数据报的副本。13 BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim)设置捕获数据报的内核级缓冲区大小。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: 所有本地数据报均被接收。15 BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites)设置调用PacketSendPacket()函数发送一个数据报副本所重复的次数。三T-ARP功能及原理介绍准备工作: 1. 安装winpcap驱动,目前最新的版本为winpcap_3.0_alpha, 稳定版本为winpcap_2.3;2. 使用ARP欺骗功能前,必须启动ip路由功能,修改(添加)注册表选项: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersIPEnableRouter = 0x1选项: -m 主机扫描,获得局域网内指定ip段中存活主机的ip地址和mac地址;-a 反嗅探扫描,获得局域网内指定ip段中嗅探主机的ip地址和mac地址;-s ARP欺骗,欺骗局域网内指定的两台主机,使其相互发送接收的数据报均通过本地主机;网络嗅探,如果你选择欺骗的两台主机均是本地主机,那么将会监听到所有流过本地主机的数据报;IP冲突,如果你选择欺骗的两台主机是同一台非本地主机,那么就会发起ip冲突攻击;-r 重置被欺骗主机,使被欺骗的两台主机恢复正常的工作状态。原理及实现过程:无论什么选项,第一件事就是获得本地主机的mac地址及相关网络设置。我们以一个特殊的ip地址(112.112.112.112)向本地主机发送一个ARP Request(ARP请求)数据报,当本地主机接收到后,就会发送一个ARP Reply(ARP应答)数据报来回应请求,这样我们就可以获得本地主机的mac地址了。至于相关的网络设置可以通过PacketGetNetInfoEx()和PacketGetNetType()获得。-m 以本地主机的名义(本地主机的ip和mac)向指定ip网段内的所有主机发送播送(ff:ff:ff:ff:ff:ff)ARP Request数据报,存活的主机就会发送ARP Reply数据报,这样就可以获得当前存活主机的列表。因为在很多网关上都对ARP Request做了限制-非内网ip发送的ARP Request数据报不会得到网关的回应,如果你用内网的其他某台主机的ip来发送ARP Request数据报,如果填写的mac地址和相应的ip不合,就会出现ip冲突。所以最好还是用自己的ip和mac地址来发送请求。-a 以本地主机的名义(本地主机的ip和mac)向指定ip网段内的所有主机发送31位伪播送地址(ff:ff:ff:ff:ff:fe)的ARP Request数据报,只有正在嗅探的主机才会发送ARP Reply数据报,这样就可以获得当前存活主机的列表。嗅探中的win2000系统还会对16位伪播送地址(ff:ff:00:00:00:00)做出回应;而嗅探中的win95/98/me不仅会回应16位伪播送地址,而且也会回应8位伪播送地址(ff:00:00:00:00:00),而*NIX系统对各种播送地址所做出的反响却有些不同。在此我们选择31位伪播送地址,是因为绝大多数的系统在嗅探时都会对它做出回应。而正常状况下的各种系统,都不会对31位伪播送地址做出回应。-s (ARP欺骗spoof) 需要强调的是在某些局域网(如以太网)内,数据报的发送与接收是基于硬件地址的,这是我们实现欺骗的根底。首先获得指定的两台主机(假设为 A 和 B)的mac地址,然后向A发送ARP Reply数据报,其中的源ip地址为B的
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号