关于获取wifi密码或者访问/data/misc/wifi/×.conf的权限

Leafact 2015-04-27 02:16:07
想获得wifi密码的明文,我从两个方向入手,但都遇到了困难
1.我想利用wifiManager获得getConfiguration的列表
代码如下
WifiManager manager=(WifiManager) getSystemService(WIFI_SERVICE);
List<WifiConfiguration> wifis=manager.getConfiguredNetworks();
StringBuffer sb=new StringBuffer();
for(WifiConfiguration temp : wifis)
{
sb.append(temp.preSharedKey+'\n');
}

但是,我在查阅资料是发现,preSharedKey已经改变了,我看11年的帖子这个方法是可以成功应该(百度看的)
api说明preSharedKey
/**
* Pre-shared key for use with WPA-PSK.
* <p/>
* When the value of this key is read, the actual key is
* not returned, just a "*" if the key has a value, or the null
* string otherwise.
*/
返回的竟然是‘×’

另外一种方法是去读文件访问,但是肯定是权限不够的,网上查了一段代码
public StringBuffer read() throws Exception {
Process process = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
StringBuffer wifiConf = new StringBuffer();
try {
process = Runtime.getRuntime().exec("su");
dataOutputStream = new DataOutputStream(process.getOutputStream());
dataInputStream = new DataInputStream(process.getInputStream());
dataOutputStream.writeBytes("cat /data/misc/wifi/*.conf\n");
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
InputStreamReader inputStreamReader = new InputStreamReader(
dataInputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
wifiConf.append(line);
}
bufferedReader.close();
inputStreamReader.close();
process.waitFor();
} catch (Exception e) {
throw e;
} finally {
try {
if (dataOutputStream != null) {
dataOutputStream.close();
}
if (dataInputStream != null) {
dataInputStream.close();
}
process.destroy();
} catch (Exception e) {
throw e;
}
}
StringBuffer sb = new StringBuffer();
Pattern network = Pattern.compile("network=\\{([^\\}]+)\\}",
Pattern.DOTALL);
Matcher networkMatcher = network.matcher(wifiConf.toString());
while (networkMatcher.find()) {
String networkBlock = networkMatcher.group();
Pattern ssid = Pattern.compile("ssid=\"([^\"]+)\"");
Matcher ssidMatcher = ssid.matcher(networkBlock);
if (ssidMatcher.find()) {
sb.append(ssidMatcher.group(1));
Pattern psk = Pattern.compile("psk=\"([^\"]+)\"");
Matcher pskMatcher = psk.matcher(networkBlock);
if (pskMatcher.find()) {
sb.append(pskMatcher.group(1));
} else {
sb.append("无密码" + "/n");
}
}
}
return sb;
}


但是利用这个代码运行也会报错,log中显示空指针异常
04-27 06:14:27.316: W/System.err(3470): java.lang.NullPointerException: Attempt to invoke virtual method 'void java.lang.Process.destroy()' on a null object reference
那么问题来了,应用app如何访问那些文件呢,求指导
...全文
1320 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
life02 2015-04-29
  • 打赏
  • 举报
回复
WiFi密码这么容易获取,那只能说是Android系统的失败
Leafact 2015-04-29
  • 打赏
  • 举报
回复
引用 6 楼 life02 的回复:
WiFi密码这么容易获取,那只能说是Android系统的失败
有道理,看来还要自己写个界面,代替setting中的wlan模块了!
Leafact 2015-04-28
  • 打赏
  • 举报
回复
引用 4 楼 zhl3422 的回复:
既然 Root 了 ,那就试着用手机直接看看有没权限看到那个文件。
不行啊,如果我这个app要推向市场,那么,必须要支持不root的手机才行啊,如果不能获得手机中保存的密码,这个应用就没法做了
_z3422_ 2015-04-28
  • 打赏
  • 举报
回复
既然 Root 了 ,那就试着用手机直接看看有没权限看到那个文件。
Leafact 2015-04-28
  • 打赏
  • 举报
回复
有没有人啊,这里有人晕倒了
Leafact 2015-04-27
  • 打赏
  • 举报
回复
引用 1 楼 AA5279AA 的回复:
第二种方式是需要root权限,只要应用申请了root,是可以访问的。没有的root的访问该路径对应的文件为空。 第一种的话我猜测是获取到的仅仅只是配置列表,并没有配置密码。只有连接的时候才回去取对应的wifi的密码。
公司用的全是root的手机,但是还是不能访问,第一种的话,在之前android是可以的,但是可能为了安全考虑,不能显式的获得了,我想在就想获得手机wifi的密码明文,不知道有没有什么更好的方式!
失落夏天 版主 2015-04-27
  • 打赏
  • 举报
回复
第二种方式是需要root权限,只要应用申请了root,是可以访问的。没有的root的访问该路径对应的文件为空。 第一种的话我猜测是获取到的仅仅只是配置列表,并没有配置密码。只有连接的时候才回去取对应的wifi的密码。

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