教程
🛡️

网络安全

Web 安全、渗透测试、密码学与安全合规的系统化教程。

微信小程序:解包、反编译与抓包一条龙

微信小程序本质是套在微信里的网页应用,大量逻辑跑在前端。这篇讲小程序包 .wxapkg 的存放位置、从手机/电脑提取、用 wxappUnpacker 还原 wxml/wxss/js,以及如何对小程序做 HTTPS 抓包。

· 更新于 2026-07-19 阅读量 --

前面讲的都是原生 APP,但今天几乎每个业务都有微信小程序。小程序的特殊之处在于:它本质上是”跑在微信里的网页应用”,界面用类似 HTML 的 WXML、样式用 WXSS、逻辑用 JS,这些代码全在用户手机上。也就是说,小程序把大量业务逻辑直接交到了客户端手里,这让它成为安全分析的高价值目标。这一篇讲怎么把小程序”拆”开看。

本文仅用于你对自有或已授权的小程序做安全分析。对他人小程序做逆向、抓取其接口可能违反微信平台规则与相关法律。

小程序包是什么

你在微信里打开一个小程序,微信会把它从服务器下载到本地,存成一个个 .wxapkg 包。一个包里装着:小程序的全局配置、所有页面的 WXML/WXSS/JS、还有微信自己的基础库(WAService)。这些包是加密存储的(早期未加密,后来微信加了密),但解密思路社区早就摸清了。

关键点:小程序代码在本地,所以只要拿到 .wxapkg,就能还原出它的前端逻辑和调用的接口。相比原生 APP 还要脱壳,小程序往往”更薄”,分析门槛更低。

第一步:把包提取出来

包在哪?两条路径:

路径一:从安卓手机提

微信把小程序包放在类似这样的目录(需 root 或借助备份):

# 微信小程序包典型路径(不同版本略有差异)
/data/data/com.tencent.mm/MicroMsg/{用户hash}/appbrand/pkg/
# 里面是一堆 __APP__.wxapkg、{appid}__xxx.wxapkg

没有 root 的话,可以用手机自带的”备份”功能(ADB 备份或厂商备份)把微信数据备份出来,再在电脑上解备份提取;或者用一个小程序后,通过文件管理器的微信缓存目录找(部分机型无需 root 可读)。

路径二:从微信 PC 版提(最省事)

电脑版微信也会缓存小程序包,而且路径好找、常常还没那么严的加密:

# Windows
C:\Users\{用户名}\Documents\WeChat Files\{微信号}\Applet\{appid}\
# 里面就有 .wxapkg 文件

PC 版的好处是不用 root 手机,复制出来即可。实战里优先走这条路。

第二步:解包与反编译

拿到 .wxapkg 后,用社区工具还原。最经典的是 wxappUnpacker(以及它的各种 fork,如 unwxapkgwxapkg-convert):

# 安装依赖后,解包一个 wxapkg
node wuWxapkg.js -d output_dir app.wxapkg
# 输出目录里会出现:
#   app.json、app.wxss
#   pages/ 下每个页面的 .wxml .wxss .js .json

解出来后你看到的就是明文的 WXML(结构)、WXSS(样式)、JS(逻辑)。重点看 .js 文件:

  • 里面通常有 wx.request({ url: 'https://...' }),这就是小程序调用的后端接口,直接暴露;
  • 可能有写死的密钥、token、加密盐;
  • 业务逻辑(比如怎么算签名、怎么判断会员)全在前端,一览无余。

有些新版 .wxapkg 加密更强,直接用老工具解不开,需要先用对应版本的解密脚本(按微信基础库版本选工具)把包解密,再解包。社区工具迭代很快,遇到解不开先确认微信版本、找对应 fork。

第三步:对小程序抓包

光看代码有时不够,还想看它实际发了什么。小程序走的是微信的网络层,抓包思路和原生 APP 类似,但更顺:

  1. 手机和电脑同网段,设代理到 Burp(电脑 IP:8080);
  2. 关键一步:让微信信任 Burp 的 CA。安卓上把 Burp 证书装进系统信任区(或用 Magisk 模块),否则小程序请求会被拦;
  3. 打开小程序操作,Burp 里就能看到它发出的 HTTPS 请求。

