这篇文章上次修改于 580 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

手机没有装插件,找了个通用的hook点,用frida去获取信息

  • com.tencent.mm.sdk.platformtools.XmlParser.parseXml

objection一把梭,然后重新转发下gif,就能得到信息了

android hooking watch class_method com.tencent.mm.sdk.platformtools.XmlParser.parseXml --dump-args

2022-12-26T01:58:16.png

有加密和不加密的,cdnurl一般是不加密的,encrypturl对应的是加密的

加密对应的解密key就是这里面的aeskey,算法是aes-ecb,解密后和原始数据异或

2022-12-26T01:59:23.png

具体算法如下:

from pathlib import Path
from Crypto.Cipher import AES
from Crypto.Util import Padding

key = bytes.fromhex('c7bcc1e3f45e400e5f7c8662674c85be')
gif_path = Path(r'stodownload_enc.gif')
data = gif_path.read_bytes()

data = Padding.pad(data, 16)

cipher = AES.new(key, AES.MODE_ECB)

clear_buf = bytearray(cipher.decrypt(data))
for index, xor_key in enumerate(clear_buf):
    if index < 16:
        clear_buf[index] ^= key[index]
    else:
        clear_buf[index] ^= data[index - 16]

gif_path.with_name("dec.gif").write_bytes(clear_buf)

不过很可惜的是,这样解密出来可能还不是最终gif,可以看到文件头是wxgf

2022-12-26T02:21:42.png

最后还是需要通过com.tencent.mm.plugin.gif.MMWXGFJNI再处理一遍

属实比较麻烦,不过接口返回了不加密的,直接下载不加密的好了