手把手教你—微信小程序抓包解密与反编译工具的使用全过程(超详细)

5,674 阅读3分钟

一:前置准备

修改微信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.接口跨域问题

微信小程序的跨域解决:

blog.csdn.net/Time_Flies_…

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、参考文章

blog.csdn.net/ONExiaobaij…

8、声明

本次分享仅做学习使用,以上用例,为专用测试环境,请遵守国家法律!!!