PC端微信小程序解密与反编译:wxappUnpacker实战指南
简介这份资源面向需要分析、学习微信小程序实现原理的PC端开发者提供一套可落地的解密与反编译工具组合核心为wxappUnpacker及配套的小程序包解密程序帮助读者将微信平台处理后的二进制代码还原为可阅读的源码形式适用于技术研究、功能借鉴与代码学习等场景需要具备一定的命令行操作基础。压缩包共16个文件约467KB以js脚本为主体涵盖wxml、wxss、js等模块的还原逻辑另含bat与sh批处理脚本、exe解密程序、json配置、md与pdf说明文档及license、图片等辅助文件结构紧凑、开箱即用。目前已有204人学习下载。读者可据此完成小程序包解密、代码反编译与目录还原的完整流程并通过说明文档与脚本注释理解各模块作用快速排查常见报错为后续研究小程序架构与实现思路提供参考。1. PC 端微信小程序解密与反编译拿到 wxappUnpacker 之后到底能干什么很多人第一次接触 PC 端微信小程序逆向都是被一个具体需求逼出来的某个小程序在手机上跑得好好的想看看它的页面结构、接口调用、加密参数怎么拼的结果打开微信开发者工具发现根本加载不了——因为拿到手的不是源码工程而是一堆.wxapkg包。这个压缩包里放的就是 PC 端微信小程序解密、反编译工具和操作步骤核心是wxappUnpacker配合解密脚本把 PC 微信本地缓存的小程序包还原成可读的wxml、wxss、js、json文件。它解决的不是破解问题而是我手上有一个合法拿到的小程序包怎么把它变成能读、能改、能对照学习的工程目录。适合谁做安全评估的、做竞品页面结构分析的、做小程序兼容性排查的以及想搞清楚小程序打包产物长什么样的前端。不适合想一键脱壳商业加密逻辑的人那套东西不在这个工具的射程里。2. 先搞懂 wxapkg 的结构为什么不能直接解压2.1 wxapkg 不是标准 zip头部有校验PC 端微信把小程序缓存在本地时落盘的是.wxapkg文件。很多人第一反应是改后缀成.zip再解压结果要么报错要么出来一堆乱码。原因是 wxapkg 有自己的二进制格式文件头是固定标识0xBE开头的一段结构后面跟着索引段和数据段。索引段记录了每个文件的路径、偏移和长度数据段才是真正的文件内容。如果你直接当 zip 解压缩工具会按 zip 的中央目录去找自然找不到。常见做法是先用十六进制工具看一眼头部。用xxd或 HxD 打开一个 wxapkg前几个字节如果是be 00 00 00这类特征基本可以确认是标准 wxapkg 而不是加密过的。PC 微信不同版本对 wxapkg 的处理不一样早期版本直接就是明文 wxapkg后来部分版本会对包体做一次异或或 AES 处理这就是为什么压缩包里除了wxappUnpacker还带了解密这一步。2.2 解密和反编译是两件事别混着做这里必须把概念拆开否则后面步骤一定乱解密把微信落盘的、经过处理的包还原成标准 wxapkg。这一步针对的是包体被微信自己加密了。反编译把标准 wxapkg 里的wxml、wxss、js还原成接近源码的形态。这一步针对的是小程序编译产物不是人读的。wxappUnpacker主要干的是第二件事。它内部对wxml做的是类似 HTML 解析的还原对wxss做的是rpx转换和选择器还原对js做的是把微信打包时的模块包装拆开。所以如果你的包还是加密态直接喂给wxappUnpacker会报invalid header或者解出来是空目录。正确顺序永远是先解密、再反编译。2.3 环境准备Node 版本和依赖是第一个坎wxappUnpacker是 Node 写的对 Node 版本有要求。我一般用 Node 14 或 16太新的 Node 18 在某些esprima依赖上会翻车。先确认环境node -v npm -v如果版本太新用 nvm 切一下nvm install 16 nvm use 16然后进到工具目录装依赖。压缩包里的wxappUnpacker通常自带package.json直接cd wxappUnpacker npm install这里有个血泪经验如果npm install卡在esprima或escodegen编译多半是网络或 Node 版本问题不要反复重装先切 Node 版本再试。依赖装完后目录里应该能看到wu.js、wuWxml.js、wuWxss.js、wuJs.js这几个核心脚本它们分别对应总入口、wxml 还原、wxss 还原、js 还原。3. 从 PC 微信缓存定位到解密完整操作链路3.1 找到 PC 微信的小程序缓存目录PC 微信的小程序包不会放在安装目录而是在用户文档下。默认路径大致是C:\Users\你的用户名\Documents\WeChat Files\Applet\进到这个目录你会看到一堆以wx开头的十六进制命名文件夹每个文件夹对应一个小程序。判断哪个是你想要的看文件夹里的.wxapkg大小和修改时间或者直接按时间排序找最近打开的。每个小程序目录下通常有__APP__.wxapkg和若干分包xxx.wxapkg。提示操作前先把整个 Applet 目录复制一份出来别在原目录上直接改微信有时会回写缓存。3.2 判断包是否加密决定要不要先解密拿到.wxapkg后先看头部xxd __APP__.wxapkg | head -n 2如果开头是be 00 00 00这类说明是标准 wxapkg可以直接进反编译。如果开头是别的、或者整个文件看起来像被异或过就需要先跑解密脚本。压缩包里的解密工具一般是一个独立脚本用法通常是python decrypt.py __APP__.wxapkg或者带密钥参数python decrypt.py --key key __APP__.wxapkg具体参数以压缩包内脚本的--help为准不同版本微信的加密方式不一样密钥来源也不同。这一步是整个流程里最容易卡住的地方因为微信版本更新会改加密逻辑。如果解密脚本跑完还是报头不对先确认你的微信版本和脚本适配的版本是否一致。3.3 用 wxappUnpacker 反编译标准 wxapkg确认是标准包后进到wxappUnpacker目录执行node wu.js __APP__.wxapkg或者指定输出目录node wu.js -o ./output __APP__.wxapkg跑完后output目录里会出现还原后的工程结构典型长这样output/ app.js app.json app.wxss pages/ index/ index.wxml index.wxss index.js index.json components/ utils/如果只反编译单个文件可以用子脚本node wuWxml.js __APP__.wxapkg node wuWxss.js __APP__.wxapkg node wuJs.js __APP__.wxapkgwuWxml.js负责把编译后的 wxml 还原成带标签的模板wuWxss.js负责把rpx和压缩后的选择器还原wuJs.js负责拆模块包装。三个脚本可以单独跑方便你只关心某一类文件时省时间。3.4 分包怎么处理小程序有分包时主包和分包是分开的 wxapkg。wxappUnpacker默认只处理你传给它的那个包。正确做法是主包和分包分别反编译然后按app.json里的subPackages配置把目录合并。常见坑是只反编译了主包结果页面跳转过去发现文件缺失就是因为分包没处理。node wu.js __APP__.wxapkg node wu.js subpackage1.wxapkg node wu.js subpackage2.wxapkg合并时注意分包根目录名要和app.json里声明的一致否则路径对不上。4. 避坑与排查这几类报错我几乎每次都遇到4.1 报 invalid header 或解出来是空目录现象跑node wu.js直接抛异常或者输出目录是空的。原因包还是加密态或者你传的是分包但分包本身不完整。解决先用xxd看头部确认是不是标准 wxapkg。不是就先跑解密脚本。分包不完整的话回到微信重新打开一次对应页面让缓存重新落盘。4.2 wxml 还原后标签错乱、条件渲染丢失现象还原出来的 wxml 里wx:if、wx:for变成了一堆看不懂的表达式。原因微信编译时会把模板语法编译成运行时代码wxappUnpacker只能做尽力还原不是 100% 还原。解决接受这个现实重点看结构和数据绑定关系不要指望还原出和源码一模一样。需要精确逻辑时结合js里的setData调用反推。4.3 js 还原后变量名全是 a、b、c现象wuJs.js跑完js 里全是短变量名。原因小程序打包时会做压缩混淆变量名被缩短了。解决这是编译产物不是工具的问题。可以用js-beautify先格式化再结合调用关系人工还原关键函数。别指望自动还原变量名那需要 sourcemap而线上包一般不带。4.4 Node 版本导致的依赖报错现象npm install或node wu.js报esprima相关错误。原因Node 18 对某些老依赖不兼容。解决切到 Node 14 或 16。这是最省事的办法不要试图去改依赖源码。4.5 解密脚本跑完微信又覆盖了缓存现象明明解密成功了过一会再去看文件又变回加密态。原因微信在运行时会回写缓存。解决操作时把微信退出或者把 Applet 目录整个复制到别处再操作。我一般直接复制到桌面再处理避免和微信抢文件。5. 进阶把反编译结果跑起来和验证还原质量5.1 用微信开发者工具加载还原后的工程反编译出来的目录不能直接当源码工程跑因为缺少project.config.json和sitemap.json。手动补一个最小的project.config.json{ miniprogramRoot: ./, projectname: restored-app, appid: touristappid, setting: { urlCheck: false, es6: false, postcss: false, minified: false } }appid用测试号或 touristappidurlCheck关掉避免域名校验。然后用微信开发者工具导入项目指向这个目录。能打开说明还原质量基本过关打不开就看控制台报什么通常是某个json配置缺失或路径不对。5.2 验证还原质量的三个检查点检查点看什么合格标准页面结构wxml 标签是否闭合、层级是否合理能看出页面大致布局样式wxss 里 rpx 是否还原、选择器是否可读关键样式能对应上逻辑js 里 setData 的字段和 wxml 绑定是否对得上能追踪到数据流向这三个点过了说明这份反编译结果对分析页面结构和接口调用已经够用。如果要做更深的逻辑还原就得靠人工读 js 加断点调试工具帮不了太多。5.3 一个我常用的习惯每次拿到新包我不会直接上wxappUnpacker而是先做三件事复制缓存目录、xxd看头部、确认微信版本。这三步做完再决定要不要解密、用哪个脚本。从那以后我每次处理 PC 端小程序包都强制走一遍这个顺序省了很多返工。希望帮到你。本文还有配套的精品资源点击获取