写个视频号下载工具
前言
之前在看雪看到一篇关于视频号加密逆向的文章,想着自己复现一下,学习一下wasm逆向。
又发现文中提到的WeChatVideoDownloader
软件已经开始收费了。不过收费也很合理,毕竟开发和维护都是需要时间成本的。
那就自己开发一个出来,原理看雪那篇文章已经说的很明白了,而且WeChatVideoDownloader
github现有的代码,他的解密逻辑用的也是这篇文章中的,基本没做改动。
具体原理
WeChatVideoDownloader
这个是使用electron开发的桌面程序,然后用代理来拦截视频的地址和解密需要的seed(decode_key),然后在electron调用解密的js来解密。
electron过于臃肿,加上我也不太熟悉,我从另一个项目(https://github.com/xuncv/WechatVideoSniffer
) 看到了更好的实现方法:aardio+ fiddlecore
,这个方法打包的exe才几兆的大小。
这个工具的缺点在于无法跨平台,也就是只能在Windows下使用。我也没有Mac,对我来说不算是缺点。
实现的代码和上面两个项目基本类似,只需要增加解密的代码。逆向的过程我稍微说一下我的见解,相同的部分就不多赘述了。对代码感兴趣的可以自己看下面github开源的代码。
用aardio写完后打包后的软件只有4M,如果用upx压缩一下,可能就2M,不过upx压缩后的软件容易报毒,我一般自己用的话才会压缩。
使用方法
软件界面如下(中间是文本框,用来输出拦截到的信息):
先点击监听(第一次会提示安装证书),然后打开一个视频,就能在文本框看到监听到的下载链接和弹出的下载进度条。删除了下载按钮,只要拦截到就会自动下载到当前软件的cache
目录下
注意事项:
- 如果是第一次使用软件,需要先退出微信,然后点击
删除缓存
按钮,等待删除完成。也可以手动去C:\Users\你的用户名\AppData\Roaming\Tencent\WeChat\radium\web\profiles
删除目录下的所有文件,具体原因见下面的解释 - 点击监听后,最好只打开需要下载视频的详情页(先分享给文件传输助手打开),不要去打开列表页,不然会有很多的视频跳出来,会有意想不到的bug,这种我不去解决。
- 如果报毒的话,这个可以自己根据源码编译一个(应该也是报毒的),免杀也是门技术,我不会
批量下载
通过抓包来实现,其实就不太可能批量下载。只能逆向然后hook微信来实现,这个就不多说了。这个需求的人也不会太多,有需求的可以提预算我帮你做一个。
下载地址
下载有两个途径:
- 公众号后台回复
视频号下载
- 用github的源码自己编译一个。
逆向
微信浏览器F12
逆向首先需要一个能打开微信浏览器F12的工具,抓包工具只能静态分析js,在缺乏动态调试的环境下虽然可能能猜出来加密逻辑(微信的js没做混淆),但是流程不够清晰。
打开F12方法:文章是通过找到跳转的分支,然后修改跳转来实现。我看了下跳转分支的代码,它其实就是在启动浏览器的时候多加了个启动参数,所以我们可以直接hook CreateProcess
,给浏览器的启动参数增加一个调试参数就能实现。这样的话更通用些,不需要关心浏览器和微信的版本,我测试了下,在最新的3.9.9也是可以用的。
其实小程序的F12也是类似的逻辑,有兴趣的可以自己hook日志看看。
打包了个工具给大家免费用,需要的在公众号后台回复微信浏览器
。
分析
WeChatVideoDownloader
是用electron开发的,可以执行js环境,自然就能加载wasm。那还得搜一下aardio怎么执行js来做解密数组的生成。
但是我突然一想 为啥要自己生成解密数组,既然seed是通过hook拿到再传给electron客户端解密,我直接hook拿到解密需要的数组传给aardio不是更方便,还省了js环境。其实最开始开始想的是直接拿到解密后的视频,调试发现视频是分段下载和解密的,那不如拿解密数组。
根据文章已经分析的结果(解密需要的数组就是p.decryptor_array
),我也可以不去分析wasm里面具体什么逻辑,hook这个位置将它传给aardio就完成了。
测试了下实现并不麻烦,不过拿不到标题和链接。链接可以通过代理拦截到,标题的话应该只能hook,想了想没有标题也不碍事,自己重命名一下的事。
Wasm
wasm之前也没接触过,所以我还是继续往下研究,接着我在node环境中测试,甚至都不需要补环境,把调用wasm的那个js放到node里执行,就能计算出decryptor_array
。
估计ida打开也就能获取文章中提到的一些东西,那还是下次看到个复杂的wasm再研究。
这样的话用aardio加载webview来实现一个解密数组生成应该也不难,这里我就不写了,有兴趣的可以自己实现。
webview可以使用edge来做(aardio中有范例),因为系统基本都自带edge,所有实现生成的exe也不会太大。
拦截不到
刚开始拦截不到js,在Devtools里也没看到js的加载,想了想应该是因为缓存,没有从网络请求,勾选Disable cache
后,确实就拦截正常了。
但是这在aardio中勾选不了这个选项,总不能要求用软件的人下载视频前都先打开一遍F12勾选,这不太现实。看了下WeChatVideoDownloader
的issue里,有人找到了微信浏览器的缓存目录,直接删除这个目录也可以实现。
我就在界面增加了一个按钮用来删除这个目录,不需要手动到这个目录去删除了,应该是需要管理员权限的,删除失败的话退出以管理员权限在运行一遍。
代码地址
https://github.com/kanadeblisst00/WechatVideoSniffer
本文由博客一文多发平台 OpenWrite 发布!