Android WIFI密码查看器实例(在获取Root权限下查看系统文件)
Android WIFI密码查看器实例
实现原理:使用shell命令查看保存WIFI密码的系统文件
涉及的知识
- 界面展示
- 基本的Shell命令
- shell查看WIFI密码
- ShellUtil的使用
- 正则表达式解析字符串
- 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权限下查看系统文件)相关推荐
- Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理
Android应用.三星i9000系列(4).SuperOneClick获取Root权限的原理 草木瓜 20110408 一.前言 经过笔者自己测试与分析,得出结论:所以Android手机获取Root ...
- mate8怎么关闭html查看器,华为Mate8获取Root教程 实测可用
本帖最后由 333hp 于 2016-1-10 23:57 编辑 本人已root成功 先将mate8解锁 华为Mate8解锁教程 华为Mate8解开bootloader锁方法,作为一款搭载了最新安卓系 ...
- android 常用adb 和 adb shell 命令 获取root权限
android 常用adb 和 adb shell 命令 ADB常用命令: 1. 查看设备 adb devices 这个命令是查看当前连接的设备, 连接到计算机的android设备或者模拟器将会 ...
- Android手机在获取root权限下的抓包过程
1. 电脑连接手机,进入adb模式:adb shell 2. 获取手机root权限:su 3. 下载tcpdump; 4. 将tcpdump放到手机/data/local/目录下:adb push c ...
- Android 控制台读取sqlite数据库以及adb获取root权限问题
(个人经验,仅供参考,错误之处,敬请谅解) 读取sqlite数据文件 1.命令行 adb.sqlite命令最好设置成环境变量,否则需要先进入该文件夹. adb shell 进入虚拟机shell ...
- Android利用 libsuperuse执行shell命令或获取root权限
Android 5.1 之后,发现通过ActivityManger获取不到正在运行的进程了,可以通过shell命令来获取,参考. libsuperuse执行shell可以参考: http://my.o ...
- Android Wifi密码查看器实现思路
概述 最近出了一个wifi万能钥匙很火,但是用wifi万能钥匙连接上wifi我们是看不到密码,假如我想给平板连接,这是我们只能用手机3G网络建立热点然后让平板上的wifi万能钥匙进行连接,这样显然很麻 ...
- android代码删除wifi,Android Wifi的forget()操作实例详解_Android_脚本之家
Android Wifi的forget()操作实例详解 我们在处理某个Wifi连接时,有时会需要忘掉当前连接的密码信息.执行这项操作,我们需要调用WifiManager::forget()函数: / ...
- 值得推荐的 5 大 Android 手机密码解锁器
大多数 Android 用户使用唯一密码来保护他们的手机和重要数据.因此,忘记密码并被锁定在手机之外可能会令人沮丧.在这种情况下,使用安卓手机密码解锁器来解决问题是一个明智的选择.本文将介绍2023 ...
最新文章
- 【概念】虚拟利润中心初识
- Python中深浅拷贝的案例教程
- SSIS 学习(2):数据流任务(上)
- python3下使用requests实现模拟用户登录 —— 基础篇(马蜂窝)
- python打印字节流_java打印流的输出使用
- php截取字符串后编码不对,php截取字符串出现中文乱码问题的解决
- asp.net 两个控件放一行_思维导图?试试这两个宝藏网站吧
- 第六章 使用ADO.NET查询和操作数据
- android高通WiFi,高通QCA9377 WiFi蓝牙模块芯片介绍,
- 详解Boost电路的基本原理
- 使用fontforge精简字体文件
- java字符实体_java转换 HTML字符实体,java特殊字符转义字符串(示例代码)
- 【python--程序】printf格式化输出函数
- Navicat 入门教程
- 计量经济学复习笔记(六)updated
- 湖北省人工智能、大数据和区块链十大优秀应用案例征集范围、申报要求和成功运用
- 睡眠多少分钟一个循环_快速眼动周期-睡眠循环
- 闽高校计算机二级c语言模拟器,闽高校计算机二级C语言模拟题
- mac PhotoshopCS6 破解安装
- 利用Pycharm断点调试Python程序
热门文章
- M1 和 Docker 谈了个恋爱
- 绕过安卓SSL验证证书的常见四种方式
- android能用svg格式,关于Android SVG图形:Android SVG图形 – 将当前PNG文件转换为svg格式的缺点...
- Kubernetes系列之五:使用yaml文件创建service向外暴露服务
- 主内存和工作内存是什么?
- 软件测试面试101问(附答案)
- 2022-10-03笔记(内网横向)
- C# winform Excel导入保存数据两种方法
- 如何自己编写一个交通仿真软件 (开篇) 走火入魔。
- python实现pdf格式转换图片格式