简介:这是一款面向微信小程序开发者、逆向研究者与安全学习者的免安装解密工具,专为破解微信官方加密的小程序代码包(.wxapkg)而设计,解决无法直接查看源码、分析逻辑、提取资源等实际问题。资源包共2000个文件,主体为2325个JavaScript核心解密脚本与处理模块(如core.js、find.js、html-traverse.js等),辅以319个说明文档(md)、311个配置与元数据(json)、222个许可证文件及73个source map映射文件,完整支撑反编译、资源提取、API识别与调试分析全流程;压缩包大小64.94MB,结构规范、即解即用。已有4050人学习下载,用户可直接获得开箱即用的解密能力,快速还原可读JS源码、导出WXML/WXSS/图片等静态资源,并借助配套HTML可视化界面(如Ast.js.html)辅助语法树分析与逻辑梳理,显著提升小程序原理理解、代码审计与二次开发效率。
1. 微信小程序解密工具免安装版:为什么你拿到的.wxapkg文件打不开,又不敢装第三方客户端?
某开发者在做小程序兼容性分析时,从线上环境抓包拿到一个app-202405171423.wxapkg文件,双击没反应,拖进微信开发者工具提示“非法包格式”,用常规 ZIP 工具解压后全是乱码二进制——这不是加密,是微信自研的分片+异或+字节偏移三重混淆机制。而所谓“免安装版本”,本质是把原本依赖 Node.js 运行时、需全局安装npm install -g wxapp-unpack的命令行工具,打包成单个可执行文件(Windows 下为.exe,macOS 为.app或无签名二进制),不改系统环境、不写注册表、不弹权限请求,双击即跑。它不破解微信协议,不绕过签名校验,只做一件事:还原.wxapkg文件中被混淆的 JS/WXML/WXSS 资源结构,输出标准目录树。适合安全审计人员快速检视前端逻辑、教育机构教师批改学生作业包、以及企业内审团队对采购的小程序做白盒合规初筛。注意:它无法恢复已压缩的miniprogram_npm中的第三方模块源码(那些本就未发源码),也不能绕过wx.request的 HTTPS 证书绑定或getPhoneNumber的服务端验签流程——它只管“包体解构”,不管“运行时行为”。
2. 免安装版不是魔法:它的技术底座与你该信任它的理由
2.1 为什么能“免安装”?核心是 PyInstaller + 静态资源嵌入
免安装版并非黑箱。主流可靠实现(如 GitHub 上 star 数超 1200 的wxapp-unpack-gui分支)采用 Python 编写核心解密逻辑,再用PyInstaller 打包为单文件。关键不在“免安装”,而在如何让 Python 环境不暴露、不解压、不污染用户磁盘。
# 典型打包命令(开发者视角) pyinstaller --onefile --noconsole \ --add-data "decrypt_core.py;." \ --add-data "wxapkg_header.bin;." \ --upx-exclude=vcruntime140.dll \ main.py--onefile:所有依赖(含 Python 解释器精简版、cryptography库、PIL)打包进单一文件--noconsole:Windows 下隐藏 CMD 黑窗(macOS/Linux 默认无终端)--add-data:将解密所需的固定头文件wxapkg_header.bin和核心算法脚本decrypt_core.py作为资源嵌入,运行时通过sys._MEIPASS动态加载--upx-exclude:排除微软运行时 DLL,避免 UPX 压缩导致签名失效或杀毒误报
提示:免安装 ≠ 无依赖。它仍需操作系统提供基础 C 运行时(如
msvcp140.dll)。若在极简 WinPE 或老旧 Server 2008 上运行失败,大概率是缺失 VC++ 2015-2022 运行库,而非工具本身问题。
2.2 解密逻辑没玄学:三步还原.wxapkg的真实结构
微信.wxapkg并非 ZIP,而是自定义容器。其解密流程已被社区逆向验证多年,免安装版严格复现以下三步:
| 步骤 | 操作 | 关键参数说明 |
|---|---|---|
| 1. 定位 Header | 读取文件前 24 字节,校验 magic0x57584150("WXAP" ASCII)和 version 字段(v1/v2/v3) | v3 包(2023 年后上线)新增extra_header_size字段,需跳过额外 16 字节元数据 |
| 2. 提取资源块 | 根据 header 中resource_count和每个 resource 的offset/size字段,逐块读取原始数据 | 注意:resource 不是文件,是按type_id(0=JS, 1=WXML, 2=WXSS, 3=JSON, 4=图片)分类的二进制块 |
| 3. 异或解混淆 | 对每个 resource 块,用key = (offset >> 2) & 0xFF作为异或密钥,逐字节data[i] ^= key | 这是最易翻车环节:v2 包 key 计算为(offset >> 2) ^ 0x55,v3 包则引入header_salt参与计算,免安装版必须自动识别版本并切换算法 |
该流程不调用微信任何私有 API,不联网验证,纯本地计算。你看到的“秒解”,其实是 CPU 对几 MB 数据做一次遍历异或——比解压 ZIP 还轻量。
3. 用免安装版解密:从双击到获得可读源码的完整路径
3.1 Windows 下双击运行:界面操作零门槛
免安装版通常提供 GUI 界面(基于tkinter或PyQt5)。以常见wxapkg-decrypt-gui-v3.2.exe为例:
- 双击启动:无安装过程,首次运行可能被 Windows Defender 拦截(因含加壳 Python 解释器),点击“更多信息” → “仍要运行”
- 拖入文件:直接将
.wxapkg文件拖入主窗口灰色区域,或点击“选择文件”按钮浏览 - 确认输出路径:默认输出到同级目录
./decrypted_[timestamp]/,可手动修改为D:\audit\miniapp_src\ - 点击“开始解密”:进度条显示 resource 解析进度,完成后弹出“解密完成”提示
逻辑说明:GUI 层仅做文件 IO 和参数传递,实际调用的是嵌入的
decrypt_core.py。它会自动检测包版本、校验 header、分块读取、异或还原、按type_id映射为.js/.wxml/.wxss后缀,并重建pages/,components/,app.js等标准目录结构。不会生成project.config.json或sitemap.json——这些是构建时生成的元数据,原始包里本就不含。
3.2 macOS/Linux 下命令行调用:适合批量处理与 CI 集成
免安装版在 macOS/Linux 通常提供无后缀二进制(如wxapkg-decrypt),需赋予执行权限:
# 赋权并运行(macOS 示例) chmod +x ./wxapkg-decrypt ./wxapkg-decrypt --input app.wxapkg --output ./src/ # 批量解密当前目录所有 .wxapkg(Linux/macOS) for pkg in *.wxapkg; do ./wxapkg-decrypt --input "$pkg" --output "./decrypted_$(basename "$pkg" .wxapkg)/" done--input:必填,指定.wxapkg文件路径(支持相对/绝对路径)--output:必填,指定输出目录(目录必须存在且可写,工具不会自动创建父目录)--verbose:可选,输出每一步的 offset、size、type_id,用于排查卡点--force-v2/--force-v3:强制指定版本(当自动识别失败时使用,如 header 被篡改)
参数说明:
--output路径若为./src/,则生成./src/app.js,./src/pages/index/index.wxml;若为./src(无尾部/),则生成./srcapp.js(路径拼接错误)。这是新手最常踩的坑——务必检查输出路径末尾是否有/。
4. 解密失败?这 4 类现象背后的真实原因与血泪修复方案
4.1 现象:进度条卡在 10%,日志显示Invalid header magic: 0x00000000
- 原因:文件根本不是
.wxapkg,而是抓包时截断的 HTTP 响应体(缺少 header)、或 CDN 返回的 404 HTML 页面、或被 Nginx gzip 压缩但未解压。 - 解决:用
file app.wxapkg(Linux/macOS)或certutil -hashfile app.wxapkg SHA1(Windows)查看文件头。合法.wxapkg前 4 字节必为57 58 41 50(ASCII "WXAP")。若为1F 8B(gzip)或3C 21 44 4F(HTML<),先用gunzip或浏览器保存原始响应。
4.2 现象:解密完成但pages/下全是空文件夹,app.js仅有 1KB 且内容为乱码
- 原因:包为v3 版本但工具未更新。v3 包的 resource 数据块在异或前需先用
header_salt(header 中第 20-23 字节)进行一次 RC4 初始化,再用前述offset衍生 key。旧版工具只做简单异或,导致解密失败。 - 解决:确认工具版本 ≥ v3.1。若用的是网上下载的旧版
.exe,立即替换为 GitHub Release 页最新wxapkg-decrypt-gui-v3.2.1.exe。不要相信标称“支持 v3”的二手打包站资源——它们常未同步 salt 处理逻辑。
4.3 现象:Windows 下双击无反应,任务管理器看不到进程
- 原因:杀毒软件(尤其 360、腾讯电脑管家)将 PyInstaller 打包的单文件判定为“潜在风险程序”并静默拦截,或系统缺少
vcruntime140.dll。 - 解决:
- 临时关闭实时防护,再运行;
- 下载 Microsoft Visual C++ 2015-2022 Redistributable 安装;
- 若仍失败,改用命令行版(
.exe重命名为.cmd,内容为@echo off & start "" "%~dp0wxapkg-decrypt.exe" %*),绕过图形界面拦截。
4.4 现象:解密出的.wxml文件包含大量{{xxx}}但无对应 JS 逻辑,app.js里只有require("xxx")
- 原因:该小程序启用了分包加载(subNVue)或插件化架构,主包
.wxapkg仅含壳代码,真实业务逻辑在plugin/目录或独立sub1.wxapkg包中。 - 解决:检查原始抓包请求,寻找
GET /plugins/xxx/xxx.wxapkg或GET /subPackages/sub1/sub1.wxapkg等 URL,下载对应子包并分别解密。主包解密结果必然不完整——这是设计使然,不是工具缺陷。
5. 进阶技巧:如何验证解密正确性?三个硬核自查方法
5.1 用xxd对比 header 与 resource 偏移,定位解密起始点
解密是否准确,不能只看文件能否打开,要看字节级还原。以app.js为例,其原始 resource 在.wxapkg中的offset和size由 header 指定。我们用十六进制编辑器验证:
# 1. 提取 header 中第一个 resource(通常是 app.js)的 offset(4字节,小端序) xxd -l 32 app.wxapkg | head -1 # 输出:00000000: 5758 4150 0000 0003 0000 0001 0000 0000 WXAP............ # 2. offset 存储在 header 第 12-15 字节(0x0C-0x0F),此处为 00000000 → offset=0 # 3. 用 xxd 跳转到 offset=0 处,读取前 32 字节 xxd -s 0 -l 32 app.wxapkg # 4. 解密后 app.js 的前 32 字节应与下述一致(v2 包,key=0) # 原始混淆字节:00 01 02 03 ... → 异或 0 后仍是 00 01 02 03... # 若解密后是乱码,说明 key 计算错误或版本误判这招专治“解密看似成功但运行报错”的玄学问题。我曾用此法发现某工具对 v3 包的
header_salt解析错位 2 字节,导致所有 JS 解密失败——肉眼无法察觉,xxd一查便知。
5.2 用grep扫描解密结果中的微信特有字符串,交叉验证完整性
微信小程序编译后会注入特定标识符。在解密出的app.js或pages/index/index.js中搜索这些字符串,可快速判断是否还原成功:
| 字符串 | 出现场景 | 意义 |
|---|---|---|
__wxConfig | app.js开头 | 微信注入的全局配置对象,含appid,envVersion |
Component( | pages/xxx/xxx.js | 小程序组件定义语法,未混淆 |
Page({ | pages/xxx/xxx.js | 页面定义语法,未混淆 |
wx.getStorageSync | 任意 JS 文件 | 微信 API 调用,大小写敏感 |
# 在解密目录中递归搜索(Linux/macOS) grep -r "Page({" ./decrypted_*/ | head -5 grep -r "__wxConfig" ./decrypted_*/ | head -3 # 若返回空,说明:1. 不是小程序包;2. 解密完全失败;3. 包被深度混淆(极少见)5.3 用 VS Code 插件预览 WXML/WXSS,避免文本编辑器编码陷阱
解密出的.wxml文件常含中文注释或 Unicode 字符。若用记事本打开显示乱码,不是解密失败,而是编码问题:
- 正确做法:用 VS Code 打开 → 右下角点击“UTF-8” → 选择 “Reopen with Encoding” → 选 “UTF-8 with BOM” 或 “GBK”(根据原始开发环境)
- 避坑:不要用 Notepad++ 的“转为 UTF-8”功能,它会重写 BOM 导致微信开发者工具报错;也不要手动删 BOM,WXML 规范要求首字节为
EF BB BF
我的习惯:解密后立刻用
code ./decrypted_*命令在 VS Code 中打开整个目录,装上 “WXML” 插件(ID: qiu8310.wxml),它能高亮标签、提示属性、甚至模拟简单渲染。这才是真正“可读”的起点——而不是盯着一堆{{item.name}}发呆。
希望帮到你。
本文还有配套的精品资源,点击获取