📄 search.java
字号:
import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.Arrays;
import jpcap.*;
import jpcap.packet.*;
import java.io.*;
import java.util.Vector;
class search implements Runnable {
//发现本机器的网络接口,得到本机所有的网络适配器
NetworkInterface[] devices=JpcapCaptor.getDeviceList();
InetAddress srcip=null;
NetworkInterface device;
//填写全1广播mac目标地址
byte[] broadcast=new byte[]{(byte)255,(byte)255,(byte)255,(byte)255,(byte)255,(byte)255};
int i;
int head;
int end;
long newLength=0;
String netAddress;
ARPPacket arp;
EthernetPacket ether;
JpcapCaptor captor;
JpcapSender sender;
RandomAccessFile file;
public search(){
try {
file=new RandomAccessFile("searchLog.txt","rw");
file.setLength(newLength); // 实现清空文件目的
BufferedReader read=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入起始IP地址(1-254): ");
String headIP=null;
headIP=read.readLine();
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入结束IP地址(1-254): ");
String endIP=null;
endIP=reader.readLine();
String nativeIP=InetAddress.getLocalHost().getHostAddress();
i=nativeIP.lastIndexOf('.');
this.head=Integer.parseInt(headIP);
this.end=Integer.parseInt(endIP);
this.netAddress=nativeIP.substring(0,i+1);
init();
new Thread(this).start();
}
catch(Exception e) {
System.out.println("出现异常: "+e);
}
}
public void init(){
int index=0;
if(devices.length>1)
index=1;
device=devices[index];
try {
captor=JpcapCaptor.openDevice(device,200,false,10);//开启网络接口,用于抓取包和读取包
captor.setFilter("arp",true); //表明只接收arp帧
}catch(IOException e){
System.exit(0);
}
sender=captor.getJpcapSenderInstance(); //获取一个发送包类对象(使用同一个网络适配器)
//获得接口地址,这里考虑到一网络接口可能有多地址
for(i=0;i<device.addresses.length;i++)
if(device.addresses[i].address instanceof Inet4Address){
srcip=device.addresses[i].address;
break;
}
}
public void run() {
try {
for(int j=head;j<=end;j++){
String IP=netAddress+j;
arp=new ARPPacket();
arp.hardtype=ARPPacket.HARDTYPE_ETHER; //网络环境是以太网,(其他还有令牌环,帧中继)
arp.prototype=ARPPacket.PROTOTYPE_IP; //为IP 协议类型
arp.operation=ARPPacket.ARP_REQUEST; //arp动作类型,这里是arp请求
arp.hlen=6; //硬件地址长度
arp.plen=4; //协议地址长度
arp.sender_hardaddr=device.mac_address; //arp发送源物理地址
arp.sender_protoaddr=srcip.getAddress(); //arp发送源协议地址
arp.target_hardaddr=broadcast; //arp目标物理地址,这里为广播
arp.target_protoaddr=InetAddress.getByName(IP).getAddress();
ether=new EthernetPacket();
ether.frametype=EthernetPacket.ETHERTYPE_ARP; //以太网帧类型
ether.src_mac=device.mac_address; //发送源mac地址
ether.dst_mac=broadcast; //目标mac地址为广播地址
arp.datalink=ether;
//发送
sender.sendPacket(arp);
//处理回复
ARPPacket p=(ARPPacket)captor.getPacket();
if(p==null) writeFile(p);
else
if(Arrays.equals(p.target_protoaddr,srcip.getAddress()))
writeFile(p);
}
}
catch(Exception e) {
System.out.println("有异常"+e);
}
}
public void writeFile(ARPPacket replyPacket) {
if(replyPacket!=null) {
try {
byte[] ip=replyPacket.sender_protoaddr;
byte[] mac=replyPacket.sender_hardaddr;
file.write(ip);
file.write(mac);
System.out.println(file.length());
} catch(Exception e){
System.out.println("出现异常: "+e);
}
}
}
public static void main(String args[]) {
new search();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -