第一次在掘金這樣高大上的社區(qū)寫(xiě)文章,忐忑地敲下我獲取小程序源碼過(guò)程中的經(jīng)驗(yàn)分享。
最近在學(xué)習(xí)微信小程序開(kāi)發(fā),半個(gè)月學(xué)習(xí)下來(lái),很想實(shí)戰(zhàn)一下踩踩坑,于是就仿寫(xiě)了一個(gè)滴滴他們家的青桔單車小程序的前端實(shí)現(xiàn),過(guò)程一言難盡,差不多兩周時(shí)間過(guò)去了,發(fā)現(xiàn)小程序的坑遠(yuǎn)比想象的要多的多??!在實(shí)際練手中,完全是黑盒的,看到人家上線的小程序的效果,純靠推測(cè),部分效果在絞盡腦汁后能做出大致的實(shí)現(xiàn),但是有些細(xì)節(jié),費(fèi)勁全力都沒(méi)能做出來(lái)。很想一窺源碼,查看究竟,看看大廠的前端大神們是如何規(guī)避了小程序的各種奇葩的坑。
于是就想到獲取到小程序地源文件,然后再對(duì)其進(jìn)行反編譯還原為源代碼,來(lái)作為學(xué)習(xí)參考。我百度了各種關(guān)于小程序地反編譯教程,但是感覺(jué)都不太適合像我這樣地初學(xué)小白,踩了挺多坑。在這里把我重新簡(jiǎn)化好的, 快速地獲取一個(gè)微信小程序源碼 的方式記錄下來(lái)。
先來(lái)想想一個(gè)很簡(jiǎn)單的問(wèn)題,小程序的源文件存放在哪?
微信小程序的格式就是: .wxapkg
.wxapkg是一個(gè)二進(jìn)制文件,有其自己的一套結(jié)構(gòu)。
但是這里有個(gè) 坑 ,想要進(jìn)入到上面這個(gè)目錄的話,用手機(jī)自帶的文件管理器肯定是不行的, 安卓 或者 iPhone 都要要用到第三方的文件管理器,比如: RE文件管理器 ,并且安卓需要取得root權(quán)限,而蘋果手機(jī)肯定是要越獄的,且 iphone的越獄難度>>安卓獲取root ,不管越獄還是root,這都太費(fèi)勁,當(dāng)然有能力的同學(xué)可以直接從手機(jī)上來(lái)操作,但是這里 不推薦從真機(jī)上獲取 。
不用越獄,不用root,使用電腦端的 安卓模擬器 來(lái)獲取是一個(gè) 非常簡(jiǎn)單快捷且萬(wàn)能的 獲取方式,具體步驟如下:


就以我說(shuō)的這款青桔單車的小程序舉例(希望滴滴的大神不會(huì)想打死我~)
在模擬器微信中運(yùn)行一下后, 直接切回模擬器桌面運(yùn)行RE瀏覽器 來(lái)到目錄
/data/data/com.tencent.mm/MicroMsg/{{一串32位的16進(jìn)制字符串文件夾}}/appbrand/pkg/
就抵達(dá)了目的文件夾

你會(huì)看到發(fā)現(xiàn)里面的一些.wxapkg后綴的文件,就是它們沒(méi)錯(cuò)啦,可以根據(jù)使用的時(shí)間來(lái)判斷那個(gè)是你剛才從服務(wù)器下載過(guò)來(lái)的
一般小程序的文件不會(huì)太大,可以結(jié)合時(shí)間來(lái)判斷,長(zhǎng)按壓縮所選文件,然后再將壓縮好的包通過(guò)QQ發(fā)送到 我的電腦
如果不進(jìn)行壓縮的話,是無(wú)法將這個(gè)文件通過(guò)QQ來(lái)發(fā)送的

所以QQ的這個(gè)功能可以讓我們很方便的拿到源文件,而不必到電腦目錄去找模擬器的文件目錄。
解壓。這樣幾步簡(jiǎn)單操作,就成功拿到了小程序的源文件了。
到這里你應(yīng)該已經(jīng)將反編譯腳本從github下載 或者 clone 到本地某個(gè)目錄
打開(kāi)nodejs命令窗口
cd 到你clone或者下載好的反編譯腳本目錄下
在node命令窗口中依次安裝如下依賴:
npm install esprima npm install css-tree npm install cssbeautify npm install vm2 npm install uglify-es
安裝好依賴之后,就是最后一步了,反編譯 .wxapkg 文件
在當(dāng)前目錄下輸入
node wuWxapkg.js [-d] <files...> //files 就是你想要反編譯的文件名
例如:我有一個(gè)需要反編譯的文件 _163200311_32.wxapkg 已經(jīng)解壓到了D盤根目錄下,那么就輸出命令
node .\wuWxapkg.js D:\_163200311_32.wxapkg
回車運(yùn)行

反編譯腳本就能一步將.wxapkg 文件還原為微信開(kāi)發(fā)者工具能夠運(yùn)行的源文件, 目錄地址和你反編譯的文件地址是一樣的

然后在微信開(kāi)發(fā)者工具新增項(xiàng)目即可打開(kāi)

運(yùn)行成功,源碼獲取完成

至此我們就通過(guò)非常簡(jiǎn)單的方式獲取到了一個(gè)想要的小程序源文件,并對(duì)齊進(jìn)行了反編譯還原 以后想要再反編譯其他的小程序,非??焖伲?nbsp;真的只需要兩步
使用此方法,絕大部分的小程序都能正常反編譯出來(lái),但是也會(huì)有一些特殊的情況,具體可以查看 qwerty472123 大神的readme文件
.apk 之類的文件反編譯非常困難,而小程序竟可以如此輕松隨意地被獲取到源碼,根源在于小程序的開(kāi)發(fā)團(tuán)隊(duì)并沒(méi)有對(duì)小程序的執(zhí)行文件進(jìn)行有效的保護(hù),也就是加密,所以我們才能使用別人寫(xiě)好的腳本直接進(jìn)行反編譯,其過(guò)程類似于解壓。
實(shí)際上,小程序只是很簡(jiǎn)單的將圖片、js和json文件壓在一起,而壓制的過(guò)程就是Wxml -> Html、 Wxml -> JS、Wxss -> Css,轉(zhuǎn)換后文件二進(jìn)制格式跟后綴名為wx二進(jìn)制格式完全一致。
上線的源代碼能如此簡(jiǎn)單的被獲取到,不得不說(shuō)小程序的源碼安全存在很大的隱患,這一點(diǎn)很多開(kāi)發(fā)者應(yīng)該也知道,所以發(fā)現(xiàn)有些小程序會(huì)將重要的js邏輯代碼柔在一個(gè)js文件中,這樣,即使被獲取了源碼,也不是很容易讀懂,但是任然避免不了被窺視的問(wèn)題。 小程序作為微信生態(tài)內(nèi)的新生力量,不僅被官方,也被很多開(kāi)發(fā)者和內(nèi)容創(chuàng)業(yè)者寄予厚望,處于對(duì)代碼的安全性的考慮,這個(gè)漏洞遲早有一天會(huì)被 修復(fù)(封掉) 的。
所以這種這里介紹的獲取小程序源碼的方法,應(yīng)該是不會(huì)太長(zhǎng)久的。