WX小程序渗透

一.PC抓包

  • 使用proxifier将WX小程序的的包进行代理转发到BP。

1. 下载Proxifier

  • 下载proxifier,正规发布软件,因此谷歌搜索下载就行了。
  • 下载后可使用以下注册码进行注册
1
2
3
L6Z8A-XY2J4-BTZ3P-ZZ7DF-A2Q9C(Windows Portable Edition)
5EZ8G-C3WL5-B56YG-SCXM9-6QZAP(Windows Standard Edition)
P427L-9Y552-5433E-8DSR3-58Z68(MAC)

2. 配置代理应用和代理地址

  • 先配置代理到BP端口

image-20250329144412609

image-20250329144509782

  • 配置需要代理的应用

image-20250329144606432

  • 取消默认的代理规则,添加新的代理规则

image-20250329144703969

  • 设置代理规则名,设置需要代理的应用,设置代理行为。

image-20250329144750089

  • 代理的应用微信扩展应用

image-20250329144949543

  • 微信扩展应用地址可通过任务管理器查找

image-20250329145340146

  • 打开对应的小程序就可以看到对应的子进程记录

image-20250329145744156

  • 打开BP也能看到对应小程序的包。

image-20250329150524325

二.强制开启开发者模式

  • 利用开源工具WeChatOpenDevTool同时下载匹配版本的微信对其进行hook注入,实现打开开发者模式,使用断点调试。
  • 注:建议使用小号尝试,防止被封号。

1. 下载工具

  • WeChatOpenDevTool

  • 为了方便可以直接下载打包好的exe版本

  • 下载对应支持的WX版本

image-20250329165120708

  • 因此我这就下载3.9.10.19x64的微信版本。
  • 关于如何下载微信历史版本可以通过下面这个Git仓库,直接从对应tags中下载即可。
  • wechat-windows-versions

image-20250329165356935

  • 工具不用安装,直接用命令行工具就可以启动,微信直接安装即可。

2. 使用

  • 我们可以看一下该工具的帮助

image-20250329165549688

  • 我们要开启小程序的F12,直接在cmd中输入命令WechatOpenDevTools-Python.exe -x即可。(前提是需要已经打开了微信,否则会注入失败)

image-20250329165854925

  • 然后选择对应微信小程序开发者工具即可

image-20250329170029494

  • 我们就可以看到小程序发的包了。

image-20250329170213884

3. 如何进行端点调试

  • 由于WX小程序和普通的WEB应用还是有些区别的,WX小程序需要加载很多WX提供的库,导致前端代码量很大,当我们我们全局搜索我们想要搜索的参数时大概率会直接卡住。

image-20250329170748079

  • 因此我们需要选择特定的文件进行搜索,也就是其对应小程序业务的文件,这个文件在哪呢。我们可以看到初始化器initiator。

image-20250329170936547

  • 在这个app-service.js中搜索,那么大概率我们就能搜索到我们想要的内容。

image-20250329171108836

  • 那么接下来就是打断点,进行调试了。接下来的一系列操作就和WEB应用一模一样了。

image-20250329171304432

三.逆向前端代码

  • 我们可以通过对微信小程序本地包解密的方式直接逆向出微信小程序的前端代码。

1.工具一

1.1.下载解包工具

  • 我通过下载源仓库地址代码下来进行解密,后面发现解密不成功,可能是版本问题。

  • 因此之后我在网上找了可用的安装包来使用 。

  • 使用npm install安装环境

image-20250329183033603

1.2.使用实例

  • 首先找到wx小程序的位置

  • 在wx文件管理中可以找到,小程序的旁目录,通过这个目录可以很快的找到,wx小程序的位置。

image-20250329183241046

  • 然后在不移动wx小程序包位置的情况下,进行解包,为了自动加载小程序id

image-20250329185431645

  • 然后选择小程序位置

image-20250329185528189

  • 解包成功

image-20250329185622701

  • 解包成功后会生成一个中间文件.wxapkg

  • 然后使用更目录下wuWxapkg.js配合node命令进行解密

1
node wuWxapkg.js "D:\Tools\WeChatUnpack\小程序包解密\wxpack\wxb09392036c3bc1f1.wxapkg"

image-20250329190102595

  • 解密成功后可以看到如下代码结构。

image-20250329190217417

2.工具二

2.1.下载解包工具

  • 名字就叫wxapkg
  • 建议直接下载发布版本,不需要node或者Go环境。

2.2.使用实例

  • 这个工具使用起来很简单直接输入命令scan就可以了。
1
wxapkg_1.5.0_windows_amd64.exe scan
  • 输入命令后,直接就可以进入以下半图形化界面,由于我这里只打开过一个小程序,因此只显示了一个小程序,如果打开过多个小程序可以通过Up Arrow KeyDown Arrow Ket选择,然后回车就会自动解包小程序并输出到到当前文件夹中。

