Android破解微信获取聊天记录和通讯录信息(静态方式)


本文整理自网络,侵删。

一、猜想数据存放路径

微信现在是老少皆宜,大街小巷都在使用,已经替代了传统的短信聊天方式了,只要涉及到聊天就肯定有隐私消息,那么本文就来讲解如何获取微信的聊天记录以及通讯录信息。

首先我们在没有网络的时候,打开微信同样可以查看聊天记录,说明微信会把聊天记录保存到本地,那么这么多信息肯定会保存在数据库中,所以我们可以去查看微信的databases目录看看内容:

可惜的是,我们在这个里面并没有发现一些有用的数据,所以这时候就了解到了微信因为把重要信息的数据库存在其他目录下面,我们可以直接把微信的整个沙盒数据全部导出来,然后查找db文件:

在这个目录中找到了一些db文件:

看到这个目录下有很多db文件,我们可以一个一个进行查看,这里可以直接使用SQLite Expert可视化工具进行查看:

可惜的是,这里打开失败了,看到提示消息应该了解了,这个数据库文件被加密了。这也更让我们相信这个数据库存放的是非常重要的信息,而且从安全角度来说,加密操作也是很正常的。

二、静态方式破解微信分析

好了到这里,看来得去看代码了,因为数据库加密了,既然是加密肯定有解密的过程,我们去分析代码获取其密码即可。

首先我们可以使用apktool工具进行反编译,这里不演示了,微信本身没有加固操作,所以反编译没有报错的:

注意:

这里的命令中加上了-d的参数了,是为了反编译之后生成的是java文件,而不是smali文件。便于后面能够导入Eclipse中

反编译之后,接下来咋们就开始把文件导入Eclipse中,关于如何导入的话,这里不介绍了,不了解的同学可以转战这里:Eclipse中动态调试smali源码 我们成功导入之后:

这里看到有些报错,但是这个不用太关心,我们分析源码就可以了,其实到这里有的同学可能想到的是速度调试:

借助之前说到的mprop工具来修改系统的调试属性ro.debuggable属性值,不了解这个工具的同学可以看这篇文章:如何脱掉360加固的壳 ,如果不想用这个工具就有点费事了,修改反编译之后的AndroidManifest.xml中打开调试属性,然后在回编译,不过可惜的是,在这个过程中我尝试过失败了几次,所以我最后采用了mprop工具来进行操作的。修改系统调试属性之后可以看到:

微信出于debug模式了,我们这时候只要按照之前说到的Eclipse中动态调试samli源码的步骤来即可。但是这里有一个问题,就是在调试的过程中会被卡死的,我尝试了很多次结果都失败了,所以这里就放弃了动态方式破解微信了,而是采用静态方式去破解微信获取密码。

三、破解步骤

之前在说到使用静态方式破解的时候第一点,一定要找到关键点,我们现在的问题是知道了数据库,但是这个是加密的,我们需要密码,那么在Android中如果使用数据库的话,肯定会涉及到一个类:SQLiteDatabase,我们可以在Eclipse中先去全局搜一下这个类:

因为微信工程代码非常大,所以在搜索的过程中需要等一段时间:

在samli中找到了com.tencent.kingkong.database.SQLiteDatabase类的定义了,因为smali语法看起来还是比较费劲的,所以我们使用Jadx工具进行可视化操作,之前一篇文章中介绍了:Android中反编译利器分析 这里讲解了apktool和jadx工具的原理,为什么说jadx好用呢?主要是他是开源的,而且用Java编写的,同时还支持方法的跟踪,这个对于混淆代码的跟踪非常有用。

这里需要注意个问题,因为微信的apk太大了,所以得分开查看,因为微信有多个dex文件,而刚刚看到SQLiteDatabase类是在第一个dex中的,我们使用jadx查看第一个dex文件即可:

这样看起来就方便很多了,我们找到这个类,首先肯定看看他的openDatabase方法,不过这里会发现有很多重载方法,不过最终都要调用的是这个openDatabase方法:

