【Web实战】零基础微信小程序逆向
字数 3683 2025-08-10 08:28:42
微信小程序逆向分析实战教程
一、小程序基础概念
1.1 什么是小程序?
小程序是中国特有的一种程序形态,由腾讯、百度、阿里巴巴、字节跳动、京东等互联网大厂各自构建生态平台。与传统的APP开发相比,小程序具有以下特点(以微信为例):
| 特性 | 微信小程序 | 传统APP |
|---|---|---|
| 下载安装 | 通过微信(扫描二维码、搜索、分享)即可获得 | 从应用商店(App Store、应用汇等)下载安装 |
| 内存占用 | 无需安装,和微信共用内存 | 安装于手机内存,一直占用内存空间 |
| 手机适配 | 一次开发,多终端适配 | 需适配各种主流手机,开发成本大 |
| 产品发布 | 提交到微信公众平台审核 | 向多个应用商店提交审核,流程繁琐 |
| 功能限制 | 限于微信平台提供的功能 | 可充分利用硬件资源,功能更强大 |
| 传输要求 | 必须使用HTTPS,且绑定域名需要备案 | HTTPS传输可选 |
| 开发背景 | 适合初创团队,试错成本低 | 适合成熟的商业大公司 |
1.2 微信小程序架构
整个小程序框架系统分为两部分:逻辑层(App Service)和视图层(View)。
逻辑层(App Service)
- 使用JavaScript引擎为小程序提供运行环境
- 处理数据并发送给视图层,接收视图层的事件反馈
- 所有代码最终打包成一份JavaScript文件,在小程序启动时运行
- 增加的功能:
- App和Page方法进行程序注册和页面注册
- getApp和getCurrentPages方法获取实例
- 提供微信特有API(用户数据、扫一扫、支付等)
- 模块化能力,每个页面有独立作用域
注意:小程序逻辑层并非运行在浏览器中,因此无法使用window、document等web能力。
视图层(View)
- 由WXML与WXSS编写,由组件展示
- 文件类型:
- WXML(WeiXin Markup language):描述页面结构
- WXS(WeiXin Script):小程序脚本语言
- WXSS(WeiXin Style Sheet):描述页面样式
- Component:视图的基本组成单元
1.3 小程序目录结构
主体文件(必须放在根目录)
| 文件 | 必需 | 作用 |
|---|---|---|
| app.js | 是 | 小程序逻辑 |
| app.json | 是 | 小程序公共配置 |
| app.wxss | 否 | 小程序公共样式表 |
页面文件
| 文件类型 | 必需 | 作用 |
|---|---|---|
| js | 是 | 页面逻辑 |
| wxml | 是 | 页面结构 |
| json | 否 | 页面配置 |
| wxss | 否 | 页面样式表 |
注意:描述页面的四个文件必须具有相同的路径与文件名。
二、测试准备
2.1 所需系统
- Windows系统
2.2 常用工具
| 工具名称 | 用途 | 下载地址 |
|---|---|---|
| wxappUnpacker | 小程序源代码获取工具 | GitHub |
| wxapkgconvertor | 小程序源代码获取工具 | GitHub |
| UnpackMiniApp | 小程序解密工具 | - |
| 微信开发者工具 | 调试获取的小程序代码 | 官方下载 |
| BurpSuite | 抓包分析测试 | 官网 |
| Proxifier | 流量代理 | 官网 |
三、测试流程
3.1 小程序搜索
- 微信官方小程序界面搜索
- 使用0.zone平台(可自动采集目标企业APP列表等信息)
3.2 源码提取
位置查找
- 打开Windows版微信
- 打开待测试的小程序
- 点击设置-文件管理-打开文件夹
- 在WeChat Files目录下的Applet文件夹中查找以"wx"开头的文件夹
- 其中
__APP__.wxapkg为加密后的文件
区分方法:
- 按修改时间区分
- 删除所有浏览过的小程序后重新打开目标小程序
小程序解密
加密方法:
- 使用pbkdf2生成AES的key:
- pass:微信小程序id字符串
- salt:"saltiest"
- 迭代次数:1000
- 生成32位key
- 取原始wxapkg包的前1023字节,通过AES和生成的key、iv(16 bytes)进行加密
- 使用微信小程序id字符串的倒数第2个字符为xor key,异或1023字节后的所有数据
- 如果id小于2位,则xorkey为0x66
- 将AES加密后的数据(1024字节)和xor后的数据一起写入文件,并添加"V1MMWX"标识
解密工具:UnpackMiniApp.exe
- 选择加密小程序包(
__APP__.wxapkg) - 解密后的文件生成在wxpack文件夹中
注意:不能移动待测试的__APP__.wxapkg文件,否则会导致无法识别APPID而解密失败。
3.3 wxapkg包文件结构
使用010Editor查看,包含三部分:
头部段
- 以"BE"开头,"ED"结尾
- 包含4个"00"空白填充
- 索引段长度块、数据段长度块各四位
- 固定长度14字节
索引段
- 前4字节:包内文件数量(如"00 00 00 5F"表示95个文件)
- 文件信息:
- 4字节:文件名称长度(如"00 00 00 16"表示22字节)
- 文件名:带存放路径(如"2F 72 65 6F...... 2E 70 6E 67")
- 4字节:文件在小程序包中的偏移位置(如"00 00 11 7C")
- 4字节:文件数据长度(如"00 01 01 F7")
数据段
存储文件内容,与索引段信息对应
3.4 小程序反编译
微信服务器会将源码文件压缩合并:
- 所有"js"文件 → "app-service.js"
- 所有"json"文件 → "app-config.json"
- 所有"wxml"文件 → "page-frame.html"
- "wxss"文件 → 处理后以"html"形式存在对应页面目录
推荐工具:
- wxappUnpacker
node wuWxapkg.js xxxxxx.wxapkg - wxapkgconvertor
- 直接将wxapkg包拖入程序窗口
- 在同目录下生成同名项目文件夹
3.5 常见问题处理
存在分包(多个.wxapkg文件)
- 分别解密、反编译
- 将结果拼合到同一目录下
使用wxappUnpacker后部分文件未成功反编译
- 拆分app-config.json:
node wuConfig.js <path/to/app-config.json> - 拆分app-service.js:
node wuJs.js <path/to/app-service.js> - 从page-frame.html提取.wxml和.wxss:
node wuWxml.js [-m] <path/to/page-frame.html> - 从page.html提取page.wxss:
node wuWxss.js <path/to/unpack_dir>
导入开发者工具后报错
-
"app.js错误:TypeError: _typeof3 is not a function"
- 修改
@babel/runtime/helpers/typeof.js - 替换为指定代码(见原文)
- 修改
-
"依赖异常"
- 对比已还原的目录结构
- 删除调用代码中多余路径
四、安全风险与漏洞
4.1 信息泄露
敏感信息:AppSecret、特权账号信息、加密密钥、账户密码、用户身份证号、手机号、银行卡号等。
检测方法:
- 使用开发者工具搜索关键字:"appid"、"key"、"phone"等
- 特别关注AppID与AppSecret泄露(2022-06-02前开发的小程序可能存在)
利用方法:
- 访问微信开放平台调试工具
- 结合小程序代码和接口文档进行进一步利用
4.2 SQL注入
原理:用户提交的参数未有效过滤就直接拼接到SQL语句中执行。
测试方法:
- 配置Proxifier:
- 设置HTTPS代理(127.0.0.1:自定义端口)
- 添加规则:程序"wechatappex.exe",动作为代理服务器
- 配置BurpSuite:
- 代理服务器端口与Proxifier设置一致
- 对小程序功能点进行SQL注入测试
4.3 弱口令
检测方法:
- 审计代码发现回连域名
- 尝试常见弱口令组合(如admin/123456)
五、开发安全原则
- 互不信任原则:不信任用户提交的数据,包括第三方系统数据,关键校验必须放在后台
- 最小权限原则:代码、模块只拥有完成任务所需的最小权限
- 敏感数据保护:禁止明文保存用户敏感数据
- 业务逻辑安全:
- 重要业务逻辑应放在后台代码或云函数中
- 小程序代码可被反混淆,不适合存放关键逻辑
- 接口安全:
- 后台接口和云函数调用必须进行有效身份鉴权
- 使用HTTPS等安全传输协议
六、总结
本教程详细介绍了微信小程序的逆向分析方法,包括:
- 小程序基础架构和文件结构
- 源码提取和解密技术
- 反编译工具使用和问题解决
- 常见安全漏洞检测方法
- 开发安全最佳实践
通过掌握这些技术,安全研究人员可以有效地评估小程序的安全性,开发者则可以按照安全原则构建更安全的小程序应用。