【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 源码提取

位置查找

  1. 打开Windows版微信
  2. 打开待测试的小程序
  3. 点击设置-文件管理-打开文件夹
  4. 在WeChat Files目录下的Applet文件夹中查找以"wx"开头的文件夹
  5. 其中__APP__.wxapkg为加密后的文件

区分方法

  • 按修改时间区分
  • 删除所有浏览过的小程序后重新打开目标小程序

小程序解密

加密方法:

  1. 使用pbkdf2生成AES的key:
    • pass:微信小程序id字符串
    • salt:"saltiest"
    • 迭代次数:1000
    • 生成32位key
  2. 取原始wxapkg包的前1023字节,通过AES和生成的key、iv(16 bytes)进行加密
  3. 使用微信小程序id字符串的倒数第2个字符为xor key,异或1023字节后的所有数据
    • 如果id小于2位,则xorkey为0x66
  4. 将AES加密后的数据(1024字节)和xor后的数据一起写入文件,并添加"V1MMWX"标识

解密工具:UnpackMiniApp.exe

  • 选择加密小程序包(__APP__.wxapkg
  • 解密后的文件生成在wxpack文件夹中

注意:不能移动待测试的__APP__.wxapkg文件,否则会导致无法识别APPID而解密失败。

3.3 wxapkg包文件结构

使用010Editor查看,包含三部分:

头部段

  • 以"BE"开头,"ED"结尾
  • 包含4个"00"空白填充
  • 索引段长度块、数据段长度块各四位
  • 固定长度14字节

索引段

  1. 前4字节:包内文件数量(如"00 00 00 5F"表示95个文件)
  2. 文件信息:
    • 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"形式存在对应页面目录

推荐工具

  1. wxappUnpacker
    node wuWxapkg.js xxxxxx.wxapkg
    
  2. wxapkgconvertor
    • 直接将wxapkg包拖入程序窗口
    • 在同目录下生成同名项目文件夹

3.5 常见问题处理

存在分包(多个.wxapkg文件)

  • 分别解密、反编译
  • 将结果拼合到同一目录下

使用wxappUnpacker后部分文件未成功反编译

  1. 拆分app-config.json:
    node wuConfig.js <path/to/app-config.json>
    
  2. 拆分app-service.js:
    node wuJs.js <path/to/app-service.js>
    
  3. 从page-frame.html提取.wxml和.wxss:
    node wuWxml.js [-m] <path/to/page-frame.html>
    
  4. 从page.html提取page.wxss:
    node wuWxss.js <path/to/unpack_dir>
    

导入开发者工具后报错

  1. "app.js错误:TypeError: _typeof3 is not a function"

    • 修改@babel/runtime/helpers/typeof.js
    • 替换为指定代码(见原文)
  2. "依赖异常"

    • 对比已还原的目录结构
    • 删除调用代码中多余路径

四、安全风险与漏洞

4.1 信息泄露

敏感信息:AppSecret、特权账号信息、加密密钥、账户密码、用户身份证号、手机号、银行卡号等。

检测方法

  • 使用开发者工具搜索关键字:"appid"、"key"、"phone"等
  • 特别关注AppID与AppSecret泄露(2022-06-02前开发的小程序可能存在)

利用方法

4.2 SQL注入

原理:用户提交的参数未有效过滤就直接拼接到SQL语句中执行。

测试方法

  1. 配置Proxifier:
    • 设置HTTPS代理(127.0.0.1:自定义端口)
    • 添加规则:程序"wechatappex.exe",动作为代理服务器
  2. 配置BurpSuite:
    • 代理服务器端口与Proxifier设置一致
  3. 对小程序功能点进行SQL注入测试

4.3 弱口令

检测方法

  • 审计代码发现回连域名
  • 尝试常见弱口令组合(如admin/123456)

五、开发安全原则

  1. 互不信任原则:不信任用户提交的数据,包括第三方系统数据,关键校验必须放在后台
  2. 最小权限原则:代码、模块只拥有完成任务所需的最小权限
  3. 敏感数据保护:禁止明文保存用户敏感数据
  4. 业务逻辑安全
    • 重要业务逻辑应放在后台代码或云函数中
    • 小程序代码可被反混淆,不适合存放关键逻辑
  5. 接口安全
    • 后台接口和云函数调用必须进行有效身份鉴权
    • 使用HTTPS等安全传输协议

六、总结

本教程详细介绍了微信小程序的逆向分析方法,包括:

  • 小程序基础架构和文件结构
  • 源码提取和解密技术
  • 反编译工具使用和问题解决
  • 常见安全漏洞检测方法
  • 开发安全最佳实践

通过掌握这些技术,安全研究人员可以有效地评估小程序的安全性,开发者则可以按照安全原则构建更安全的小程序应用。

微信小程序逆向分析实战教程 一、小程序基础概念 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 wxapkgconvertor 直接将wxapkg包拖入程序窗口 在同目录下生成同名项目文件夹 3.5 常见问题处理 存在分包(多个.wxapkg文件) 分别解密、反编译 将结果拼合到同一目录下 使用wxappUnpacker后部分文件未成功反编译 拆分app-config.json: 拆分app-service.js: 从page-frame.html提取.wxml和.wxss: 从page.html提取page.wxss: 导入开发者工具后报错 "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等安全传输协议 六、总结 本教程详细介绍了微信小程序的逆向分析方法,包括: 小程序基础架构和文件结构 源码提取和解密技术 反编译工具使用和问题解决 常见安全漏洞检测方法 开发安全最佳实践 通过掌握这些技术,安全研究人员可以有效地评估小程序的安全性,开发者则可以按照安全原则构建更安全的小程序应用。