[ 实践 ] 将安卓微信聊天记录导出为可读格式的一些记录

 现在大部分人都在用微信进行通信,微信官方宣称服务器不会存储用户的聊天信息,那好,微信的聊天记录存储在哪里?以什么方式进行存储的?

 网上查证,微信的聊天记录是在/data/data/com.tecent.mm/MicroMsg目录下的一个md5值命名的文件夹下,其中的EnMicroMsg.db文件是通讯信息的数据库文件。我们现在需要拿到这个EnMicroMsg.db文件,因为文件在系统文件夹/data下,而访问这个文件夹必须需要root。如果不想root,可以尝试通过PC版微信创建备份,然后使用夜神模拟器登录微信,把备份文件恢复到模拟器的微信中,模拟器还能自己设置IMEI,方便得很。

 我们用尽手段拿到了数据库文件,EnMicroMsg.db的解密的文章在网上已经有不计其数了,我们只要照猫画虎,按照诸位博主的文章去做基本都能成功。笔者在网上查找资料时,发现一位博主的博客讲的非常鞭辟入里:Android逆向之旅—静态方式破解微信获取聊天记录和通讯录信息,这篇文章从逆向工程的角度,分享了了破解前的假设、验证、apk反编译和反编译代码的分析和推敲等经验,非常值得学习。

 我们从上文的文章中得到了数据库密码的加密方式,拿到数据库的密码了,接下来就是解密数据库—使用sqlcipher,这个是sqlite数据库加密的惯用手段。要想使用该工具,有三条路可以走:一、自己编译源码(我在WSL下编译了好一阵子都是ERROR,报了很多语法错误,放弃了),代码在这:https://github.com/sqlcipher/sqlcipher,问题总结这篇博文写得不错:https://blog.csdn.net/gllg1314/article/details/79005801;二、linux下的sudo apt-get install sqlcipher即可安装(我使用的方式);三、我百度网盘有编译好的windows可执行文件:https://pan.baidu.com/s/1RlwOZRlOHP7hcCxhfEgzmg 提取码: v4nr。

 打开数据库文件后,我们只要把数据库文件导出为sql,然后使用普通的sqlite数据库浏览器导入SQL文件就行或者使用sqlite本身带有的.import命令(我使用的是这个: https://pan.baidu.com/s/18Ilyb8YOA24UwvTmtUxWXA 提取码: 5fxx)。对于这份数据库,我们重点需要关注两个表:

rcontract:联系人的表,这个表里包含着公众号、服务号、好友、群里的陌生人,如果我们单纯需要好友,需要查找满足:username的前缀为wxid_且type=3的行。重点区分alias和username:alias貌似是自己创建微信时设置的微信号(我在6年前创建是可以设置的),alias可能为空;username是微信系统给你分配的,必不为空。

message:消息的表,通过talkerId来判断双方处于同一会话。

 受到上文那位博主的启发,我研究了安卓的反编译,我使用了apktool 2.2.0,对weixin.apk执行下面命令:

java -jar apktool-2.2.0.jar d -d weixin.apk -o outDir

 执行之后我发现生成的文件全是smali后缀的文件,打开发现跟字节码其实并无二致。为了解读这种文件,我搜索到了smali2java,这个工具确实可以转换,而且可以拉下github代码自己修改源码,相当灵活。但是,我现在不想研究smali2java的原理,只想要一个稳定强大的工具,但是smali2java貌似不符合要求。

 在搜索apk反编译时,搜素到dex2jar这个工具,能将dalvik虚拟机字节码转成jar,而且了解到,apk文件本身只是一个以*.apk作为后缀的压缩包,使用压缩软件解压出来就行,我们只要使用dex2java对解压出来的*.dex文件进行转换就行。

 转换出jar文件了,接下来需要怎么操作呢?jar文件是class文件的归档,我们需要能反编译class文件的,有两种选择—jd-guibytecode-viewer,我在使用过程中,发现jd-gui导出Java代码时会卡住,而且使用jd-gui阅读如此大型的源码可不是一个好的选择。我又尝试了使用bytecode-viewer这个很好用,功能相对比较强大,可以直接导入*.dex/*.apk/*.class文件进行反编译并导出为Java代码,有多种反编译引擎可供选择,可以说是相当强大的一个Java反编译工具了。

 上面就是大概的反编译一个apk安装包的过程,当然这都是相对比较简单的操作,比较难的部分都是源代码的分析和推测。但是,由于反编译出来的代码都不是人看的,变量名和类名都是代码混淆过的,阅读会引起极度不适,要做好打持久战的准备。

 代码混淆虽然存在,但是我们知道常量是不可能被混淆的,所以我们只要在项目下搜索"EnMicroMsg.db"或者部分字符串,是很容易定位到函数调用的位置的,剩下的操作只能依靠经验和毅力了,看上文博主分析的过程非常具有启发意义,建议学习。

安卓反编译工具下载链接如下:链接: https://pan.baidu.com/s/14PZy0Z__fcFyDw0yxyDrsQ 提取码: n785。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页