微信小程序「反編譯」實戰(一):解包

本實踐教程將一步步告訴你如何「反編譯」得到其它小程序的源代碼,包括「解包」和「源碼還原」兩篇,主要參考了看雪論壇、V2EX、GitHub 等網站上的帖子、教程、工具,在此不勝感激,參考連接詳見文章底部,以及加上了我本身的一些理解和總結。php

知識小集是一個團隊公衆號,每週都會有原創文章分享,咱們的文章都會在公衆號首發。歡迎關注查看更多內容。html

咱們知道,在微信開發者工具中開發完小程序後,咱們點擊「上傳」按鈕,微信開發者工具會進行「編譯」,對 JS 代碼進行壓縮混淆以及對 wxmlwxss 和資源文件等進行整合打包成一個 .wxapkg 文件上傳給微信服務器。python

因此要「反編譯」小程序,首先咱們要獲取到小程序對應的 .wxapkg 包。git

以前在 V2EX 上有一篇文章 https://www.v2ex.com/t/419056 介紹瞭如何經過某 URL 直接下載每一個小程序的 .wxapkg,但很快被微信封了。github

所以,咱們只能從手機端入手,在手機上找到微信客戶端下載保存在本地的小程序包。json

獲取小程序的 .wxapkg 文件

工具:一臺已越獄的 iPhone 手機或者已 RootAndroid 手機小程序

本文以 iPhone 4S, iOS 8.4.1 爲例,微信版本 v6.6.6微信小程序

在已越獄的 iPhone 上打開 Cydia,搜索並安裝 iFile 或者 Filza 等文件瀏覽 App,打開 iFile 或者 Filza,跳轉到本地 App 安裝目錄:/var/mobile/Containers/Data/Application/,此時,你能夠看到當前 iPhone 上已安裝的 App 列表,以下圖所示:bash

找到「微信」的目錄(我手機上對應的是:297286CE-9055-400A-99FA-D2D7C0735DCF 文件夾),點擊進入,即爲微信在此 iPhone 上的「沙盒」(Sandbox),相信 iOS 開發者對此目錄已經很是熟悉了,該目錄下主要有 DocumentsLibrarytmp 等文件夾,一般用於存放不一樣的數據和文件,這裏再也不贅述。咱們在當前微信「沙盒」目錄中搜索 wxapkg 關鍵字,便可找到當前 iPhone 中微信已下載的小程序包,以下圖:服務器

咱們發現搜索到的 .wxapkg 文件名都是以數字命名的,如圖中的 2.wxapkg25.wxapkg,它們的命名有什麼規則呢?又放在哪呢?咱們接着往下看。

通過簡單分析咱們發現,微信下載的小程序包存放在如下目錄:

/path/to/WeiChat SandBox/Library/WechatPrivate/{UserId}/WeApp/LocalCache/release/
複製代碼

其中,{UserId} 爲當前登陸的微信帳號 IdMD5 值(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 登陸到你的手機上了(具體的細節詳見 CydiaOpenSSH 下載頁面的使用說明):

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: 全部頁面的 .wxmlapp.wxss 樣式文件的彙總,可讀性差,須要還原;
  • *.html: 包含每一個頁面對應的 .wxss 信息,可讀性較好;
  • 資源文件: 各種圖片、音頻等資源文件

總結

本文主要介紹瞭如何獲取小程序的 .wxapkg 包文件,以及如何解包得到小程序「編譯」混淆後的代碼和資源文件。在下一篇文章《微信小程序「反編譯」實戰(二):源碼還原》將介紹如何將 .wxapkg 包內內容還原爲"編譯"前的內容。

參考連接

相關文章
相關標籤/搜索