上面虽然找到了密码,但是我们知道是如何进行数据加密的呢?这里就要借助经验了,因为现在主流的Sqlite数据加密技术就是sqlitecipher,不了解的同学可以去看看,这个数据库加密需要用到so文件,我们去微信的libs下面查看:
这里没有找到那个sqlitecipher.so文件,但是我们看到了这个libkkdb.so文件,他貌似就是操作数据库的,使用IDA打开进行查看内容:
看到了,这里的的sqlite操作都是在native层进行的,所以我们如果要查看数据库的话,需要用sqlcipher软件来进行查看,这个软件网上的下载地址很多,专门用来查看sqlitecipher加密的数据库信息的。
四、数据库密码构造
首先获取设备的IMEI,可以直接拨打:*#06#即可查看;然后查看他的uin值,直接读取SharedPreferences中的值即可,然后拼接到一起,用txt文件档保存一下,在使用HashTab工具进行查看属性即可得到MD5的值,关于HashTab工具:
这个工具还是很有用的,可以很方便的右键文件属性,即可查看文件的MD5值了:
这里看到前七位就是:748B34D,注意字符小写=》748b34d:
输入密码之后,就可以查看数据库中的各个表格信息了:
可以发现这个数据库中存了很多表格内容,但是这里我们最关心的就是通讯录信息表和聊天记录表:
看到了,聊天记录表格是message,通讯录表格是recontact:
而且这里有一个好玩的东东,就是你以前删除的好友,都会存在的,这个是微信会把你的通讯录保存到服务端,及时你本地删除了联系人,但是服务端并不会删除,所以如果你想找到你以前删除的好友,可以在次查找重新加上好友。
概要总结:
到这里我们就用静态方式去破解微信,知道了数据库加密的密码,然后看到他是使用的主流的数据库加密框架:sqlitecipher,而且现在很多app都用这个框架,比如一些小说类的app,这里就不指定说是谁了,我之前反编译过几个小说类的app,有两个都是用的这个框架进行加密的。
五、破解流程总结
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个字符。
3、这里为什么使用静态方式去分析呢?原因是微信的包太大了,如果动态调试的话总是出现死机情况,没办法后续操作了,所以使用了静态方式去破解。
七、安全性
通过本文之后,大家应该都知道如何破解微信的聊天记录信息和通讯录信息了,只要获取到加密的数据库,得到密码即可,但是这两步却不是那么容易获取的,首先如何获取加密的数据库,这些信息都是保存在微信的沙盒数据中的,所以得设备root之后获取,设备的imei信息就简单了,那么问题就来了,如果一个用户的设备root了,那么恶意程序就可以开始盗取信息了。而且在之前的一篇文章中:Android中allowBackup属性引发的安全问题 介绍了微信在5.1之前的版本allowBackup属性默认值是true,也就是说没有root的情况下,可以获取到微信的沙盒数据,那么这个安全性就太暴露了。现在也有很多微信通讯录备份的工具,其实就是把这个数据库信息同步一下。以后只要有了微信的这个数据库,那么破解也是很简单的,因为密码是规定的。
八、用途
1、如果你想看周边的人微信信息,那么这里就是给你提供了最好的方案,特别是你最爱的人,比如媳妇总是不让你看她微信,但是自己又很想看,那么机会来了。
2、对于root之后的设备可以在后台窃取用户的微信信息把imei一起上传到服务端,然后在人工分析获取聊天记录中重要信息。
3、当我们的设备中误删除了聊天记录,这时候可以通过导出本地数据库,然后使用sqlcipher工具进行查看既可以找到之前数据
本文的重点和意图是:如何使用静态方式破解apk的思路,而对于微信来说,这个不算是漏洞也不算是问题,因为我们上面介绍中涉及到的数据都是微信的沙盒中的,所以一般情况下是无法获取到的,所以对于攻击者来说没有太多的意义。所以本文的意图很简单就是讲解静态方式破解apk的一种思路。
九、总结
上面分析了微信数据库的加密操作的原因,以及数据库的密码构造算法,同时也分析了,这个算法短期内是不可能更改的,从安全性来说,对于新版本的微信,如果设备root了,那么对恶意程序来说就有了盗取的入口,而微信中的聊天记录信息相当于用户的隐私,同时会涉及到一些利益相关的,所以微信今后对这个数据库操作希望能够尽快的进行改善操作。
标签:SQLite
相关阅读 >>
Sqlitestudio打开后如何切换成简体中文Sqlitestudio绿色版中文设置方法介绍
c#中efcore-shardingcore呈现“完美”分表
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。