聊一下微信视频号视频加密逆向。起初我下载回来的视频文件怎么看都不对劲——播放器报错,用十六进制编辑器打开文件头,发现并没有标准MP4的 ftyp 标识,开头几十个字节像随机数据。
正常MP4文件头:
00000000: 6674 7970 6973 6f6d 0000 0200 6973 6f6d ftypisom....isom
00000010: 6973 6f32 6176 6331 6d70 3431 0000 0000 iso2avc1mp41....
而从视频号拿到的文件头长这样:
00000000: 8a37 d2c5 144a 9e8b 7f62 e3f1 2b1c 5d9a .7...J...b..+.].
00000010: a4e1 76ff 883b 21cc 554e 0a77 9f28 3b1d ..v..;!.UN.w.(;.
既然网页上播放正常,那解密肯定在浏览器里完成。我在开发者工具中追踪网络请求,找到了负责下载视频的请求,然后在回调处理函数里下断点。最后发现一个简单的函数 M:
function M(data, startIndex) {
if (startIndex < decryptor_array.length) {
data[startIndex] ^= decryptor_array[startIndex];
}
}
它就是一个逐字节异或解密,解密密钥放在 decryptor_array 里。而这个数组来自一个 WebAssembly 模块,这意味着我们得去逆向那个 wasm 才能生成同样的密钥。