image-20250329191046173

image-20250329191529595

  • 解包成功后目录结构如下

image-20250329191604897

3.工具三

3.1.下载解包工具

  • KillWxapkg

  • 这个工具的功能会比较全,也是git上star最多的一个工具

3.2.用法

-id=<输入AppID> -in=<输入文件1,输入文件2> 或 -in=<输入目录> -out=<输出目录> [-ext=<文件后缀>] [-restore] [-pretty] [-noClean] [-help] [-hook] [-save] [-repack=<输入目录>] [-watch] [-sensitive]

  • 参数说明

  • -id string
    
    1
    2
    3
    4
    5
    6
    7

    - 微信小程序的AppID
    - 包已解密,可不指定
    - 例:-id=wx7627e1630485288d

    - ```
    -in string
    - 输入文件路径(多个文件用逗号分隔)或输入目录路径 - 自动检测,已解密的包,自动解包,未解密的包,自动解密后解包 - 解密后的包会保存到输入目录下以AppID命名的文件夹 - 例:-in="app.wxpkg,app1.wxapkg" - 例:-in="C:\Users\mi\Desktop\Applet\64"
  • -out string
    
    1
    2
    3
    4
    5

    - 输出目录路径(如果未指定,则默认保存到输入目录下以AppID命名的文件夹)

    - ```
    -restore
    - 是否还原源代码工程目录结构,默认不还原
  • -pretty
    
    1
    2
    3
    4
    5

    - 是否美化输出,默认不美化,美化需较长时间

    - ```
    -ext string
    - 处理的文件后缀 (default ".wxapkg") - 例:-ext=.wxapkg
  • -noClean
    
    1
    2
    3
    4
    5

    - 是否清理反编译的中间文件,默认清理

    - ```
    -hook
    - 是否Hook小程序,动态调试,开启F12,默认不Hook - **注意:目前仅支持Windows,建议小号,有封号风险**
  • -save
    
    1
    2
    3
    4
    5

    - 是否保存解密后的文件,默认不保存

    - ```
    -repack string
    - 重新打包目录路径 - 例:-repack="C:\Users\mi\Desktop\Applet\64" - **注意:目前仅支持一次打包一个文件,同时仅支持未被解析的源文件(未使用-restore)**
  • -watch
    
    1
    2
    3
    4
    5

    - 是否监听将要打包的文件夹,并自动打包,默认不监听

    - ```
    -sensitive
    - 是否导出敏感数据,默认不导出,导出后会在工具目录下生成sensitive_data.json文件,支持自定义规则
  • -help
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    - 显示帮助信息

    - 微信小程序的ID可通过Applet目录下的文件夹进行查看

    ![image-20250329192042295](https://hongkong-img.oss-cn-hongkong.aliyuncs.com/markdown-img/image-20250329192042295.png?x-oss-process=style/img-to-webp)

    #### 3.3.使用实例

    - 命令

    ```cmd
    KillWxapkg_2.4.1_windows_amd64.exe -id=wxb09392036c3bc1f1 -in="C:\Users\User\Documents\WeChat Files\Applet\wxb09392036c3bc1f1\647\__APP__.wxapkg" -out "wxapkg_out" -restore -pretty -save

image-20250329193009691

  • 最后输出目录结构

image-20250329193055615

4.逆向代码总结

  • 根据对三个工具逆向出来的工具进行对比发现,KillWxapkgUnPackminiAPP很相识并且都是6.xM的大小,而wxapkg解包出来的大小有10M,那是否说明wxapkg代码还原的更好呢?这个我就不是太清楚了,之后我会对三个工具解包出来的代码进行比对,观察哪一个工具解包出来的代码更具有可读性,和更完善。如果有结果我会继续更新本片文章。

  • 不过从使用方便的角度来说的化自然是wxapkg,因为只需要输入scan命令,然后上下选择需要解密的小程序包即可。而KillWxapkg还需要找到对应的小程序id然后通过命令行配置自己想要的参数。但是最麻烦的就是UnPackminiAPP这个工具了,其他还好说主要是还需要Node环境,如果没有node环境,或者node环境配置不正确的小伙伴可能就会遇到各种报错,导致解包不成功。

  • 至于最后到底使用哪个工具最好,那还是需要各方面的评判。如果有一点可以确定的是,如果遇到解包失败的情况,那么尝试更换工具可能是一个很好的办法。

总结

  • 本期主要分析了微信小程序如何抓包测试,如何开启开发者模式,像在游览器调试WEB程序一样调试小程序的代码,以及如果你用开源工具逆向出小程序的代码,从而用于本地代码审计分析。