最近沉迷工作 本来的计划只能咕咕咕了
总结一个最近完成得一个工程:破解微信本地数据库
虽然是个很简单的项目,不过我毕竟年后才转行嘛
破解流程总结
1、猜想信息是保存在本地数据库
想得到聊天记录和通讯录信息,我们的想法是这些信息在设备没有连接网络的时候也是可以查看的,所以我们猜想这些信息是保存在本地的数据库中的。
2、使用sqlite工具查看信息报错
我们把微信的沙盒数据全部导出到本地,然后查找db文件,找到了EnMicroMsg.db文件,使用sqlite expert工具进行查看报错,提示数据库被加密了。
3、根据数据库的常规使用流程找到入口
我们在Android中使用数据库的时候都会用到SQLiteDatabase类,所以可以全局搜索这个类,找到这个类的定义,然后再找到他的一些open方法,看看这些方法的调用地方。
4、通过数据库的入口方法进行代码跟踪
知道了open系列方法的调用地方,就开始使用Jadx工具进行代码跟踪,最后跟踪到了有利信息,就是密码是用户设备的IMEI+uin值计算MD5值,注意是小写字符,然后在取MD5的前7位字符构成的密码。
5、获取密码流程
这里知道了密码的构成,获取就比较简单了,使用*#06#拨号直接获取IMEI值,然后在去查看SharedPreferences中的auth_info_key_prefs.xml文件中的_auth_uin值就是用户的uin值,然后进行拼接,使用HashTab计算出MD5值,获取前7位字符串。
6、使用sqlcipher工具查看数据库
得到密码之后,使用sqlcipher工具进行数据库的查看,可以找到通讯录表格recontact和聊天记录表格message。
概要:
微信的核心数据库是EnMicroMsg.db,但是是加密操作的,而加密的密码是设备的IMEI+用户的UIN值(在SP中保存了),计算MD5(字符是小写),取出前7位字符即可。
延展
1、微信数据库为何要加密
微信的通讯录信息和聊天记录信息对于一个用户来说是非常重要的隐私,所以这也是微信对数据库进行加密的原因,但是不管最后怎么加密,都会需要解密的,所以这就是我们破解的关键,只要解密操作在本地进行,密码肯定能够获取到。
2、微信数据库密码构造算法不会更改
关于微信的这个密码获取的规则不会发生改变的,有的同学会想微信会改掉数据库加密的密码获取算法吗?答案是不会的,原因很简单,如果密码算法改了,就会影响到老用户,比如新版本中密码改了,老用户更新之后,在读取数据库的时候进行解密,那么加密的数据库是老的,新的加密算法是解密失败的,这个用户体验会疯的,那有的同学又说了,对数据库进行升级处理,但是这里的升级一定要保证老的数据不能丢失,那么这里就存在一个老数据迁移的工作,这个工作是巨大的,因为现在很多微信使用的过程中如果不去主动的清除数据,聊天信息非常多,那个数据库也会非常的大,几十M很正常的,那么在数据迁移的时候风险是非常巨大的,所以这样一来,微信短期内是不会改变密码算法规则的,其实我已经尝试了很多老版本的反编译,发现的确这个算法一直都是这样的。所以一定要记住微信的数据库加密算法是:MD5(IMEI+UNI)=>前7位字符。
用途
1、如果你想看周边的人微信信息,那么这里就是给你提供了最好的方案,特别是你最爱的人,比如媳妇总是不让你看她微信,但是自己又很想看,那么机会来了。
2、对于root之后的设备可以在后台窃取用户的微信信息把imei一起上传到服务端,然后在人工分析获取聊天记录中重要信息。
3、有时候我们手误在聊天列表中把消息删除了,这时候想在找回来就可以导出数据库使用sqlcipher查看信息即可。