别人家 WiFi万能钥匙是怎么知道你家WiFi密码的?

是不是一直都在好奇WiFi万能钥匙是怎么知道你家(别人家)WiFi密码的?有人说是直接破解,但对于WiFi万能钥匙的能力来说,穷举法是很消耗时间的,事实上WiFi万能钥匙所用的是被偷偷上传的WiFi数据存入服务器,然后再提供给下一个使用该网络的用户的 。

别人家 WiFi万能钥匙是怎么知道你家WiFi密码的?

文章插图
WiFi万能钥匙是怎么知道你家(别人家)WiFi密码的?
WiFi万能钥匙的基础功能并不是采用某些答案所述“密码库穷举(逐个尝试)暴力破解”的方式获得正确密码,而是通过用户上传分享的热点(主动或“被动”)到后台服务器的方式收集、积累数据 。后台服务器维护者一份热点数据库,其中包含着热点名称(或者用来唯一标识的MAC地址)以及与其对应的密码字符串 。查询密码时,用户将周围扫描到的陌生热点信息上传,服务器后台查询到相对应的密码(如果分享过的话)后返回给APP供用户选择使用 。不过WiFi共享钥匙有一个“深度解锁”的功能与“暴力破解”沾点边,但它也仅仅是使用几个常见的较为简单的密码来尝试连接热点,不能称得上算“密码库穷举” 。
现在WiFi万能钥匙充实密码库的方式主要是用户主动分享,毕竟用户基数变大了,但在以前可不是这样 。早期的WiFi万能钥匙得到热点密码数据的手段并不高明,甚至可以说是不光彩的 。
【别人家 WiFi万能钥匙是怎么知道你家WiFi密码的?】我们知道Android系统中有个文件是用来存储WiFi密码的,那就是/data/misc/wifi/wpa_supplicant.conf
别人家 WiFi万能钥匙是怎么知道你家WiFi密码的?

文章插图
此文件只有当获得root权限后才能访问 。
图上显示有两个WiFi热点“network”,ssid是热点名称,psk是密码 。上面那个是我的私人热点,另一个“Bjume”则是某商家提供的免费热点 。请注意,其中的密码是明文显示的“bjume2013” 。
得到了这个文件,或者能看到这个文件的内容,就意味着能得到这台手机登录过的所有WiFi热点,以及它们的明文密码!
早期版本的WiFi万能钥匙会向用户申请root权限:
别人家 WiFi万能钥匙是怎么知道你家WiFi密码的?

文章插图
虽然我不是专职的Android开发者,但我毕竟也开发过一些自用的小工具,对系统提供的接口和权限还是略知一二的 。WiFi万能钥匙的所有业务功能,包括扫描周边的WiFi信号、通过网络查询对应WiFi信号的密码、输入密码登录WiFi、通过网络将用户在应用中输入的密码上传到服务器,这些都可以使用基本的系统API实现,不知道它为甚麽要申请root权限 。难道是为了访问wpa_supplicant.conf文件?单从这一点上作恶意揣测似乎不太妥当,毕竟在Android上很多别的行为也需要root(虽然我实在不知道WiFi万能钥匙哪个功能有这个需求),那么接下来的证据就无法回避了 。
通过对com.snda.wifilocating.apk文件(WiFi万能钥匙)进行反编译之后,得到的很多smali脚本,有这么一个很有意思:
01/home/feng/documents/com.snda.wifilocating.apk/smali/com/snda/wifilocating/a/i.smali:021049invoke-direct {v2, v3}, Ljava/io/DataOutputStream;->(Ljava/io/OutputStream;)V031050041051:const-string v3, "cat /data/misc/wifi/wpa_supplicant.conf>/data/data/com.snda.wifilocating/wifi.confn"051052061053invoke-virtual {v2, v3}, Ljava/io/DataOutputStream;->writeBytes(Ljava/lang/String;)V复制代码/home/feng/documents/com.snda.wifilocating.apk/smali/com/snda/wifilocating/a/i.smali:1049invoke-direct {v2, v3}, Ljava/io/DataOutputStream;->(Ljava/io/OutputStream;)V10501051:const-string v3, "cat /data/misc/wifi/wpa_supplicant.conf>/data/data/com.snda.wifilocating/wifi.confn"10521053invoke-virtual {v2, v3}, Ljava/io/DataOutputStream;->writeBytes(Ljava/lang/String;)V1051行,WiFi万能钥匙不仅访问了wpa_supplicant.conf这个文件,还把其中的内容复制了出来,放到了自己的缓存文件夹里 。

推荐阅读