今天让我仿写一个微信小程序,实在是无从下手,只好想办法搞搞源码来学习一下

这种方法,并不能反编译出所有的小程序源码

获取到.wxapkg文件

方式一 模拟器法

准备材料:

  1. node.js运行环境(自行百度安装教程)
    下载安装好nodejs

  2. 反编译的脚本(需要做一定的修改,否则编译出来的文件缺少样式,修改方法见下方脚本的修改
    使用Github上qwerty472123大神写的node.js版本的,当然也有其它版本的,例如python版等,自行度娘。
    下载地址:
    旧版Wechat App(微信小程序,.wxapkg)解包及相关文件(.wxss,.json,.wxs,.wxml)还原工具
    2019版2019小程序解包 解决$gwx报错问题

  3. 安卓模拟器(要求自带root权限)
    例如夜神模拟器,腾讯手游助手等

具体步骤如下:

  1. 打开安装好的安卓模拟器,并在模拟器中安装QQ、微信、RE管理器
    RE管理器的下载地址https://pan.baidu.com/s/1PPBx08rNutXxhlMMJbuTpQ

  2. 设置一下模拟器
    以夜神模拟器举例
    首先到模拟器内部设置超级用户权限
    Mini-Program-Decompilation
    Mini-Program-Decompilation
    这些操作的目的都是为了能让RE管理器顺利的获取到ROOT权限
    接下来在模拟器里打开微信,然后在微信中运行你想要获取的下程序(这其实是让微信把小程序的源文件包从服务器下载到了本地了)

  3. 在模拟器微信中运行一下后,直接切回模拟器桌面运行RE管理器 来到根目录下的/data/data/com.tencent.mm/MicroMsg//appbrand/pkg/就抵达了目的文件夹
    Mini-Program-Decompilation
    你会看到发现里面的一些.wxapkg后缀的文件,就是它们没错啦,可以根据使用的时间来判断那个是你刚才从服务器下载过来的

这里重要声明一下:虽然微信小程序的包后缀是.wxapkg,但有一些包的依赖后缀也是.wxapkg,真正的小程序包大小1M左右,而依赖包大小2、3M甚至更多。所以一股脑的反编译.wxapkg 类型的文件可能会报错:Error: This Package is unrecognizable, please decrypted every type of file by hand.,遇见这个问题请自知,你可能没找对包!

  1. 一般小程序的文件不会太大,可以结合时间来判断,长按压缩所选文件,然后再将压缩好的包通过QQ发送到我的电脑
    Mini-Program-Decompilation

如果不进行压缩的话,是无法将这个文件通过QQ来发送的

  1. 最后将发送过来的文件进行解压。这样几步简单操作,就成功拿到了小程序的源文件了。

方式二 手机备份法(我用的这种)

准备材料:
1.、2.同方式一

  1. 一台带有备份功能的智能手机

具体步骤如下:

  1. 备份微信应用:
    为便于查找,最好单独备份微信,以安卓手机为例,大致流程如下:设置——存储与备份——备份手机数据——添加备份——应用——选择微信,然后点击确定,等待备份完成即可。
    Mini-Program-Decompilation
    Mini-Program-Decompilation
    PS:如果是获取别人的小程序,不清楚小程序结构,那么最好是把微信中其他的小程序都删掉,只保留要查找的小程序进行访问后对微信单独备份,这样备份之后的文件中的编译包就只有需要的这个小程序了。

  2. 查找备份文件:
    文件管理——全部文件——backup——App中找到com.tencent.mm.zip,这就是微信备份文件了(注意不同手机目录结构会不同)。
    也可以直接搜索com.tencent.mm.zip
    最后通过qq或微信将这个压缩包分享到电脑上。

  3. 查找小程序编译包文件:

解压文件,点击进入MicroMsg文件夹,找到文件名为串码格式的文件夹,如下,需要点进去确认下:
Mini-Program-Decompilation
点击进去——第一个appbrand——pkg,下方的那些.wxapkg后缀的文件就是
Mini-Program-Decompilation

使用反编译脚本解包.wxapkg

将反编译脚本从github下载 或者 clone 到本地某个目录
打开nodejs命令窗口
Mini-Program-Decompilation
用cd命令进入到你clone或者下载好的反编译脚本目录下
在node命令窗口中依次使用如下命令安装依赖包:

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

在当前目录下输入node wuWxapkg.js 想要反编译的文件路径(注意空格!!!)然后回车即可,如下图
Mini-Program-Decompilation

最后稍等一会在安装包目录下会出现一个与编译文件同名的文件夹,那个就是编译好的源码文件夹了

打开源码文件

打开微信开发者工具——左上角“项目”——“导入项目”,然后如图所示

脚本的修改

由于新版小程序做了改动,直接使用下载的脚本编译出来的文件会缺少wxss的样式文件,并且编译过程会报错,需要做如下修改后再编译才行

将反编译脚本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
12
13
14
15
16
17
18
19
20
21
function runVM(name,code){
let wxAppCode = {};
let handle = {cssFile: name};
let gg = new GwxCfg();
let tsandbox = {
$gwx: GwxCfg.prototype["$gwx"],
__mainPageFrameReady__: GwxCfg.prototype["$gwx"], //解决 $gwx is not defined
__vd_version_info__: GwxCfg.prototype["$gwx"], //解决 __vd_version_info__ is not defined
__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]();
}
}
}

再保存即可

参考来源
反编译获取任何微信小程序源码(完)
微信小程序编译包的获取与解压——在手机中获取小程序编译包wxapkg
反编译微信小程序$gwx is not defined报错解决方法

× 请我吃糖~
打赏二维码