前言

之前在看雪看到一篇关于视频号加密逆向的文章,想着自己复现一下,学习一下wasm逆向。

又发现文中提到的WeChatVideoDownloader软件已经开始收费了。不过收费也很合理,毕竟开发和维护都是需要时间成本的。

那就自己开发一个出来,原理看雪那篇文章已经说的很明白了,而且WeChatVideoDownloadergithub现有的代码,他的解密逻辑用的也是这篇文章中的,基本没做改动。

具体原理

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目录下

注意事项:

  1. 如果是第一次使用软件,需要先退出微信,然后点击删除缓存按钮,等待删除完成。也可以手动去C:\Users\你的用户名\AppData\Roaming\Tencent\WeChat\radium\web\profiles删除目录下的所有文件,具体原因见下面的解释
  2. 点击监听后,最好只打开需要下载视频的详情页(先分享给文件传输助手打开),不要去打开列表页,不然会有很多的视频跳出来,会有意想不到的bug,这种我不去解决。
  3. 如果报毒的话,这个可以自己根据源码编译一个(应该也是报毒的),免杀也是门技术,我不会
批量下载

通过抓包来实现,其实就不太可能批量下载。只能逆向然后hook微信来实现,这个就不多说了。这个需求的人也不会太多,有需求的可以提预算我帮你做一个。

下载地址

下载有两个途径:

  1. 公众号后台回复视频号下载
  2. 用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

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