反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。
工具
node.js运行环境
反编译脚本
GitHub qwerty472123 大神的脚本
https://github.com/qwerty472123/wxappUnpacker安卓系统(必须 root 权限)
用于获取微信小程序
教程
安装好 node.js 环境
下载反编译脚本
安装依赖
在反编译脚本目录下执行以下依赖命令
1
2
3
4
5
6
7npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify
npm install escodegen获取小程序 .wxapkg 文件
安卓小程序存放路径: /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg
其中{User}为当前用户的用户名,类似于2bc*b65一串。
找到最新打开的小程序 wxapkg 包
执行下载代码1
2adb pull /data/data/com.tencent.mm/MicroMsg/1f2fa0e75647c562da58237740cd9d0e/appbrand/pkg/_1739533637_65.wxapkg ./Downloads
adb pull /data/data/com.tencent.mm/MicroMsg/1f2fa0e75647c562da58237740cd9d0e/appbrand/pkg/_-484675448_65.wxapkg ./Downloads反编译小程序
1
node wuWxapkg.js ../DuappDecode/MiniProgram/_1739533637_65.wxapkg
报错
1
2
3
4
5
6
7
8
9
10
11 ReferenceError: $gwx is not defined
at vm.js:3:3
at Script.runInContext (vm.js:134:20)
at VM.run (/Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/node_modules/vm2/lib/main.js:218:62)
at runVM (/Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/wuWxss.js:69:6)
at runOnce (/Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/wuWxss.js:86:27)
at Array.<anonymous> (/Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/wuWxss.js:166:5)
at CntEvent.decount (/Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/wuLib.js:17:43)
at /Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/wuLib.js:73:11
at agent (/Users/xumin/Workspace/Mingo/Hacker/wxappUnpacker/wuLib.js:54:14)
at FSReqCallback.oncomplete (fs.js:153:23)
解决方法,修改反编译脚本wuWxss.js代码
将原代码
1
2
3
4
5
6
7
8
9 function runVM(name,code){
let wxAppCode={},handle={cssFile:name};
let vm=new VM({sandbox:Object.assign(new GwxCfg(),{__wxAppCode__:wxAppCode,setCssToHead:cssRebuild.bind(handle)})});
vm.run(code);
for(let name in wxAppCode)if(name.endsWith(".wxss")){
handle.cssFile=path.resolve(frameName,"..",name);
wxAppCode[name]();
}
}
修改为
1
2
3
4
5
6
7
8
9
10
11 function runVM(name,code){
let wxAppCode={},handle={cssFile:name};
let gg = new GwxCfg();
let tsandbox ={$gwx:GwxCfg.prototype["$gwx"],__mainPageFrameReady__:GwxCfg.prototype["$gwx"],__wxAppCode__:wxAppCode,setCssToHead:cssRebuild.bind(handle)};
let vm = new VM({sandbox:tsandbox});
vm.run(code);
for(let name in wxAppCode)if(name.endsWith(".wxss")){
handle.cssFile=path.resolve(frameName,"..",name);
wxAppCode[name]();
}
}
- 分布反编译小程序
部分有分包的小程序无法正常反编译,可分步骤进行反编译
1
2
3
4
5
6
7
8# 仅解包,不做后续操作
node wuWxapkg.js -o ../DuappDecode/MiniProgram/_-484675448_65.wxapkg
# 将 app-service.js (或小游戏中的 game.js ) 拆分成一系列原先独立的 javascript 文件,并使用 Uglify-ES 美化
node wuJs.js ../DuappDecode/MiniProgram/_-484675448_65/packageSecond/app-service.js
# 将编译/混合到 page-frame.html ( 或 app-wxss.js ) 中的 wxml 和 wxs 文件还原为独立的、未编译的文件。如果加上-m指令,就会阻止block块自动省略,可能帮助解决一些相关过程的 bug 。
node wuWxml.js ../DuappDecode/MiniProgram/_-484675448_65/packageSecond/page-frame.js
PS::其它命令看文档