微信小程序反编译介绍
文章转载于https://misakikata.github.io/2021/03/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E8%A7%A3%E5%8C%85/
前言
微信小程序在实际运行中并不会直接下发源码,
而是以 .wxapkg 的形式分发到客户端。
当需要进行代码分析、安全研究或技术学习时,
就不可避免地会涉及到小程序的反编译与解包过程。
本文记录一次完整的微信小程序反编译流程, 包括小程序包的获取、Windows 版加密机制说明、 wxapkg 解密与解包,以及解包后代码结构的分析。
本文仅用于技术研究与安全学习,请勿用于任何非法用途。
小程序包的位置说明
这里以 Windows 版微信 为例进行说明, Windows 与移动端的小程序包结构略有差异。
Windows 版微信小程序包的默认存储位置为:
C:\Users\user\Documents\WeChat Files\Applet
该目录下可以看到多个以 wx 开头的文件夹,
每一个文件夹对应一个小程序 ID。
如果不清楚目标小程序的 ID,
可以清空目录后重新打开小程序,
再按时间排序即可定位。
(移动端路径一般为:
/data/data/com.tencent.mm/MicroMsg/{id}/appbrand/pkg,
本文不做演示。)
Windows 版 wxapkg 的加密说明
Windows 版微信在原始 wxapkg 外,
额外增加了一层加密,
文件名通常为 __APP__.wxapkg。
该文件的文件头包含 V1MMWX 标识,
表示这是经过 Windows 客户端二次加密的包,
需要先解密才能继续分析。
wxapkg 解密流程概述
Windows 版小程序包的解密流程大致如下:
- 使用 pbkdf2 生成 AES Key
- pass 为小程序 AppID 字符串
- salt 固定为
saltiest,迭代 1000 次 - 生成 32 字节 AES Key
- 对原始包前 1024 字节进行 AES 加密
- 后续数据使用 AppID 倒数第二位进行 XOR
- 最终写入文件并添加
V1MMWX文件头
解密完成后, 即可得到一个以小程序 AppID 命名的原始 wxapkg 文件。
wxapkg 解密工具
可以使用以下开源工具完成 Windows 版 wxapkg 解密:
- pc_wxapkg_decrypt(Go): https://github.com/BlackTrace/pc_wxapkg_decrypt
项目中已提供编译好的可执行文件, 直接使用即可完成解密。
小程序解包
wxapkg 并不是常规压缩格式, 需要使用专门的解包工具解析其二进制结构。
常见的解包方式包括:
- Python 解包脚本: gist.github.com/Integ/...
- Node.js 解包工具: wxappUnpacker
解包完成后, 会生成一个以小程序 ID 命名的目录, 即小程序的“源码结构包”。
解包后的小程序结构说明
解包后的目录通常包含以下核心文件:
app-service.js:所有 JS 逻辑的汇总文件app-config.json:汇总后的 app.json 与页面配置page-frame.html:所有页面的 WXML 与 WXSS 汇总static:图片、音频等静态资源
需要注意的是, 此时的代码仍然是高度压缩和混合的, 与开发阶段的源码结构存在明显差异, 需要进一步分析与拆解。
解包源码的实际风险点
在分析过程中, 经常可以发现一些不安全的实现方式, 例如:
- 将 AppID 和 Secret 写在小程序代码中
- 云函数权限配置不当
- 接口鉴权逻辑完全放在前端
如果 AppID 和 Secret 可用,
攻击者可以通过官方接口获取 access_token,
进而调用小程序后台接口。
技术与合规说明
微信小程序反编译涉及较多技术细节, 同时也存在明确的法律与合规边界。
本文仅用于技术研究、安全学习和架构理解, 不鼓励、不支持任何形式的非法使用。
转载说明
本文内容整理自公开技术资料与个人学习记录, 部分内容参考并整理自网络文章, 仅用于技术交流与学习。
如涉及版权问题, 请联系作者处理。
