This commit is contained in:
Administrator
2024-08-18 17:47:11 +08:00
parent e4f4c77c19
commit e243203535
121 changed files with 7499 additions and 2169 deletions
@@ -0,0 +1,77 @@
package org.kne.cloud.network.scanner;
import java.math.BigInteger;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Objects;
public class InetAddressRange {
private InetAddress begin;
private InetAddress end;
private String beginHost;
private String endHost;
public InetAddressRange (String host) throws UnknownHostException{
this(host,host);
}
public InetAddressRange (String beginhost,String endhost) throws UnknownHostException {
beginHost=beginhost;
endHost=endhost;
InetAddress begin=InetAddress.getByName(beginhost);
InetAddress end=InetAddress.getByName(endhost);
checkIPRange(begin, end);
this.begin = begin;
this.end = end;
}
public String getBeginHost() {
return beginHost;
}
public String getEndHost() {
return endHost;
}
public InetAddressRange(InetAddress address) {
this(address,address);
}
public InetAddressRange(InetAddress begin, InetAddress end) {
super();
checkIPRange(begin, end);
this.begin = begin;
this.end = end;
}
private void checkIPRange(InetAddress begin, InetAddress end) throws IllegalArgumentException {
if(begin instanceof Inet4Address&&end instanceof Inet6Address)
throw new IllegalArgumentException("begin is IPv4 but end is IPv6");
if(begin instanceof Inet6Address&&end instanceof Inet4Address)
throw new IllegalArgumentException("begin is IPv6 but end is IPv4");
}
public InetAddress getBegin() {
return begin;
}
@Override
public int hashCode() {
return Objects.hash(begin, end);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
InetAddressRange other = (InetAddressRange) obj;
return Objects.equals(begin, other.begin) && Objects.equals(end, other.end);
}
@Override
public String toString() {
return "InetAddressRange [begin=" + begin + ", end=" + end + "]";
}
public InetAddress getEnd() {
return end;
}
public BigInteger getElementCount() {
return new BigInteger(end.getAddress()).subtract(new BigInteger( begin.getAddress())).add(BigInteger.valueOf(1));
}
}
@@ -0,0 +1,52 @@
package org.kne.cloud.network.scanner;
import java.math.BigInteger;
import java.util.Objects;
public class PortRange {
private int begin;
public PortRange(int begin, int end) {
super();
checkRange(begin,end);
this.begin = begin;
this.end = end;
}
public PortRange(int port) {
this(port,port);
}
private void checkRange(int begin2, int end2) {
if(end2<begin2)
throw new IllegalArgumentException("begin is bigger than end!");
}
private int end;
public int getBegin() {
return begin;
}
public int getEnd() {
return end;
}
@Override
public String toString() {
return "PortRange [begin=" + begin + ", end=" + end + "]";
}
@Override
public int hashCode() {
return Objects.hash(begin, end);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PortRange other = (PortRange) obj;
return begin == other.begin && end == other.end;
}
public BigInteger getElementCount() {
return BigInteger.valueOf(end).subtract(BigInteger.valueOf(begin)).add(BigInteger.valueOf(1));
}
}
@@ -0,0 +1,253 @@
package org.kne.cloud.network.scanner;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.ThreadTool;
public class TCPNetworkScanner implements Runnable {
private BiConsumer<MultipurposeSocketAddress,Socket> consumer;
private Consumer<Float>processConsumer;
public Consumer<Float> getProcessConsumer() {
return processConsumer;
}
public void setProcessConsumer(Consumer<Float> processConsumer) {
this.processConsumer = processConsumer;
}
private List<InetAddressRange> addressRanges = new ArrayList<>();
private List<PortRange> portRanges = new ArrayList<>();
public List<InetAddressRange> getAddressRanges() {
return addressRanges;
}
public List<PortRange> getPortRanges() {
return portRanges;
}
public BiConsumer<MultipurposeSocketAddress,Socket> getConsumer() {
return consumer;
}
public void setConsumer(BiConsumer<MultipurposeSocketAddress,Socket> consumer) {
this.consumer = consumer;
}
private BigInteger tot=new BigInteger("0");
private BigInteger counter=new BigInteger("0");
private int connectTimeout=500;
private int soTimeout=3000;
@Override
public void run() {
ThreadPoolExecutor exc=(ThreadPoolExecutor) Executors.newFixedThreadPool(8192,new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return ThreadTool.makeVThreadIfSupport("端口扫描线程", r);
}
});
BigInteger bip=new BigInteger("0");
for (Iterator<PortRange> iterator = portRanges.iterator(); iterator.hasNext();) {
PortRange portRange = (PortRange) iterator.next();
bip=bip.add(portRange.getElementCount());
}
BigInteger bia=new BigInteger("0");
for (Iterator<InetAddressRange> iterator = addressRanges.iterator(); iterator.hasNext();) {
InetAddressRange inetAddressRange = (InetAddressRange) iterator.next();
bia=bia.add(inetAddressRange.getElementCount());
}
tot=bip.multiply(bia);
ReentrantLock counterlock=new ReentrantLock();
counter=new BigInteger("0");
counterlock.lock();
try {
if(processConsumer!=null) {
BigDecimal bdt=new BigDecimal(tot);
BigDecimal bdc=new BigDecimal(counter);
float fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
processConsumer.accept(fp);
}
}finally {
counterlock.unlock();
}
try {
for (Iterator<PortRange> iterator = portRanges.iterator(); iterator.hasNext();) {
PortRange portRange = (PortRange) iterator.next();
int curport = portRange.getBegin();
while (curport <= portRange.getEnd()) {
for (Iterator<InetAddressRange> iterator2 = addressRanges.iterator(); iterator2.hasNext();) {
InetAddressRange inetAddressRange = (InetAddressRange) iterator2.next();
byte[]endarr=inetAddressRange.getEnd().getAddress();
byte[] curr = inetAddressRange.getBegin().getAddress();
while (compareIPAddress(curr,endarr)) {
int curport0=curport;
InetAddress currAddress=pga(curr);
while( exc.getQueue().size()>1000) {
LockSupport.parkNanos(1000000);
}
exc.execute(()->{
MultipurposeSocketAddress mpsa;
if (inetAddressRange.getBeginHost() != null&&currAddress.equals(inetAddressRange.getBegin())) {
mpsa = new MultipurposeSocketAddress(inetAddressRange.getBeginHost(), curport0);
}else if (inetAddressRange.getEndHost() != null&&currAddress.equals(inetAddressRange.getEnd())) {
mpsa = new MultipurposeSocketAddress(inetAddressRange.getEndHost(), curport0);
} else {
mpsa = new MultipurposeSocketAddress(currAddress.getHostAddress(),
curport0);
}
Socket s = null;
try {
s=new Socket();
InetSocketAddress isa=new InetSocketAddress(currAddress, curport0);
//System.out.println(isa);
s.connect(isa,connectTimeout);
s.setSoTimeout(soTimeout);
acceptMultipurposeSocketAddress(mpsa, s);
} catch (Exception e) {
acceptMultipurposeSocketAddress(mpsa, null);
} finally {
if (s != null)
try {
s.close();
} catch (IOException e) {
}
}
counterlock.lock();
try {
counter=counter.add(BigInteger.valueOf(1));
if(processConsumer!=null) {
BigDecimal bdt=new BigDecimal(tot);
BigDecimal bdc=new BigDecimal(counter);
float fp=bdc.divide(bdt, 8, BigDecimal.ROUND_HALF_UP).floatValue()*100;
processConsumer.accept(fp);
}
}finally {
counterlock.unlock();
}
});
increaceIPAddress(curr);
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
curport++;
}
}
}finally {
exc.shutdown();
try {
exc.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private InetAddress pga(byte[] curr) {
try {
return InetAddress.getByAddress(curr);
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}
private boolean compareIPAddress(byte[] curr, byte[] endarr) {
return new BigInteger(curr).compareTo(new BigInteger(endarr))<=0;
}
private void increaceIPAddress(byte[] curr) {
System.arraycopy( new BigInteger(curr).add(BigInteger.valueOf(1)).toByteArray(), 0, curr, 0, curr.length); ;
}
protected void acceptMultipurposeSocketAddress(MultipurposeSocketAddress scanned, Socket s) {
consumer.accept(scanned,s);
}
public int getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public int getSoTimeout() {
return soTimeout;
}
public void setSoTimeout(int soTimeout) {
this.soTimeout = soTimeout;
}
public TCPNetworkScanner(int connectTimeout, int soTimeout) {
super();
this.connectTimeout = connectTimeout;
this.soTimeout = soTimeout;
}
public TCPNetworkScanner() {
// TODO 自动生成的构造函数存根
}
public static void main(String[] args) throws UnknownHostException {
TCPNetworkScanner tcn = new TCPNetworkScanner();
tcn.getPortRanges().add(new PortRange(25565));
tcn.getPortRanges().add(new PortRange(34000, 38000));
tcn.getAddressRanges().add(new InetAddressRange("192.168.0.1","192.168.1.255"));
tcn.setConsumer((scanned,s) -> {
System.out.println(scanned);
});
tcn.setProcessConsumer((f)->{System.out.println(f);
});
tcn.run();
}
}