| 关键词: 加密 工具 数据库 文件 Sqlcipher 代码 UIN 密码 就是 分析 |
合理利用技术,切勿违法犯罪! 进入到微信的文件目录,将沙盒里面的数据全部拷贝到本地电脑中。
//mk mkdir /storage/A1AE-1701/tmp/a_wechat/MicroMsg //copy cp -r /data/data/com.tencent.mm/MicroMsg/. ./ //pull adb pull /storage/A1AE-1701/tmp/a_wechat/ /Users/martin/Downloads/wechat/MicroMsg
![]() 数据库破解 工具准备 数据准备完成后,我们来分析文件夹。发现在/data/data/com.tencent.mm/MicroMsg/03d7ed00f0ba3136b633d9c54bae06be的路径下有这连个数据库名字有点可疑,我们可以导出来看看。 ![]() 我们可以使用SQLPro(提取码: zk7u)进行查看。使用工具无法打开,因为加密了。所以我们接下来就尝试从源码中查找加密的技术细节。首先我们来找到微信的下载APK软件,这里我们使用的是微信的目前最新版本6.7.3。有了APK文件以后,我们就需要使用反编译工具来进行反编译了。 JADX工具找代码 因为在jadx工具是可视化工具,解压Apk(注:这里的APK文件也可以改为zip个时候解压)后的dex文件反编译为Java文件进行可视化的搜索。我们只需要将apk压缩包解压后,将xxx.dex文件拖入工具中即可。 ![]() 下面展示下JADX搜索的功能。 ![]() 有了这个工具,我们就可以开始分析代码了。 逆向分析 静态代码分析 之前看了文章微信数据库最新的解密方式,使用C++代码解密微信加密数据库信息!说到: 微信数据库加密的密码很简单就是:MD5(IMEI+UIN).Substring(0, 7).toLower;设备的imei和微信登录账号后的唯一表示uin值拼接然后计算MD5值,取前7位在变成小写字母即可。 接下来,我们只需要验证下当前版本的加密有没有变化即可。大部分步骤我都是参考上面文章来的,首先,我们找到包com.tencent.mm.a.g类,这个包下是一些MD5的加密算法。 ![]() 查看下哪些地方调用了MD5的加密算法,有一个地方比较可疑。 接下来就查看下key传递到什么地方了。 ![]() 在这里我受到了阻碍,可能是微信团队,针对反编译工具把这里进行了一些另外的操作,重要的代码块不能反编译了。不过我们可以从上面的this.key = g.o((str4 + j).getBytes()).substring(0, 7);来查找,如果str和j两个参数,是imei和uin的话,那么就可以证明,微信的算法确实不会变的, 我们在com.tencent.mm.cf.h包下,找到了看到了下面的代码段,在这里插入图片描述 ![]() 继续查找引用, 发现他的包名名称很可疑,感觉应该快找到了。 ![]() 在这里,我们已经确认,前面要找的str4就是我们的IMEI号,前面分析了MD5加密是通过a方法的两个参数来共同加密的。 ![]() 我们来看下a参数,先找到a的赋值。 ![]() ![]() 就是获取类的的成员变量uin,所以,此时,我们就需要将查看赋值情况。 ![]() 上面的代码就可以看出,文件是赋值在我们的SharedPreferences中的,通过adb命令查看一下system_config_prefs.xml文件的内容。 ![]() 上面的default_uin就是我们要找的uin值了,这里需要注意下uin值是会动态改变的,在登陆状态下才会将当前用户的uin值设置进去,另外一种查找uin方法的,我们可以去auth_info_key_prefs.xm的_auth_uin获取,大家cat命令查看就好,这里记录的就是当前用户的uin值并且是不会随登陆状态改变的。 实现解密 上面我们静态分析代码,知道了微信数据库加密的密码很简单就是:MD5(IMEI+UIN).Substring(0, 7).toLower;。接下来,我们来看下腾讯的Github仓库,可以找到这么一款开源的加密工具,那么我们就不难猜出,腾讯肯定是使用了Sqlcipher工具来对数据库进行加密工作。 下面我们就需要在Mac上搭建Sqlcipher数据库工具对数据库进行解密操作,如果对Sqlcipher不了解的可以看一下我写的这篇文章Mac终端使用Sqlcipher加解密基础过程详解,这里就默认大家知道了如何使用这个工具了,解密的主要思路就是下面三个步骤:
下面我重点来说一下数据库密码的构造。 数据库密码的构造 首先获取设备的IMEI,可以直接拨打:*#06#查看;然后根据上面获取的uin值,取SharedPreferences中的值即可,然后拼接到一起,用txt文件档保存一下,在使用HashTab工具进行查看属性即可得到MD5的值,如果这里不想使用工具的情况,我这里也有自己编写的Java代码。 ![]() 上面的前7位就是我的密码了f73982,现在我们开始解密操作。 sqlite> .open EnMicroMsg.db sqlite> pragma key=f73982; sqlite> pragma cipher_use_hmac=off; sqlite> pragma cipher_page_size=1024; sqlite> pragma kdf_iter=4000; sqlite> SELECT count(*) FROM chatroom; Error: file is not a database
使用Mac终端遇见的转码问题解密失败 在这里可能大家就很疑惑,为什么解密失败,我猜测可能是Mac终端的编码的问题,转换为密码后和Android中的SDK的加密密码不一致导致的,毕竟是两个不同的平台,出现转码问题也很正常,在这里我就放弃了使用Mac的去解密我数据库了,毕竟我对Mac不是很熟悉,暂时不去研究,如果有读者知道如何去修改这个问题,请告知我下,谢谢。 使用AndroidSDK解密 改用编写Android应用去实现我的解密过程。在这里我使用了别人的项目地址fork到了我自己的Github上WxDatabaseDecryptKey大家可以直接去下载,下载好项目的依赖库后,运行就没问题了。下面是一张破解后的结果的打印日志。 使用windows软件解密 我无意间有找了一个解密工具《sqlcipher.exe windows客户端》,发现是可以解密的。 解密过程的心得分享 在解密过程中我大概花费了4-5天的时间,我还是遇见了很多坑的,就比如我搭建了Mac的Sqlcipher,但是并没有解密成功,我一度猜测是不是解密方式变了,于是还是回去再仔细分析微信的源码,发现不会变。后来我就猜想,既然是Android去加密的,那么就用Android的SDK去解密,去逆向破解的关键,还是要再找到不变的因素,而且有耐心,并且要相信自己的判断,才能破解成功。 |
| 本文出处: https://www.toutiao.com/a6676088829683696141/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|