技术-微信小程序反编译

反编译不是让各位开发者去对一个应用破解搞重装什么的,主要目的是为了促进开发者学习,借鉴好的代码,提升自我开发水平。

工具

教程

  • 安装好 node.js 环境

  • 下载反编译脚本

  • 安装依赖

    在反编译脚本目录下执行以下依赖命令

    1
    2
    3
    4
    5
    6
    7
    npm 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
    2
    adb 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::其它命令看文档

您的支持将鼓励我继续创作