mac 微信
前言
最近我在阅读微信数据库最新的解密方式,使用C++代码解密微信加密数据库信息!文章的时候,对破解微信数据库产生了浓厚的兴趣,所以,我编写了这篇文章记录下我对微信数据库破解的一些过程。在这里,我还特意的去了解了下文章的作者姜维发现他还写了一本关于反编译的书《Android应用安全防护和逆向分析》,对于反编译这块入门很不错,大家可以去下载看看,不过我还是支持大家去支持正版。
数据准备
首先,我们下载一个360一键ROOT,将手机成功ROOT后。进入到微信的文件目录,将沙盒里面的数据全部拷贝到本地电脑中。
- 在手机的sd卡中创建一个临时目录,用于存放微信的数据.
- 拷贝微信的沙盒数据到当前文件夹中。
- 数据准备完成
//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加解密基础过程详解,这里就默认大家知道了如何使用这个工具了,解密的主要思路就是下面三个步骤:
- 下载sqlcipher-master,将文件夹中的工具路径加入环境变量。
- 进入到微信的沙盒文件
MicroMsg/03d7ed00f0ba3136b633d9c54bae06be
文件夹下,这里需要说明下,这个文件夹是通过"mm"+uin
值通过MD5加密后获取的,微信通过这种方法方便找到对应用户的个人信息。 - 数据库密码构造,我们根据
MD5(IMEI+UIN).Substring(0, 7).toLower;
获取到我们需要解密的密钥。 - 在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去解密,去网上搜索相关文档后,发现有别人写好的项目拿来使用就解密成功了。逆向破解的关键,还是要再找到不变的因素,而且有耐心,并且要相信自己的判断,才能破解成功。
参考链接
- MAC下apktool的配置与应用
- ApkTool的jar包构建
- Android逆向之旅—静态方式破解微信获取聊天记录和通讯录信息
- 微信数据库最新解密方式,用代码解密微信数据库信息
相关阅读
社群微信小程序开发以微信为切入口,通过为用户提供便捷服务而让用户有好的体验。微信小程序自面世以来便受到不少企业与用户的关注
谈到微信朋友圈营销,好像微商遭遇滑铁卢,去年人人微商,今年朋友圈冷清了很多,不过有效做好微信朋友圈,还是商机无限的。我有个朋友家中
数据库 “数据库”是以一定方式储存在一起、能够多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。 【基本
1)微信: 零钱:一天最多转100次,单日单笔最高20W,无月限额 银行卡:受银行卡办理时的设置限制(超出时,不能更改,只能换卡)2)支付宝:
随着用户和开发者的信息推送诉求日益增长,10月12日,微信官方消息显示,微信小程序模板消息进行优化调整,将支持一次性和长期性订阅消息