一:前置准备
修改微信PC端默认位置
修改微信PC端默认的小程序包位置,默认在C盘,太占内存,建议修改。
pc端打开一个小程序,尽可能点开所有的页面,让本地自动生成一个本地包,如下图所示。
找到APP.wxapkg文件,这个是加密过的,接下的流程需要使用下面的解密和逆向工具。
二:准备工具
1:解密工具
解密工具获取:https://www.aliyundrive.com/s/y7LbrRvgHKS
wxpack是个空文件夹,用来存解密后的源码包
2、逆向工具wxappUnpacker
逆向工具获取:https://www.aliyundrive.com/s/6YRjqatfSGY
三:正式解密
双击打开UnpackMiniApp.exe文件,选择APP.wxapkg文件进行解密操作
若出现下面的报错,提示你没有wxpack文件夹,记得新建个wxpack文件夹用于存放解密后的文件
解密成功后,查看wxpack文件夹,已经生成解密后的文件。
四:正式逆向
下面就由逆向工具wxappUnpacker出场了。正式反编译之前,确保安装了node,我们下面需要使用node安装一下要使用的依赖。
安装下面的依赖
npm install esprima css-tree cssbeautify vm2 uglify-es js-beautify
开始逆向,确保命令行打开目录是下图所示
node ./wuWxapkg.js 主包路径
node ./wuWxapkg.js 分包路径 -s=主包路径
成功拿到源码内容:
微信小程序开发工具打开源码,试运行效果,这里如果遇到无法找到app.json文件的问题。原因是微信小程序10月开始,优化了文件结构。wxappUnpacker工具无法反编译出app.json文件了。解决方法随见下文。
五:unveril工具
unveril是比wxappUnpacker更高级更方便的反编译工具,解决 wxappUnpacker工具无法反编译出app.json文件的问题。
github地址:github.com/junxiaqiao/…,具体如何使用,详见github的介绍文档。
2.0版本下载
链接:https://pan.quark.cn/s/88490fba2ecf
提取码:QXtC
链接:https://pan.baidu.com/s/1sWOZ1UG3HkxX7ehSs2n5gA?pwd=33rc
提取码:33rc
如果遇到下面的问题,尝试以管理员身份运行.exe文件
使用示例,如果路径有空格必需加引号
# 直接解包整个目录
$ unveilr "/path/to/wxapkg/dir/"
# 解多个包
$ unveilr "/path/to/1.wxapkg" "/path/to/2.wxapkg" ...
# 指定wx子命令并指定微信AppId
$ unveilr wx -i wx11aa22bb33cc44dd "/path/to/wxapkg/dir/"
# 格式化解析出来的代码
$ unveilr wx -f "/path/to/wxapkg/dir/"
# 只提取源文件不解析进行反编译
$ unveilr wx --no-parse "/path/to/wxapkg/dir/"
当前只有一个主包,使用下面的命令进行主包反编译
unveilr 主包地址
反编译完成,成功解出app.json文件
六、unveril解包后打开微信开发者工具可能遇到的问题:
1.格式化问题
出现上面的报错原因是反编译下来的代码,格式是乱的,找到具体报错的文件手动格式化一下。
参考解决方法:blog.csdn.net/a_123_4/art…
或者在使用unveril反编译的时候,加个 -f的子命令,反编译后的代码会做一个初步的格式化,详见unveril github read.me。
2.接口跨域问题
微信小程序的跨域解决:
3、反编译报错:_typeof3 is not a function
修改一下 @babel\runtime\helpers\typeof.js,typeof.js 文件 全部替换 即可
function _typeof2(o) {
"@babel/helpers - typeof";
return (_typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
return typeof o;
} : function(o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
})(o);
}
function _typeof(o) {
return "function" == typeof Symbol && "symbol" === _typeof2(Symbol.iterator) ? module.exports = _typeof = function(o) {
return _typeof2(o);
} : module.exports = _typeof = function(o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : _typeof2(o);
}, _typeof(o);
}
module.exports = _typeof;
参考解决方法:blog.csdn.net/weixin_3900…
7、参考文章
8、声明
本次分享仅做学习使用,以上用例,为专用测试环境,请遵守国家法律!!!