转载请注明: http://blog.csdn.net/HEL_WOR/article/details/50650465
前段时间翻看了点计算机网络方面的书,从DNS跳到了ARP协议后,就打算试试写一个ARP的扫描攻击程序出来,于是就有了这篇博客
现在想想大学的时候我们寝室应该受到ARP扫描攻击了,因为我们寝室的一夜之间连上WIFI后都不能上网了,当时不知道对路由器做静态绑定,于是后面的时间我都是蹭的其他寝室的wifi,现在想来当时是因为心没在这行吧。
ARP攻击的原理比较简单,告诉路由器被攻击主机A的MAC地址是一个假的MAC地址,由于数据在物理层是通过MAC地址来描述目标主机的地址的,而非网络层里使用的IP地址来描述主机地址,也就是说我们请求远程服务的地址最终都会被ARP协议解析成MAC地址,路由器在接收到被攻击主机A发出请求的响应数据后,会查找自己的ARP表,根据ARP表中记录的IP-MAC地址对获取主机A的MAC地址,然后将获得的响应数据表转发给被攻击主机A,但不幸的是,如果路由器查找自己的ARP表得到的是被攻击后记录下的假的MAC地址,那么主机A就不能得到自己想要的数据,对于在操作主机A的用户来说看到的现象就是主机A的页面打开很慢或者无法打开,视频加载缓慢或无法加载,直至最后主机A断网。攻击的核心就是篡改其他网络设备能看到的被攻击主机的MAC地址。
用JAVA实现ARP扫描和攻击需要用到JPCAP这个第三方JAR包,在使用这个JAR的时候回遇到一系列问题。
1.no dependence libray
请安装Winpcap。2.java.lang.UnsatisfiedLinkError:no jpcap in java.library.path
把DLL扔到JDK下或者在工程里对JRE System Library设置Native Library Location到本地文件夹下,这点确实和VS开发里不同,VS里只需要添加引用即可完成DLL引用,Eclipse里需要制定library路径。3.java.lang.UnsatisfiedLinkError:jpcap.JpcapCaptor.getDeviceList()[Ljpcap/NetworkInterface;
这个错误在网上得到的提示信息是jpcap.jar和jpcap.dll的版本对应不上,测试后发现确实是这个原因,这里提供一个完整的jacap安装文件。
程序运行效果截图:
ArpImplenment类:
package ArpAttack;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
public class ArpImplenment {
/*
* 保存IP-Mac对
*/
private static HashMap<String, String> map = new HashMap<String, String>();
/*
* 构造MAC地址byte数组
*/
public static byte[] stomac(String s) {
byte[] mac = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 };
String[] s1 = s.split("-");
for (int x = 0; x < s1.length; x++) {
mac[x] = (byte) ((Integer.parseInt(s1[x], 16)) & 0xff);
}
return mac;
}
/*
* 发送ARP函数
*/
public static void SendArp(HashMap<String, String> map) throws Exception {
/*
* 枚举网卡并打开设备
* 检查本机当前使用的哪个网卡 是走的本地连接还是无线网络连接
* 设置错误会导致ARP请求不会发出去 但检测不到异常
*/
NetworkInter