这篇文章上次修改于 697 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
手机没有装插件,找了个通用的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
有加密和不加密的,cdnurl一般是不加密的,encrypturl对应的是加密的
加密对应的解密key就是这里面的aeskey,算法是aes-ecb,解密后和原始数据异或
具体算法如下:
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
最后还是需要通过com.tencent.mm.plugin.gif.MMWXGFJNI
再处理一遍
属实比较麻烦,不过接口返回了不加密的,直接下载不加密的好了
没有评论