JAVA实现ARP欺骗性的数据封包监听

doufuxadf 2010-01-19

如果说最近有什么不爽的事情,那就是与人共享网络的痛苦了,特别是当其他共享者使用那些P2P工具下载软件,而你却看着网页进度条一点点爬的时候,那种痛苦对于我这种网虫级别的人来说,那简直就是痛不欲生。绝对不能再忍了,于是乎上网下载P2P终结者,哼,你们不仁我则不义,看谁厉害。软件下好后,立刻启动监控,然后尝试了下速度,哇,那个爽啊。可惜好景不长,没多久对方就跑来问我为什么他们断网了?我楞了一下,那垃圾软件居然连对方的网都断了,于是支支唔唔的应付了他,说我看下,总算勉强过关,还好他们不懂电脑,不然就掉大了(貌视挺卑鄙的,别BS俺,俺也是迫不得已)。

没办法,那破烂软件居然连人家网都断了,我仅仅只是想给他们限速而已(还算有点良心),仔细查看了下文档,使用的方式都没问题啊,为什么会这样呢?想了半天也毫无头绪,没办法,看来只能自己动手了,于是乎上网找了些关于这方面的资料看了下,也写了一点代码做试验,由于时间有限也只写了一点,不过总体的做法大概是有所了解,在这里就写一篇文章大概记录一下自己的做法,以便作为日记又可与大众分享下。

其实目前网络上类似P2P终结者这类软件,主要都是基于ARP欺骗实现的,网络上到处都有关于ARP欺骗的介绍,不过为了本文读者不需要再去查找,我就在这里大概讲解一下。

ARP(Address Resolution Protocol)既地址解释协议,主要的目的是用于进行IP和MAC地址解释的。IP是网络层协议,而MAC是被数据链路层使用。网络中两个节点要进行通信,那么首先发送端必须要知道源和目的地的MAC地址,而网络层是使用IP地址,所以要获得MAC地址,就必须通过IP地址获取对应的MAC地址,这样就需要使用ARP协议将IP地址转换为MAC地址,而同时为了能够快速的找到目的地的MAC地址,每个节点都会有一个ARP缓存,用于保存已经转好好的 MAC地址,大家可以在控制台下使用arp –a指令查看arp缓存表。

而ARP具体过程就是当需要通过IP获取一个远端的的MAC 地址的时候,系统会首先检查ARP表中是否存在对应的IP地址,如果没有,则发送一个ARP广播,当某一个拥有这个MAC地址的节点收到ARP请求的时候,会创建一个ARP reply包,并发送到ARP请求的源节点,ARP Reply包中就包含了目的地节点的MAC地址,在源节点接受到这个reply后,会将目的地节点的MAC地址保存在ARP缓存表中,下一次再次请求同一 IP地址的时候,系统将会从ARP表中直接获取目的地MAC地址,而不需要再次发送ARP广播。

看到这里,ARP的具体过程大概讲解了一遍,希望能够解释清楚。相信有心的朋友一定已经开始考虑ARP欺骗的原理了吧,其实就是利用ARP表进行ARP欺骗,比如一台局域网内的机器A,通过网关B进行internet连接,而它的arp表中保存着网关B的IP和MAC地址对,如下:

192.168.1.1 —> MAC1(懒得写那么长了,就以MAC1作为MAC地址了)

那么也就是说,当A想上网的时候,他所有的数据都将先发送到网关再由网关转发出去,那么A的数据首先会通过192.168.1.1找到网关的MAC地址 MAC1,然后就可把数据发送到网关了。此时你的机器是C,MAC地址是MAC2,你想通过ARP欺骗来获取A传输的数据,那么你所需要做的事情其实很简单,就是将机器A的ARP表中192.168.1.1对应的MAC地址MAC1改成MAC2即可,这样子机器A所有发送到192.168.1.1的数据就会发到MAC地址为MAC2的机器上,也就是你的机器上了。

要更改APR表的记录,办法就是伪造一个ARP reply包发送给机器A,而这个ARP reply包中的源IP为192.168.1.1,MAC地址为MAC2既你的机器的MAC地址即可,机器A接受到后就会将这个源IP和MAC刷新到它的 ARP缓存表中,覆盖原有的记录,最终这样就可以达到ARP欺骗的目的了。

讲到这里不知道大家是否对ARP欺骗有所了解呢?如果再不了解那就上网搜搜吧,网上很多相关的资料。好了,原理讲完了,那就轮到实现了,通过JAVA又如何实现ARP欺骗呢?

从头到尾来做,当然不是我的作风,JAVA社区那么庞大,我么应该好好利用,要站在巨人的肩膀上成功嘛,呵呵。有一个开源项目JPCAP,这个项目提供一个中间层接口让使用者可以调用如wincap/libpcap这些库对网络传输进行控制,具体可到官方网站查看其文档。

相关推荐