Android WIFI密码查看器实例

实现原理:使用shell命令查看保存WIFI密码的系统文件

涉及的知识

  1. 界面展示
  2. 基本的Shell命令
  3. shell查看WIFI密码
  4. ShellUtil的使用
  5. 正则表达式解析字符串
  6. ExpandableListView的使用

界面展示

主界面只包含一个ExpandableListView

基本的Shell命令

1.shel由 adb shell进入,基本命令于Linux下的命令相同,这边演示几个常用的命令

因为是在手机的系统文件下操作,所以部分命令不方便演示,下面直接进入查看wifi密码的命令

首先执行su获取root权限

执行cat /data/misc/wifi/wpa_supplicant.conf来查看本地的WIFI信息

在应用内部执行shell命令

此处我们用到是ShellUtil的java文件,来源于网络,封装了一写方法用于执行shell命令,代码如下

注释都在代码内部,此处不多加解释

package com.brioal.poswermanager;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;public class ShellUtils {public static final String COMMAND_SU = "su"; // 获取root权限的命令public static final String COMMAND_SH = "sh"; // 执行sh文件的命令public static final String COMMAND_EXIT = "exit\n"; // 退出的命令public static final String COMMAND_LINE_END = "\n"; // 执行命令必须加在末尾private ShellUtils() {throw new AssertionError();}//检测root状态public static boolean checkRootPermission() {return execCommand("echo root", true, false).result == 0;}//执行单行命令,实际还是调用的执行多行 ,传入命令和是否需要rootpublic static CommandResult execCommand(String command, boolean isRoot) {return execCommand(new String[]{command}, isRoot, true);}//执行List<String>中的命令 , 传入List和是否需要rootpublic static CommandResult execCommand(List<String> commands, boolean isRoot) {return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, true);}//执行多行命令public static CommandResult execCommand(String[] commands, boolean isRoot) {return execCommand(commands, isRoot, true);}public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {return execCommand(new String[]{command}, isRoot, isNeedResultMsg);}public static CommandResult execCommand(List<String> commands, boolean isRoot, boolean isNeedResultMsg) {return execCommand(commands == null ? null : commands.toArray(new String[]{}), isRoot, isNeedResultMsg);}//执行命令,获得返回的信息public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) {int result = -1;if (commands == null || commands.length == 0) {return new CommandResult(result, null, null);}Process process = null;BufferedReader successResult = null;BufferedReader errorResult = null;StringBuilder successMsg = null;StringBuilder errorMsg = null;DataOutputStream os = null;try {process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);os = new DataOutputStream(process.getOutputStream());for (String command : commands) {if (command == null) {continue;}os.write(command.getBytes());os.writeBytes(COMMAND_LINE_END);os.flush();}os.writeBytes(COMMAND_EXIT);os.flush();result = process.waitFor();// get command resultif (isNeedResultMsg) {successMsg = new StringBuilder();errorMsg = new StringBuilder();successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));String s;while ((s = successResult.readLine()) != null) {successMsg.append(s);}while ((s = errorResult.readLine()) != null) {errorMsg.append(s);}}} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {try {if (os != null) {os.close();}if (successResult != null) {successResult.close();}if (errorResult != null) {errorResult.close();}} catch (IOException e) {e.printStackTrace();}if (process != null) {process.destroy();}}return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null: errorMsg.toString());}//封装了返回信息public static class CommandResult {public int result;public String successMsg; //成功信息public String errorMsg; // 错误信息public CommandResult(int result) {this.result = result;}public CommandResult(int result, String successMsg, String errorMsg) {this.result = result;this.successMsg = successMsg;this.errorMsg = errorMsg;}}
}

在应用内部执行cat /data/misc/wifi/wpa_supplicant.conf命令

到了这一步就很简单了,直接看代码

strings = new ArrayList<>();
strings.add("cd data/" + ShellUtils.COMMAND_LINE_END);
strings.add("cd misc/" + ShellUtils.COMMAND_LINE_END);
strings.add("cd wifi/" + ShellUtils.COMMAND_LINE_END);
strings.add("ls" + ShellUtils.COMMAND_LINE_END);
strings.add("cat wpa_supplicant.conf" + ShellUtils.COMMAND_LINE_END);
ShellUtils.CommandResult result = ShellUtils.execCommand(strings, true, true);
//获取返回的结果
String wifis = result.successMsg;

