安卓微信取证学习

你的意思是,安卓微信几年都没改加密算法?

直接端上来吧!

当前安卓端微信(8.0.66)依然采用sqlcipher v4加密数据库。加密数据库文件名EnMicroMsg.db,root之后可以pull出来,不过要怎么解密呢?

只需要uinimei即可

1. 获取uin

uin = user information,每个微信号对应一个唯一的uin。uin可以直接从prefs.xml配置文件读取。经过测试,该配置文件可能出现在不同路径,应该与手机登陆平板手机同时登录相关。

优先尝试这个路径(手机登陆)

1
/data/data/com.tencent.mm/MicroMsg/shared_prefs/system_config_prefs.xml

如果上面文件不存在,尝试这个(手机平板同时登陆)

1
/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml

两个文件虽然文件名不同,但结构一致,示例如下(已隐去隐私数据):

1
2
3
4
5
6
7
8
9
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="auth_info_prefs_use_new_ecdh" value="true" />
<int name="_auth_uin" value="0987654321" />
<boolean name="key_auth_info_prefs_created" value="true" />
<int name="key_auth_update_version" value="67****592" />
<string name="server_id">03******************3300</string>
<string name="_auth_key">0a240************(无害化处理)************6da09</string>
</map>

关键就是提取_auth_uinvalue,是一个十位的正数或负数。这里以0987654321为例,记为uin

2. 提取imei

IMEI(国际移动设备识别码),有很多获取方式:

  • 拨号*#06#
  • 设置 - 关于本机
  • 包装盒 - 入网许可

需要注意,多卡设备往往会有多个IMEI,而且微信不一定真的能获取到IMEI,所以请优先采用以下方法,直接读取微信缓存的IMEI值

尝试提取/data/data/com.tencent.mm/files/KeyInfo.bin,参考其他师傅博客可知,该文件内是RC4流加密的IMEI,密钥为 _wEcHAT_ 。那好,厨子一拖就出来了

厨子

结果发现,微信实际上使用一个占位符,1234567890ABCDEF 。推测高版本安卓限制,导致用户应用无法读取IMEI,恰巧微信也没改它的加密算法。

所以没必要真去提取IMEI,优先尝试 1234567890ABCDEF 这个占位符。

3. 计算密钥

微信使用的算法非常简单,有一些公式直接套:

  • 数据库路径

    1
    "/data/data/com.tencent.mm/MicroMsg/" + md5("mm" + uin) + "/EnMicroMsg.db"
  • 数据库密钥

    1
    md5(imei+uin)[:7]

    举个例子,如果uin-1145141919imei1234567890ABCDEF,那么先拼接得到1234567890ABCDEF-1145141919 负号不要漏下),然后进行一次md5计算,得到103208bd42aef57359c7c901ba4552cc,那么密钥就是前7️⃣位,即103208b

4. 解密数据库

sqlcipher v4,具体配置是,参考这个

1
_pragma_cipher_compatibility=1

啊,也就是默认配置,可以直接使用 ForensicsTool 一键解密:

ForensicsTool

拿到解密后的数据库,聊天记录在message表里:
message

参考文献:

  1. https://www.cnblogs.com/WXjzc/p/18432038
  2. ForensicsTool
  3. chatlog