静态方式破解WX本地数据库

来源:互联网 发布:js表单验证代码大全 编辑:程序博客网 时间:2024/05/21 07:11

本文转载自静态方式破解WX本地数据库
在没有网络的时候,打开WX同样可以查看聊天记录,说明WX会把聊天记录保存到本地。这么多信息肯定会保存在数据库中,所以可以去查看databases目录。
这里写图片描述
在这里面并没有发现有用的数据,可以直接把整个沙盒数据全部导出来,然后查找db文件。
这里写图片描述
在这个目录中找到了一些db文件。
这里写图片描述
把EnMicroMsg.db导出到电脑上,直接使用SQLite Expert可视化工具进行查看。这里要注意,使用adb pull命令可能会导出失败,因为adb shell并没有root权限。解决的办法是使用cp命令先将db文件复制到sd卡,再从sd卡导出。
这里写图片描述
打开失败,这个数据库文件被加密了,其实从名字也能猜到。这也更让我们相信这个数据库存放的是非常重要的信息,而且从安全角度来说,加密操作也是很正常的。下面分析代码获取其密码,首先使用apktool反编译。
这里写图片描述
这里的命令中加上了-d参数,为了反编译之后生成的是Java文件,而不是smali文件,便于后面能够导入Eclipse中。
这里写图片描述
这里有报错,但是不用太关心,我们分析源码就可以了。在Android中如果使用数据库的话肯定会涉及SQLiteDatabase,在Eclipse中全局搜一下这个类。
这里写图片描述
代码非常多,需要等一段时间。
这里写图片描述
在samli中找到了com.tencent.kingkong.database.SQLiteDatabase类的定义。smali语法看起来还是比较费劲的,所以使用Jadx操作。这里需要注意个问题,因为WX的apk太大了,所以得分开查看。刚刚看到SQLiteDatabase类是在第一个dex中的,所以使用Jadx打开它。
这里写图片描述
这样看起来就方便很多了。这里有很多重载方法,不过最终都要调用的是这个openDatabase方法。
这里写图片描述
内部接着调用了open方法,继续跟进。
这里写图片描述
内部又调用了openInner方法,接着跟进。
这里写图片描述
调用了SQLiteConnectionPool的open方法,再跟进去。
这里写图片描述
终于找到核心的地方了,这里果然有一个密码字段,这个值就是SQLiteDatabase中的openDatabase方法的第二个参数。现在就去分析哪里调用了SQLiteDatabase的openDatabase方法,因为SQLiteDatabase的openDatabase的重载方法太多了,一个一个找很费劲,所以直接搜SQLiteDatabase被调用的地方。
这里写图片描述
这里写图片描述
这里会发现很多地方都调用了,看起来非常麻烦,所以得想个办法缩减查找范围。刚刚看到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字符串的值即可。
这里写图片描述
虽然找到了密码,但是WX是如何进行数据加密的呢?现在主流的Sqlite数据加密技术就是sqlcipher,这个加密需要用到so文件,我们去libs文件夹下查看。
这里写图片描述
这个libkkdb.so文件貌似就是操作数据库的,使用IDA打开它。
这里写图片描述
这里的sqlite操作都是在native层进行的,如果要查看数据库的话,需要用sqlcipher。输入密码之后,就可以查看数据库中的各个表格信息了。
这里写图片描述

0 0