反編譯獲取任何微信小程式原始碼

CaseyWei發表於2018-12-12

一、前言

最近在學習微信小程式開發,半個月學習下來,很想實戰一下踩踩坑,於是就仿寫了一個阿里媽媽淘寶客小程式的前端實現,過程一言難盡,差不多兩週時間過去了,發現小程式的坑遠比想象的要多的多!!在實際練手中,完全是黑盒的,看到人家上線的小程式的效果,純靠推測,部分效果在絞盡腦汁後能做出大致的實現,但是有些細節,費勁全力都沒能做出來。很想一窺原始碼,檢視究竟,看看大廠的前端大神們是如何規避了小程式的各種奇葩的坑。

於是就想到獲取到小程式地原始檔,然後再對其進行反編譯還原為原始碼,來作為學習參考。我百度了各種關於小程式地反編譯教程,但是感覺都不太適合像我這樣地初學小白,踩了挺多坑。在這裡把我重新簡化好的,快速地獲取一個微信小程式原始碼的方式記錄下來。

二、簡單聊一下xxxxx.wxapkg

  • 先來想想一個很簡單的問題,小程式的原始檔存放在哪?
    • 當然是在微信的伺服器上。
  • 但是在微信伺服器上,普通使用者想要獲取到,肯定是十分困難的,有沒有別的辦法呢?
    • 簡單思考一下我們使用小程式的場景就會明白,當我們點開一個微信小程式的時候,其實是微信已經將它的從伺服器上下載到了手機,然後再來執行的。
    • 所以,雖然我們沒能力從伺服器上獲取到,但是我們應該可以從手機本地找到到已經下載過的小程式原始檔
  • 那麼如何才能在手機裡找到小程式的原始檔包呢?
    • 具體目錄位置直接給出:
    • /data/data/com.tencent.mm/MicroMsg//appbrand/pkg/
    • 在這個目錄下,會發現一些 xxxxxxx.wxapkg 型別的檔案,這些就是微信小程式的包
  • 微信小程式的格式就是:.wxapkg
    • .wxapkg是一個二進位制檔案,有其自己的一套結構。
    • 關於.wxapkg的詳細內容可以參考lrdcq大神的博文:微信小程式原始碼閱讀筆記
    • 但是這裡有個坑,想要進入到上面這個目錄的話,用手機自帶的檔案管理器肯定是不行的,安卓或者iPhone都要要用到第三方的檔案管理器,比如:RE檔案管理器,並且安卓需要取得root許可權,而蘋果手機肯定是要越獄的,且iphone的越獄難度>>安卓獲取root,不管越獄還是root,這都太費勁,當然有能力的同學可以直接從手機上來操作,但是這裡不推薦從真機上獲取。

三、準備材料

  • node.js執行環境 下載地址
    • 如果沒有安裝nodejs,請先安裝一下
  • 反編譯的指令碼。 下載地址
    • 這裡提供一個Githubqwerty472123大神寫的node.js版本的,當然也有其它版本的,這裡我只是簡單地用node.js版本舉例
  • 安卓模擬器(要求自帶root許可權)下載地址自行百度
    • 我使用的是夜神模擬器,用來獲取小程式原始檔
  • RE管理器 下載地址自行百度
    • 到時候要拖到模擬器中的

四、詳細步驟

使用安卓模擬器獲取到.wxapkg檔案

  • 不用越獄,不用root,使用電腦端的安卓模擬器來獲取是一個非常簡單快捷且萬能的獲取方式,具體步驟如下:

    • 開啟安裝好的安卓模擬器,並在模擬器中安裝QQ、微信、RE管理器
    • QQ、微信在模擬器自帶的應用商店裡搜尋下載安裝即可
    • QQ、微信在模擬器自帶的應用商店裡搜尋下載安裝即可
    • RE管理器的下載地址自行百度
    • 下載好後直接拖拽進開啟的模擬器視窗就會自動安裝
    • 設定一下模擬器
    • 以我個人認為比較好用的夜神模擬器舉例
    • 首先到模擬器內部設定超級使用者許可權

    1
    2

    • 這些操作的目的都是為了能讓RE管理器順利的獲取到ROOT許可權
    • 接下來在模擬器裡開啟微信,然後在微信中執行你想要獲取的下程式(這其實是讓微信把小程式的原始檔包從伺服器下載到了本地了)
    • 就以我說的這款淘寶客的小程式舉例
    • 在模擬器微信中執行一下後,直接切回模擬器桌面執行RE瀏覽器 來到目錄
    • /data/data/com.tencent.mm/MicroMsg//appbrand/pkg/
    • 就抵達了目的資料夾
    • 你會看到發現裡面的一些.wxapkg字尾的檔案,就是它們沒錯啦,可以根據使用的時間來判斷那個是你剛才從伺服器下載過來的
    • 一般小程式的檔案不會太大,可以結合時間來判斷,長按壓縮所選檔案,然後再將壓縮好的包通過QQ傳送到我的電腦
    • 如果不進行壓縮的話,是無法將這個檔案通過QQ來傳送的
    • 所以QQ的這個功能可以讓我們很方便的拿到原始檔,而不必到電腦目錄去找模擬器的檔案目錄。
    • 解壓。這樣幾步簡單操作,就成功拿到了小程式的原始檔了。
    • 如果遇到無法把模擬器裡的wxapkg檔案拷貝到電腦上可以使用下邊方法

    • 實踐發現壓縮也不可以傳送到qq,最終把模擬器目錄下的wxapkg檔案移動到mnt/share/other資料夾下,然後在電腦安裝模擬器的目錄下找到Nox_share目錄下的other資料夾裡找到wxapkg檔案。(模擬器移動如果提示此操作在當前所在的資料夾是不被允許的,應該在模擬器把所需wxapkg資料夾勾選,然後後退進入到模擬器檔案管理器路徑下mnt/share/other路徑下點模擬器右上角兩列三個點的按鈕選擇移動即可把wxapkg檔案移動到到該目錄下)
    • 此電腦/C/user/13955 為我安裝模擬器路徑,找到自己對應的路徑下的Nox_share/OtherShare資料夾裡的wxapkg檔案即可。

五、使用反編譯指令碼解包 wxapkg

  • 到這裡你應該已經將反編譯指令碼從github下載 或者 clone 到本地某個目錄
    3

  • 開啟nodejs命令視窗,按住shift+右擊
    4

  • cd 到你clone或者下載好的反編譯指令碼目錄下
    5

  • 在node命令視窗中依次安裝如下依賴:

    • npm install esprima
    • npm install css-tree
    • npm install cssbeautify
    • npm install vm2
    • npm install uglify-es
  • 安裝好依賴之後,就是最後一步了,反編譯 .wxapkg 檔案

  • 在當前目錄下輸入 node wuWxapkg.js [-d] //files 就是你想要反編譯的檔名 例如:我有一個需要反編譯的檔案 _163200311_32.wxapkg 已經解壓到了C盤根目錄下,那麼就輸出命令 node wuWxapkg.js C:\_163200311_32.wxapkg

  • 回車執行
    6

  • 反編譯指令碼就能一步將.wxapkg 檔案還原為微信開發者工具能夠執行的原始檔,目錄地址和你反編譯的檔案地址是一樣的 然後在微信開發者工具新增專案即可開啟
  • 執行成功,原始碼獲取完成
  • 如果反編譯報錯請看如下

    注意1:使用node wuWxapkg.js 反編譯命令時,如果報 Cannot find module 'xxx' 這種型別的錯誤,

    就直接使用 npm install xxx 先安裝

    注意2:如果node wuWxapkg.js 反編譯命令時,報錯如下:

    那個請重新換一個.wxapkg檔案。(一般需要的檔案幾百k,如果還報錯把路徑下每個都反編譯一下就能獲得找到正確的wxapkg檔案)

六、結束語

至此我們就通過非常簡單的方式獲取到了一個想要的小程式原始檔,並對齊進行了反編譯還原以後想要再反編譯其他的小程式,非常快速,只需要兩步即可完成

  • 使用模擬器找到小程式.wxapkg檔案
  • 使用nodejs 反編譯指令碼將.wxapkg檔案反編譯

使用此方法,絕大部分的小程式都能正常反編譯出來,但是也會有一些特殊的情況,具體可以檢視qwerty472123大神的readme檔案

.apk 之類的檔案反編譯非常困難,而小程式竟可以如此輕鬆隨意地被獲取到原始碼,根源在於小程式的開發團隊並沒有對小程式的執行檔案進行有效的保護,也就是加密,所以我們才能使用別人寫好的指令碼直接進行反編譯,其過程類似於解壓。

實際上,小程式只是很簡單的將圖片、js和json檔案壓在一起,而壓制的過程就是Wxml -> Html、 Wxml -> JS、Wxss -> Css,轉換後檔案二進位制格式跟字尾名為wx二進位制格式完全一致。

上線的原始碼能如此簡單的被獲取到,不得不說小程式的原始碼安全存在很大的隱患,這一點很多開發者應該也知道,所以發現有些小程式會將重要的js邏輯程式碼柔在一個js檔案中,這樣,即使被獲取了原始碼,也不是很容易讀懂,但是任然避免不了被窺視的問題。小程式作為微信生態內的新生力量,不僅被官方,也被很多開發者和內容創業者寄予厚望,處於對程式碼的安全性的考慮,這個漏洞遲早有一天會被 修復(封掉) 的。

所以這種這裡介紹的獲取小程式原始碼的方法,應該是不會太長久的。

相關文章