我们在学习一项新技能时,除了认真学习官方的规范、标准和技术文档之外,还需要借鉴和参考其他优秀的产品。新手或独立学习者看到做得好的产品就想学,而往往没有好的学习渠道,因此反编译成为了一个“不太好”但有效的学习方法。闲话少说,以下是从网上搜集加自身成功实践得来的操作步骤,供大家借鉴。
一、环境准备
1、nodejs
2、安卓模拟器:夜神模拟器
3、反编译工具脚本:wxappUnpacker,具体的微信小程序打包规则和反编译原理可以从这个github上查看
二、获取小程序包
1、在模拟器中安装微信,按正常操作方式打开小程序
2、在模拟器的文件浏览器上,找到类似以下路径:/data/data/com.tencent.mm/MicroMsg/1bd6bxxxxxxxxxxxxcca72bc50f0/appbrand/pkg/
1bd6bxxxxxxxxxxxxcca72bc50f0 这一串实际上是微信用户的某种唯一id
3、根据文件更新时间,或者凭感觉:)找到你要反编译的小程序对应的wxapkg程序包
4、利用模拟器右侧一个“电脑”图标工具,将该程序包移动到共享的文件夹,并且打开电脑文件夹,此时就从模拟器转移到电脑上了
三、安装反编译依赖
1、先安装nodejs
2、从github上clone wxappUnpacker后,从命令行进入到该文件夹
3、在命令行中执行以下安装依赖包的命令:(有些教程里带了-g参数,在实操时发现还是不带好用,就在unpacker的本地加载依赖项而不是全局)
npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify
npm install escodegen
四、开始反编译
1、继续在命令行中,执行以下命令:(该示例将要反编的包放在unpacker的上一级目录中)
node ./wuWxapkg.js ../_xxxxx_36.wxapkg
此时会类似以下报错:
D:\wxunpack\wxappUnpacker\node_modules\vm2\lib\main.js:225
throw this._internal.Decontextify.value(e);
^
ReferenceError: __mainPageFrameReady__ is not defined
at vm.js:3:5
at Script.runInContext (vm.js:107:20)
at VM.run (D:\wxunpack\wxappUnpacker\node_modules\vm2\lib\main.js:219:62)
at runVM (D:\wxunpack\wxappUnpacker\wuWxss.js:69:6)
at runOnce (D:\wxunpack\wxappUnpacker\wuWxss.js:86:27)
at Array.preRun (D:\wxunpack\wxappUnpacker\wuWxss.js:166:5)
at CntEvent.decount (D:\wxunpack\wxappUnpacker\wuLib.js:17:43)
at ioLimit.runWithCb (D:\wxunpack\wxappUnpacker\wuLib.js:81:11)
at agent (D:\wxunpack\wxappUnpacker\wuLib.js:54:14)
at FSReqWrap.readFileAfterClose [as oncomplete] (internal/fs/read_file_context.js:53:3)
结合网友的智慧,此时其实已经反编了js等代码,但wxss等还没成功,所以进入已反编出的文件夹中,找到page-frame.html文件,并用文本编辑器删除_mainPageFrameReady__()后保存
2、再次继续反编,此时执行以下命令即可:(没看代码,猜测是执行了好几个步骤的代码的最后一步,参数就是已反编出的文件夹路径)
node wuWxss.js ..\_xxxxx_36
到此,反编译就完成了,提示:
Guess wxss(first turn)...
Import count info: {}
Guess wxss(first turn) done.
Generate wxss(second turn)...
Generate wxss(second turn) done.
Save wxss...
Total use: 161.683ms
最后,再次强调,此大法只作为学习参考用,切勿妄而为之,切记切记!