跳转至

微信小程序渗透

小程序相较于APP来说:

  • 对用户具有:无需安装,多终端适配,占用内存小等优点
  • 对创作者有:适合初创团队,试错成本低,需要较少时间和资金投入优点

小程序架构

整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View)。小程序提供了自己的视图层描述语言 WXML 和 WXSS,以及基于JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑。

视图层由 WXML 与 WXSS 编写,由组件来进行展示。将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。

逻辑层主要的组成部分是由 **app.js、app.json、js 文件、json 配置文件**等组成,因此测试过程中主要分析的对象就是这一些。

网络传输渗透

主要为抓包、改包测试,抓包可配合Proxifier等工具,其余与常规Web测试方法相同,不再赘述

小程序源码分析

源码解密及提取

定位

Windows
  • 微信旧版本(PC端版本小于4.0)

点击 设置——文件管理

点击进入Applet文件夹,以wx开头的即为小程序的文件夹

该文件下加载过所有的小程序的文件夹,可以把该文件夹下的wx开头的文件删除后,再重新加载小程序,其中__APP__.wxapkg为小程序加密后的文件

  • 微信新版本(PC端版本大于等于4.0)

image-20250914221742658

在微信更新至4.0版本后,系统会在原有的WeChat Files文件夹基础上创建xwechat_files文件夹。虽然看起来占用了两份空间,但实际上它们是链接的,只有一份实际的存储空间

image-20250914223831258

image-20250914223850431

在该目录下,并不存在applet目录,所以小程序并没有放在此处,此时我们可以用文件搜索"applet",本机搜索结果为C:\Users\<username>\AppData\Roaming\Tencent\xwechat\radium\Applet

image-20250914224043865

Note

可以看到存在多个小程序的包,此时我们如何定位到具体的某个小程序呢?

有如下方法:

  1. 删除原有的所有小程序包,再重新打开想要分析的小程序,这样只会剩下刚才打开的小程序包
  2. 按照时间筛选
  3. 由于包名是按照小程序id命名的,所以我们可以在手机上查看小程序ID(PC端无法查看)

image-20250914224839717

image-20250914224902400

更多信息处查看AppID即可

image-20250914225016696

在对应ID的目录下即可找到小程序文件

Macos

聊天文件右键,点击在Finder中显示,拷贝文件路径,以下是我的电脑中的路径:

Text Only
/Users/<username>/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/wxid_xxxxxxxxx_62ae/msg/file/2025-09/xxx

我们得到微信存放数据的路径为/Users/<username>/Library/Containers/com.tencent.xinWeChat/Data/

Bash
find . -type f -name "*.wxapkg"

由于随着微信版本不同,存放小程序的目录也可能随之变化,我们使用命令直接查找wxapkg文件

image-20251026230203998

其中的__APP__.wxapkg就是我们要找的目标文件,此时的文件路径为~/Library/Containers/com.tencent.xinWeChat/Data/Documents/app_data/radium/Applet/packages/<appid>

image-20251026232328275

Note

如果打开后发现该目录下存在多个wxapkg文件,则表示该小程序使用了分包,主程序为__APP__.wxapkg,其他为模块,我们在进行反编译时也需要将模块也进行处理

解密

用UnpackMiniApp工具选择需要解密的程序包,将解密工具放在加密包的同一个文件夹内,并且创建一个文件夹名为wxpack用来存储解密后的包

image-20250914225653421

工具自动判断小程序是否加密,若加密会自动解密并将结果存放到wxpack中

Note

事实上,在微信3.8.0版本之后,wxapkg文件默认都是没有加密的

另外如果要解密多个小程序,建议使用wxapkg工具

Bash
wxapkg_1.5.0_windows_amd64.exe scan -r "xxx\Applet"

image-20250914232354064

可以一次性扫描所有小程序,随后选择想要解密/反编译的小程序即可

反编译

通过反编译获取源码,工具有很多,这里选择wedecode,需要先安装nodejs环境

Bash
# window
npm i wedecode -g
# mac
sudo npm i wedecode -g

# npm换源
npm config set registry https://registry.npmmirror.com/

image-20250914230942060

image-20250914231007715

此处即是小程序的反编译后的源码

当然我们也可以使用KillWxapkg这样的工具,自动解密和反编译

Bash
# 克隆项目
git clone https://github.com/Ackites/KillWxapkg.git

# 进入项目目录
cd ./KillWxapkg

# 下载依赖
go mod tidy

# 编译
go build

image-20251027094123605

源码分析

我们有时会遇到反编译后目录下没有app.json文件的情况,原因可能有多种:

  1. 反编译工具不太行,没有反编译出所有的文件
  2. 小程序进行了加固等安全措施保护

我们可以使用wxappUnpacker中的脚本将app-config.json拆分出app.json文件

Bash
node wuConfig.js xxxx/app-config.json

image-20251027100459778

随后我们使用微信小橙序开发者工具打开,此时有两种情况:

  1. 打开后可以直接得到可运行、可动态调试的小程序
  2. 打开后报错,只能得到静态代码,无法动态调试

参考: 微信小程序“反编译”实战(二):源码还原 | 彬彬的博客


Note

此时我们便可以使用静态分析工具去扫描这些文件中是否存在密钥等敏感信息泄露了,这是基于静态分析的角度,但我们都知道微信小程序运行环境和浏览器很类似,那么我们是否可以像在浏览器调试js代码那样调试小程序呢?

小程序Web调试

注意此方法可能会有封号风险,请用小号测试!!!。实现方式通过对某信偏移地址进行hook开启调试模式,所以不同的版本的偏移地址不同,目前支持的版本如下:

Windows 微信版本 小程序版本 是否为最新版
11275_x64 ✅
11253_x64 ✅
11205_x64 ✅
11159_x64 ✅
3.9.10.19_x64 9129_x64 ✅
3.9.10.19_x64 9115_x64 ✅
3.9.10.19_x64 8555_x64 ❌
3.9.10.19_x64 9105_x64 ❌
3.9.9.43_x64 8555_x64 ❌
3.9.9.43_x64 9079_x64 ❌
3.9.8.25_x64 8531_x64 ❌
3.9.8.25_x64 8529_x64 ❌
3.9.8.25_x64 8519_x64 ❌
3.9.8.25_x64 8501_x64 ❌
3.9.8.25_x64 8461_x64 ❌
3.9.8.25_x64 8447_x64 ❌

如果小程序禁用了调试模式,此方法不适用

下载项目WeChatOpenDevTools-Python(@zhiyuan和@Javeley师傅提供的方案和工具),安装依赖:

Bash
pip3 install -r requirements.txt

**运行: **

Bash
python main.py -x

image-20250914233532577

**开启微信内置浏览器F12: **

Bash
python main.py -c

image-20250914233632460

工具原理参考: 【志远】公开课 xcx某信X64DBG自更新教程_哔哩哔哩_bilibili

推荐工具

  • 解密工具
Text Only
UnpackMiniApp - 只有windows版
wxapkg
  • 反编译工具
Text Only
wxappUnpacker
wedecode
  • 综合解密和反编译工具
Text Only
KillWxapkg