此时返回的信息就包含了wpa_supplicant.conf文件内部的所有信息,此时我们需要做的就是解析WIFI名称和密码然后显示到界面

利用正则表达式解析返回的数据

首先查看我们获取到的返回信息,其中wifi的名称格式是ssid="......"密码的格式是psk="......",这样我们就可以用正则表达式来截取名称和密码

注:部分机型中文的wifi名称会显示为字母和数字的组合,且没有双引号,另开放的网络没有wifi密码,密码一栏的显示是这样的key_mgmt=NONE,所以第一步执行的是讲其中的key_mgmt=NONE替换为key_mgmt="无密码".这样就不会出现名称的个数和密码的个数不相符的问题

解析wifi的名称

 Pattern pattern = null;Matcher matcher = null;listID = new ArrayList<>();listPass = new ArrayList<>();//获取用户名String rexId = "ssid=[\\S]+[\\s]";pattern = Pattern.compile(rexId);matcher = pattern.matcher(wifis);while (matcher.find()) {listID.add(matcher.group());}

解析wifi的密码

        //获取密码String rexPass = "psk=\"[^\"]+\"";pattern = Pattern.compile(rexPass);matcher = pattern.matcher(wifis);while (matcher.find()) {listPass.add(matcher.group());}
经过这两步之后我们就获取到了两个包含wifi名称和wifi密码的LIst
封装一个保存wifi信息的base类
package com.brioal.wifipassword.base;/*** Created by Brioal on 2016/3/21.*/
public class WifiItem {private String mId ;private String mPass ;public WifiItem(String mId, String mPass) {this.mId = mId;this.mPass = mPass;}public String getmId() {return mId;}public void setmId(String mId) {this.mId = mId;}public String getmPass() {return mPass;}public void setmPass(String mPass) {this.mPass = mPass;}
}
获取List<WifiItem>
for (int i = 0; i < listID.size(); i++) {String mId = listID.get(i);String mPass = listPass.get(i);mId = mId.substring(6, mId.length() - 2);mPass = mPass.substring(5, mPass.length() - 1);WifiItem item = new WifiItem(mId, mPass);wifiList.add(item);}

接下来就是最后一步,将wifi信息显示到ExpandableListView当中

显示wifi信息

这一部分比较简单,就直接上代码吧

创建Adapter

