我們知道,在微信開發者工具中開發完小程序后,我們點擊“上傳”按鈕,微信開發者工具會進行“編譯”,對 JS 代碼進行壓縮混淆以及對 wxml
、wxss
和資源文件等進行整合打包成一個 .wxapkg
文件上傳給微信服務器。
所以要“反編譯”小程序,首先我們要獲取到小程序對應的 .wxapkg
包。
之前在 V2EX 上有一篇文章 https://www.v2ex.com/t/419056
介紹了如何通過某 URL 直接下載每個小程序的 .wxapkg
,但很快被微信封了。
因此,我們只能從手機端入手,在手機上找到微信客戶端下載保存在本地的小程序包。
獲取小程序的 .wxapkg 文件
工具:一台已越獄的 iPhone
手機或者已 Root
的 Android
手機
本文以
iPhone 4S
,iOS 8.4.1
為例,微信版本v6.6.6
。
在已越獄的 iPhone
上打開 Cydia
,搜索並安裝 iFile
或者 Filza
等文件瀏覽 App
,打開 iFile
或者 Filza
,跳轉到本地 App 安裝目錄:/var/mobile/Containers/Data/Application/
,此時,你可以看到當前 iPhone
上已安裝的 App
列表,如下圖所示:

找到“微信”的目錄(我手機上對應的是:297286CE-9055-400A-99FA-D2D7C0735DCF 文件夾),點擊進入,即為微信在此 iPhone
上的“沙盒”(Sandbox
),相信 iOS
開發者對此目錄已經非常熟悉了,該目錄下主要有 Documents
、Library
和 tmp
等文件夾,通常用於存放不同的數據和文件,這里不再贅述。我們在當前微信“沙盒”目錄中搜索 wxapkg
關鍵字,即可找到當前 iPhone
中微信已下載的小程序包,如下圖:

我們發現搜索到的 .wxapkg
文件名都是以數字命名的,如圖中的 2.wxapkg
和 25.wxapkg
,它們的命名有什么規則呢?又放在哪呢?我們接着往下看。
經過簡單分析我們發現,微信下載的小程序包存放在以下目錄:
/path/to/WeiChat SandBox/Library/WechatPrivate/{UserId}/WeApp/LocalCache/release/
其中,{UserId}
為當前登錄的微信賬號 Id
的 MD5
值(32 位字符串),例如我手機上小程序包存放的完整目錄為:
/var/mobile/Containers/Data/Application/297286CE-9055-400A-99FA-D2D7C0735DCF/Library/WechatPrivate/c15d9cced65acecd30d2d6522df2f973/WeApp/LocalCache/release/
該目錄的內容如下圖所示:

目錄中有一系列以 wx...
開頭的文件夾,這些 wx...
的 18 位字符串即為每個小程序對應的 AppId
,在每個 wx...
文件夾中都放着當前小程序對應的 .wxapkg
包,它以數字命名,數字代表着當前包為開發者第幾次發布的(它與開發者在發布小程序時指定的版本號是不同的),例如我們的“知識小集”小程序一共發布了兩個版本,所以 wx48...85db
文件中存放有 2.wxapkg
文件:

另外,我們發現,在 iOS
上,微信也為每個小程序分配了一個 Sandbox
文件夾用於管理小程序在本地存儲的數據和文件,如圖:

其路徑為:
/path/to/WeiChat SandBox/Library/WechatPrivate/{UserId}/WeApp/Sandbox/wx...(小程序 AppId)
By The Way,Android
手機上小程序包的存放目錄為(需 Root 權限才能訪問):
/data/data/com.tencent.mm/MicroMsg/{UserId}/appbrand/pkg/
拷貝 .wxapkg 文件到電腦上
通過上述分析,我們可以知道到小程序的壓縮包 .wxapkg
存放在哪,接下來我們需要將手機上的 .wxapkg
文件拷貝到電腦上。
在 iPhone 上打開 Cydia
搜索並安裝 OpenSSH
后,在 iPhone > 設置 > 無線局域網
中查看你當前手機連接的 WiFi
,並記錄 IP
地址,例如我的為:192.168.1.17
,然后在你的 Mac 電腦上打開終端(與 iPhone
連接同一 WiFi
),就可以通過 SSH
登錄到你的手機上了(具體的細節詳見 Cydia
上 OpenSSH
下載頁面的使用說明):
ssh root@192.168.1.17
接下來我們就可以通過 scp
命令從 iPhone
上拷貝文件到我們的電腦上了,例如,在我的 Mac
上的命令行里執行(不需要 ssh
登錄到 iPhone
上,直接在 Mac
的終端上執行):
scp root@192.168.1.17:/var/mobile/Containers/Data/Application/297286CE-9055-400A-99FA-D2D7C0735DCF/Library/WechatPrivate/c15d9cced65acecd30d2d6522df2f973/WeApp/LocalCache/release/wx48...85db/2.wxapkg /Users/Zubin/Desktop/WeApp/
就可以把“知識小集”小程序的包 2.wxapkg
拷貝到我 Mac 桌面上的 WeApp
文件夾中了。
當然,如果你的電腦有安裝 iTool
或者 PP助手
之類的工具,當連接已越獄的 iPhone
好像可以直接訪問手機上的目錄和文件,可能就不用這么麻煩了(未驗證)。
.wxapkg 解包
上述費了很大周折我們終於拿到每個小程序的 .wxapkg
包,接下來我們可以對它進行分析了。首先 .wxapkg
文件到底是什么呢?你可能會認為它就是類似 Android 的 .apk
或者 iOS 的 .ipa
安裝包,本質上是一個 .zip
壓縮包?其實不是的!,它是一個二進制文件,實際的文件結構如下圖:

圖片取自文章 微信小程序源碼閱讀筆記,同時此文章的作者也提供了解包的腳本(各種語言的)放在了 GitHub 上:

我下載了 Python 2
的解包腳本,與 .wxapkg
文件放在一個目錄,然后在命令行里執行如下命名即可得到解包后的文件:
python unwxapkg.py 2.wxapkg
以“知識小集”小程序為例,解包后得到的文件目錄如下(已經基本與我開發“知識小集”小程序的工程目錄一致了):

每個小程序解包后的文件都大同小異,主要包含如下文件:
app-service.js
: 小程序工程中所有 JS 文件的匯總,已被混淆;app-config.json
: 小程序工程app.json
以及各個頁面的 JSON 配置文件匯總,可直接查看;page-frame.html
: 所有頁面的.wxml
和app.wxss
樣式文件的匯總,可讀性差,需要還原;*.html
: 包含每個頁面對應的.wxss
信息,可讀性較好;資源文件
: 各類圖片、音頻等資源文件
總結
本文主要介紹了如何獲取小程序的 .wxapkg
包文件,以及如何解包獲得小程序“編譯”混淆后的代碼和資源文件。在下一篇文章《微信小程序“反編譯”實戰(二):源碼還原》將介紹如何將 .wxapkg
包內內容還原為"編譯"前的內容。
您可能感興趣的: