某天看到群里某個朋友說某小程序抓不到包,我突然就來了興趣,我也試着分析了下這個小程序,名字我就不說了,本着我個人興趣分析學習的目的。
我用安卓和IOS,以及charles和fiddler都試了,還真的抓不到包,返回的都是如下圖的數據,紅色標注區域就是微信返回的接口,但是尾部的數字和字母每次都是隨機出現的,而且也並沒有直接可見的數據,都是加密的字段,如圖可見
這就有點意思了,而這個小程序的廣告地址我都直接抓到了,但就是數據沒抓到,很奇怪,然后突然腦子里蹦出來一個想法,反編譯試試?
說干就干
需要用到工具:
- npm
- 安卓模擬器
- 微信開發者工具
- 反編譯工具
1.安裝npm
去這個網站下載npm:
https://nodejs.org/zh-cn/download/
然后安裝就一直點【next】就行了
測試是否安裝好:在終端里運行如下命令:
2.安裝安卓模擬器
安卓模擬器有夜神,mumu,genymotion,感覺都差不多,大的區別沒有,夜神、mumu、genymotion都有windows和mac版,只有些小的區別
我這里使用的是夜神
安裝也是一路點next就行了
3.安裝微信開發者工具
安裝了這個工具才能打開反編譯后的小程序源碼,並本地預覽加載
下載地址: https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
同樣的也是一路下一步,跟着提示操作就行了
安裝完了之后,需要去微信開發者平台注冊一個開發者賬號 https://mp.weixin.qq.com/
登陸之后,選到如下的【基本設置】,然后跟着操作就行了
4.安裝反編譯工具
就還是用github上一個大神寫的工具,用git 拉取下就行 git clone https://github.com/qwerty472123/wxappUnpacker.git 當然如果你沒有配置git,可以壓縮包下載
但是文件已為空:
很騷,這個具體原因不知道,我后來想了下也想明白了,應該是微信方為了安全保護自己平台的小程序,所以跟作者做了溝通吧,也或者作者自己覺得不太好,自己把項目下架了,不過我還是在網上找到一個,網址的話我想了很久,還是不貼出來了,有興趣的朋友自己去找吧
准備工作都完畢了,開始配置環境
配置環境
1.模擬器里安裝軟件
直接在應用市場(模擬器自帶有應用市場)里下載 【微信】,和 【RE管理器】
2.將小程序反編譯工具解壓,放到自己想要的目錄
就是剛才下載的wxappUnpacker,解壓到任意目錄,我這里直接解壓的C盤,臨時使用,這個步驟太過簡單,掠過
3.安裝npm軟件包:
注意這個步驟建議進入你解壓后的wxappUnpacker文件夾下操作,后面的反編譯命令就可以直接用相對路徑來執行,更方便一點
我這里因為之前已經安裝過,所以就隨意了。
1).在之前,先用npm初始化 npm init
2). 安裝如下的軟件:
注意有的文章用的是 npm install esprima -g,這個是在全局安裝的意思,這種就看你自己怎么選擇了,我個人建議直接安裝在當前目錄即可
npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify
npm install escodegen
3).在安裝js-beautify會報如下錯:
使用如下命令,清楚緩存:
再次安裝即可:
4).最后再安裝escodegen
5)測試環境
我這里已經進入了wxappUnpacker目錄里操作了
導出微信小程序文件
1).打開安卓模擬器,打開微信,然后啟動目標小程序,一定到打開下,因為要打開過的才會下載小程序文件存儲到本地
2).退出微信,打開模擬器里的RE管理器
第一次打開RE文件管理器,會有這個選項,選擇如下即可
3). 從RE管理器里找到如下目錄:
/data/data/com.tencent.mm/MicroMsg
這個目錄下找那個文件夾名為一長串的字母加數字的文件夾即為一個微信用戶的目錄,一般情況下就只有1到3個這種文件夾,一個一個打開看看就知道了
4).進入用戶目錄后,再進入如下紅線標注出的目錄,就會看到后綴為wxapkg的文件,這種文件就是微信小程序的包文件了
但是這種文件也會有多個,所以哪個是你的目標對象也不知道,同樣的,一個一個試,就幾個文件,總有一個是對的
5).指着這個文件,鼠標左鍵長按,然后右上角會出現三個點,點那三個點,出現下圖標注區域選項,選擇壓縮這個文件
6).壓縮完了后,它提示你是否要查看,點查看
會自動跳到下圖的目錄,然后,下面的zip文件就是剛才壓縮的文件了,我這里因為之前試了幾個,壓縮了好幾次,所以有好幾個壓縮包,這個對本篇博客來說沒影響
7).同樣的,鼠標左鍵長按,然后點右上角的三個點,選擇下圖的區域,發送,其實就是將文件導出去
發送給微信好友,或者你再在模擬器里裝個QQ,發送給QQ好友也行,反正目的就是把這個壓縮包導出去,你用什么方法都可以
說到這里,補充一點:如果你在剛開始打開微信(如上圖),從微信里打開小程序,沒法打開時,可以先換一個號把這個小程序分享給你,然后在模擬器里點擊下就可以打開小程序了,我用夜神模擬器時,就需要下拉准備啟動小程序時模擬器直接閃退的情況
開始反編譯
1).把從安卓模擬器里導出來的小程序文件,放到一個指定目錄,我這里就直接放在wxappUnpacker里的 ,這個就看你自己了,放不放wxappUnpacker目錄無所謂,反正你方便操作就行
2).執行反編譯命令
node wuWxapkg.js xxx(小程序包名)
3).如果有如下錯:
修改wuWxss.js文件的如下位置,
function runOnce(){ for(let name in runList)runVM(name,runList[name]); }
改成如下:
function runOnce() { for (let name in runList) { // console.log(name, runList[name]);
var start = `var window = window || {}; var __pageFrameStartTime__ = Date.now(); var __webviewId__; var __wxAppCode__={}; var __mainPageFrameReady__ = function(){}; var __WXML_GLOBAL__={entrys:{},defines:{},modules:{},ops:[],wxs_nf_init:undefined,total_ops:0}; var __vd_version_info__=__vd_version_info__||{}; $gwx=function(path,global){ if(typeof global === 'undefined') global={};if(typeof __WXML_GLOBAL__ === 'undefined') {__WXML_GLOBAL__={}; }__WXML_GLOBAL__.modules = __WXML_GLOBAL__.modules || {}; }`; runVM(name, start + " \r\n" + runList[name]); } }
如圖:
再次反編譯:
看到最后那個File done,即表示反編譯完畢 ,這時候同目錄下會出現同名的文件夾:
5).把這個文件夾用微信開發者工具打開,導入項目:
沒有AppID可以暫時點【使用測試號】
然后就會自動加載小程序
5).即可開始你的代碼分析了
但是,我准備分析的目標小程序,如下圖,請求數據失敗,因為這個小程序是用的微信雲開發制作的
什么是微信雲開發
就是制作的小程序沒有自己的后端服務,由微信團隊在2018年推出的服務,微信平台提供簡單的后台管理,你只需要把數據傳到雲平台,然后調取微信雲開發里自己定義好的函數或者接口就行了,說白了就是一個小程序不需要后端就可以做出來,跟我們以往認知的不一樣,但也有一個弊端,就是如果你想看到更多的后台管理數據可能就沒戲了,比如你想根據用戶數據作進一步的分析就別想了,有關微信雲開發詳細的自己百度吧
所以,我拿到的接口是微信雲開發的接口 : wx.cloud.callFunction.getJobList,也就根本無法分析出這個接口的整個機制,請求什么數據,返回什么數據了,想都別想了,拿都拿不到數據。這種情況我查了下資料,沒戲,也有可能我看漏了,反正我鼓搗了好一會兒,得出的結論就是沒戲,並且我嘗試用微信的開發者AppID修改源碼,提示我不是這個小程序的開發者,沒法修改,所以是徹底沒戲了
確實是挺失敗的一次抓包分析,不過我覺得通過這次,還是漲見識了,微信方這方便做得確實不錯,不得不佩服啊
相信有朋友肯定要問,你既然都是失敗了為什么還要把這個事寫成博客發出來呢?
這個原因就是,一來是通過這次反編譯,我個人而言確實是漲見識了,如果讓您也學到了,那么自然更是好事,二來是我覺得這個沒有什么丟不丟臉的事,失敗了就是失敗了,畢竟人生總不會都如意的,算是記錄下我這次的經歷