private class MyAdapter implements ExpandableListAdapter {@Overridepublic void registerDataSetObserver(DataSetObserver observer) {}@Overridepublic void unregisterDataSetObserver(DataSetObserver observer) {}@Overridepublic int getGroupCount() {return listID.size();}@Overridepublic int getChildrenCount(int groupPosition) {return 1;}@Overridepublic Object getGroup(int groupPosition) {return listID.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {return listPass.get(groupPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return groupPosition;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {TextView textView = new TextView(MainActivity.this);textView.setTextSize(22);textView.setGravity(Gravity.CENTER_VERTICAL);textView.setText("     "+wifiList.get(groupPosition).getmId());textView.setSingleLine();textView.setMaxWidth(100);textView.setTypeface(Typeface.SANS_SERIF);textView.setEllipsize(TextUtils.TruncateAt.END);return textView;}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {TextView textView = new TextView(MainActivity.this);textView.setTextSize(15);textView.setGravity(Gravity.CENTER_VERTICAL);textView.setText("      "+wifiList.get(groupPosition).getmPass());textView.setTypeface(Typeface.SANS_SERIF);return textView;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return false;}@Overridepublic boolean areAllItemsEnabled() {return false;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic void onGroupExpanded(int groupPosition) {}@Overridepublic void onGroupCollapsed(int groupPosition) {}@Overridepublic long getCombinedChildId(long groupId, long childId) {return 0;}@Overridepublic long getCombinedGroupId(long groupId) {return 0;}}

ExpandableLIstView设置Adapter

adapter = new MyAdapter();listView.setAdapter(adapter);

至此大功告成

源码已分享到Github,有兴趣的同学欢迎下载查看

欢迎联系作者交流,作者QQ:821329382

Android WIFI密码查看器实例(在获取Root权限下查看系统文件)相关推荐

  1. Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理

    Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理 草木瓜 20110408 一.前言 经过笔者自己测试与分析,得出结论:所以Android手机获取Root ...

  2. mate8怎么关闭html查看器,华为Mate8获取Root教程 实测可用

    本帖最后由 333hp 于 2016-1-10 23:57 编辑 本人已root成功 先将mate8解锁 华为Mate8解锁教程 华为Mate8解开bootloader锁方法,作为一款搭载了最新安卓系 ...

  3. android 常用adb 和 adb shell 命令 获取root权限

    android 常用adb 和 adb shell 命令 ADB常用命令:   1. 查看设备 adb  devices 这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会 ...

  4. Android手机在获取root权限下的抓包过程

    1. 电脑连接手机,进入adb模式:adb shell 2. 获取手机root权限:su 3. 下载tcpdump; 4. 将tcpdump放到手机/data/local/目录下:adb push c ...

  5. Android 控制台读取sqlite数据库以及adb获取root权限问题

    (个人经验,仅供参考,错误之处,敬请谅解) 读取sqlite数据文件 1.命令行     adb.sqlite命令最好设置成环境变量,否则需要先进入该文件夹. adb shell 进入虚拟机shell ...

  6. Android利用 libsuperuse执行shell命令或获取root权限

    Android 5.1 之后,发现通过ActivityManger获取不到正在运行的进程了,可以通过shell命令来获取,参考. libsuperuse执行shell可以参考: http://my.o ...

  7. Android Wifi密码查看器实现思路

    概述 最近出了一个wifi万能钥匙很火,但是用wifi万能钥匙连接上wifi我们是看不到密码,假如我想给平板连接,这是我们只能用手机3G网络建立热点然后让平板上的wifi万能钥匙进行连接,这样显然很麻 ...

  8. android代码删除wifi,Android Wifi的forget()操作实例详解_Android_脚本之家

    Android  Wifi的forget()操作实例详解 我们在处理某个Wifi连接时,有时会需要忘掉当前连接的密码信息.执行这项操作,我们需要调用WifiManager::forget()函数: / ...

  9. 值得推荐的 5 大 Android 手机密码解锁器

    大多数 Android 用户使用唯一密码来保护他们的手机和重要数据.因此,忘记密码并被锁定在手机之外可能会令人沮丧.在这种情况下,使用安卓手机密码解锁器来解决问题是一个明智的选择.本文将介绍2023 ...

最新文章

  1. 【概念】虚拟利润中心初识
  2. Python中深浅拷贝的案例教程
  3. SSIS 学习(2):数据流任务(上)
  4. python3下使用requests实现模拟用户登录 —— 基础篇(马蜂窝)
  5. python打印字节流_java打印流的输出使用
  6. php截取字符串后编码不对,php截取字符串出现中文乱码问题的解决
  7. asp.net 两个控件放一行_思维导图?试试这两个宝藏网站吧
  8. 第六章 使用ADO.NET查询和操作数据
  9. android高通WiFi,高通QCA9377 WiFi蓝牙模块芯片介绍,
  10. 详解Boost电路的基本原理
  11. 使用fontforge精简字体文件
  12. java字符实体_java转换 HTML字符实体,java特殊字符转义字符串(示例代码)
  13. 【python--程序】printf格式化输出函数
  14. Navicat 入门教程
  15. 计量经济学复习笔记(六)updated
  16. 湖北省人工智能、大数据和区块链十大优秀应用案例征集范围、申报要求和成功运用
  17. 睡眠多少分钟一个循环_快速眼动周期-睡眠循环
  18. 闽高校计算机二级c语言模拟器,闽高校计算机二级C语言模拟题
  19. mac PhotoshopCS6 破解安装
  20. 利用Pycharm断点调试Python程序

热门文章

  1. M1 和 Docker 谈了个恋爱
  2. 绕过安卓SSL验证证书的常见四种方式
  3. android能用svg格式,关于Android SVG图形:Android SVG图形 – 将当前PNG文件转换为svg格式的缺点...
  4. Kubernetes系列之五:使用yaml文件创建service向外暴露服务
  5. 主内存和工作内存是什么?
  6. 软件测试面试101问(附答案)
  7. 2022-10-03笔记(内网横向)
  8. C# winform Excel导入保存数据两种方法
  9. 如何自己编写一个交通仿真软件 (开篇) 走火入魔。
  10. python实现pdf格式转换图片格式