内部接着调用了open方法,继续跟进:

内部又调用了openInner方法,接着跟进:

调用了SQLiteConnectionPool的open方法,再跟进去:

哈哈,终于找到核心的地方了,这里看到果然有一个密码的字段,那么这个值就是SQLiteDatabase中的openDatabase方法的第二个参数,那么现在我们就去分析哪里调用了SQLiteDatabase的openDatabase方法,因为SQLiteDatabase的openDatabase的重载方法太多了,所以一个一个找很费劲,所以可以直接搜SQLiteDatabase被调用的地方,可以直接使用Jadx的查找跟踪功能:

查找结果:

这里会发现,很多地方都调用了,看起来非常麻烦,所以这里得想个办法缩减查找范围,我们刚刚看到SQLiteDatabase类中的open方法都是static的,所以在调用的时候肯定是这么使用的:Lcom/tencent/kingkong/database/SQLiteDatabase; 这个是标准的smali语法调用形式,所以这时候我们在去Eclipse中全局搜索这个字符串内容:

最终看到在com.tencent.mm.bb.e这个类中,有多个地方都调用了,咋们再去看看这个类:

果然在d方法中调用了数据库的open方法,而且传入的str2就是密码,在跟踪d方法在哪里被调用了:

点击进入查看:

这里的this.Ee就是密码,看他的赋值,是先调用j方法构造一个字符串出来,然后取前7个字符即可,再看看j方法:

这个方法看起来就眼熟了,计算字符串的MD5值的,这里需要注意的是,MD5的值是小写的,好了,到这里我们就了解了:密码其实是一个字符串的MD5值的前7位字符串,那么接下来的问题在继续跟踪是哪个字符串来计算MD5的:

在继续跟踪a方法在哪里被调用了:

找到之后点击进入:

继续查找这个a方法又在哪里被调用了,这里调用的比较深,所以需要多次进行查找跟踪,耐心点即可:

最终到了这个类的方法中,我们看到,mY值是通过mY方法获取的,j2值是上面的i值转化过来的:

查看mY方法的实现,很简单,获取设备的IMEI值,而i值在前面进行赋值了:

看到了,是一个uin值,再看看这个uin值在哪里进行赋值操作的:

看到这里就放心了,原来这个uin值存放在SharedPreferences中的,那么就简单了,我们在开始的时候把沙盒数据全部导出来了,可以全局搜一下uin字符串的值:

哈哈,在这里找到了这个值。

总结:

到这里我们就分析完了微信中数据库加密的密码获取流程了,下面来总结一下:

1、首先我们全局查找SQLiteDatabase类,因为这个类是操作数据库的核心类,他是突破口。

2、找到这个类的定义之后,再次查看他的open系列方法,因为要操作数据库肯定有open之类的方法。

3、再去全局查找SQLiteDatabase的open方法的调用地方,这里调用的地方比较多,所以大家需要耐心的查找,而且为了缩小查找范围,我们可以根据smali语法调用格式的字符串内容来进行查找。

4、找到了这个方法的被盗用的地方,下面就开始一步一步的往下跟踪,到了一个核心的方法中了解到了,密码是一个字符串计算MD5之后取前7个字符串的值。

5、继续跟踪,找到这个被计算MD5的字符串内容,最后跟踪到这个字符串其实是设备的IMEI加上用户的uin值,而这个uin值是保存在SharedPreferences中的。

阅读剩余部分

相关阅读 >>

golanggorm框架数据库的连接操作示例

android基于Sqlite实现注册和登录功能

Sqlite教程(六):表达式详解

sql在一个表中添加字段并添加备注的方法

c#操作Sqlite数据库之读写数据库的方法

python执行数据库的查询操作实例讲解

Sqlite优化方法

nginx可视化配置工具nginxwebui的使用

go语言库系列之dotsql详解

Sqlite教程(十一):临时文件

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...