小程序的请求域名必须在微信后台”合法域名”里配置才能发,但这只限制”能否发出”,不限制你抓。而且很多小程序在开发阶段留了 requesturl 写死 IP 或测试域名,抓包时一眼就能看到测试环境。

提示:部分小程序做了证书绑定(和原生 APP 同理),抓不到时回顾上一篇的 Frida/Objection 绕过思路,对微信进程或小程序基础库 Hook 即可。

小程序分析的”黄金三点”

总结一下小程序高价值发现通常集中在这三处:

  • 接口暴露.js 里的 wx.request 把后端地址和路径全写出来,顺藤摸瓜能摸完整套 API。
  • 前端鉴权逻辑:会员、付费、签到等判断如果只在前端做(比如 if (user.vip) show()),改个返回值就能绕过——这是典型的前端越权。
  • 硬编码秘密:AppSecret、密钥、加密参数写在前端代码,等于公开。

这三点恰好说明一个道理:凡是放在客户端的东西,都默认不可信。小程序把逻辑放前端,方便开发,也方便分析。

常见坑

  • 只找主包:一个小程序可能拆成主包 + 多个分包(subPackage),每个分包一个 .wxapkg,漏掉就看不到部分页面。记得把 pkg/ 目录里相关 appid 的包都拿来。
  • 加密 wxapkg 解不开:确认微信版本,换对应解密工具,别死磕一个老脚本。
  • 混淆的 JS:小程序 JS 也可能被压缩混淆,变量名难读,但接口字符串和 wx.request 调用通常保留,照样能定位。

从小程序看”客户端不可信”的硬道理

小程序的分析之所以高产,根子在一个被反复验证的原则:凡是放在客户端的东西,都默认不可信。小程序把接口地址、鉴权判断、甚至密钥都交到前端,本质上是把信任押在了”用户不会去看代码”上——可只要有人看,这一切就透明了。这个教训不只适用于小程序,适用于所有前端:网页、APP、桌面客户端都一样。

对开发者来说,小程序安全的底线很清晰。第一,密钥和盐值绝不能写在前端,需要签名就用服务端下发一次性凭证;第二,会员、付费、权限这些判断必须在服务端做,前端只负责”展示”,不能负责”裁决”;第三,接口要做鉴权和越权校验,别因为”前端不会乱调”就省略——前端当然会乱调,而且会被脚本批量乱调;第四,敏感数据脱敏后再下发,别把别人的信息随接口一锅端出去。

站在测试者角度,小程序是性价比极高的练手对象:门槛低(不用 root、不用脱壳)、信息密(逻辑全在前端)、危害直观(改个返回值就能看效果)。把它当成理解”客户端不可信”的第一课,会让你在后续面对原生 APP、Web 前端时,本能地去问”这个判断在服务端做了吗”。安全意识的建立,往往就从这一个追问开始。

顺带提醒一个操作细节:从小程序 PC 版目录提包时,注意区分”主包”和”分包”对应的文件,它们的命名里常带不同标识,别只拿最大的那个。另外微信版本升级会改变包的加密方式,今天能解的工具,下个版本可能就失效,这是小程序逆向里最磨人的地方。保持工具库更新、多备几个 fork 版本,遇到解不开时换一个试试,往往比死磕一个脚本更省力。逆向本就是和平台更新赛跑,心态放平最重要。

这一篇你该记住的

  • 小程序是跑在微信里的网页应用,逻辑大量在前端,分析价值高。
  • 代码以 .wxapkg 形式缓存在手机或微信 PC 版,提取无需一定 root(PC 版最方便)。
  • 用 wxappUnpacker 等工具把包还原成 WXML/WXSS/JS,重点看 JS 里的 wx.request 接口与硬编码秘密。
  • 抓包要装 Burp CA 到系统信任区,遇证书绑定用 Frida 绕过。
  • 黄金三点:接口暴露、前端鉴权、硬编码秘密——都是”客户端不可信”的体现。

APP 和小程序的分析套路讲得差不多了,下一篇我们把信息收集、证书绕过、反编译、抓包串成一次完整实战,看看一个真实测试流程长什么样。