寫個視頻號下載工具

前言

之前在看雪看到一篇關於視頻號加密逆向的文章,想着自己復現一下,學習一下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

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章