记录一次完整的微信小程序+反编译+AES加、解密爬虫

记录一次完整的微信小程序反编译 + AES 加解密爬虫流程(2025 年最新实践版)

以下是基于 2025 年最新工具和社区教程(如 CSDN、腾讯云开发者社区、Bilibili 等)的完整记录。 这个流程假设你有基本的编程知识(Node.js、Python),目的是逆向分析微信小程序的代码和网络请求,提取 AES 加密的数据,并用爬虫模拟请求进行解密。整个过程仅用于学习和研究,禁止用于非法用途(如侵犯隐私或商业破解)。如果小程序启用了代码混淆或高级加密(如 VMP),难度会大幅增加。

前置准备

  1. 环境要求
  • Windows/Mac/Linux 系统。
  • 安装 Node.js(v18+,官网下载)。
  • 安装 Python 3.8+(用于 AES 加解密和爬虫)。
  • 安装 Visual Studio Code(可选,用于代码查看)。
  • Python 库:pip install pycryptodome requests(pycryptodome 用于 AES)。
  1. 工具下载
  • 微信小程序反编译工具:从 CSDN 或 GitHub 下载 wecgatMiniAppReverse.zipunveril2.0
  • Node.js 反编译脚本:安装全局包 npm install -g wxappUnpacker(用于多包反编译)。
  • Fiddler/Charles:用于抓包分析小程序网络请求(免费版即可)。
  1. 获取小程序包
  • 在 PC 版微信中打开目标小程序(如某租车小程序),操作一遍以加载所有页面。
  • 找到小程序包路径:Windows 下为 C:\Users\YourName\Documents\WeChat Files\Applet\wxapp_id\__APP__.wxapkg(wxapp_id 是小程序 ID,可搜索 Applet 文件夹)。
  • 复制 __APP__.wxapkg 到工作目录(如果有子包,如 packageA.wxapkg,一并复制)。

步骤 1: 微信小程序反编译(解包 wxapkg)

微信小程序代码打包为 .wxapkg 文件,反编译后可得到 JS 代码、页面布局(WXML/WXSS)和配置(JSON)。如果有加密(如 AES),会在 JS 代码中体现。

  1. 安装反编译工具
  • 解压 wecgatMiniAppReverse.zip,进入目录。
  • 运行命令:node wuWxapkg.js __APP__.wxapkg(如果有子包,先解子包,再解主包)。
  • 输出文件夹:生成 __APP__-unpack 目录,包含:
    • app.js / app.json:全局配置和入口。
    • pages/:页面代码(WXML/JS)。
    • utils/:工具函数(可能包含 AES 加解密逻辑)。
  1. 处理多包反编译(如果小程序有分包):
  • 先解分包:node wuWxapkg.js packageA.wxapkg
  • 再解主包:node wuWxapkg.js __APP__.wxapkg
  • 如果失败,用 unveril2.0 工具:运行 exe,选择 wxapkg 文件,一键解包。
  1. 验证反编译
  • 用 VS Code 打开 unpack 目录,搜索关键词如 “AES” 或 “encrypt” / “decrypt”,找到加密逻辑(通常在 utils/crypto.js 或类似文件中)。

步骤 2: 分析网络请求(抓包找 AES 加密点)

小程序的反编译代码中往往有加密的 API 请求(如数据用 AES 加密传输)。用抓包工具分析。

  1. 设置抓包
  • 安装 Fiddler 或 Charles,开启 HTTPS 解密(安装证书)。
  • PC 微信设置代理:微信设置 → 网络 → 代理 → 手动设置 Fiddler 代理(127.0.0.1:8888)。
  • 打开小程序,操作页面(如下单、查询),抓取请求。
  1. 分析请求
  • 找到关键 API(如 /api/order/list,请求体或响应体是 Base64 字符串)。
  • 从反编译代码中搜索 API 路径,找到加密函数(如 CryptoJS.AES.encrypt(data, key))。
  • 常见 AES 参数:模式 CBC/ECB,Padding PKCS7/Zero,Key/IV 从代码中提取(可能硬编码或动态生成)。
  1. 提取 Key 和 IV
  • 从 JS 代码中找:如 const key = 'your_fixed_key'; const iv = 'fixed_iv';
  • 如果动态生成(如基于时间或设备 ID),需模拟 JS 逻辑。

步骤 3: AES 加解密实现(Python 示例)

AES 是小程序常见加密算法(通常 CBC 模式 + PKCS7 Padding)。用 Python 模拟解密响应数据。

  1. 安装库pip install pycryptodome
  2. AES 解密代码(假设 Key 和 IV 为 16 字节字符串,从反编译代码中提取):
   from Crypto.Cipher import AES
   from Crypto.Util.Padding import unpad
   import base64

   def aes_decrypt(encrypted_data, key, iv):
       # Base64 解码
       encrypted_data = base64.b64decode(encrypted_data)
       key = key.encode('utf-8')
       iv = iv.encode('utf-8')

       # 创建 AES 解密器(CBC 模式)
       cipher = AES.new(key, AES.MODE_CBC, iv)

       # 解密并去填充
       decrypted = unpad(cipher.decrypt(encrypted_data), AES.block_size)
       return decrypted.decode('utf-8')

   # 示例使用(替换为真实数据)
   encrypted = "your_base64_encrypted_string_from_response"
   key = "your_16_byte_key"  # 从代码中提取
   iv = "your_16_byte_iv"    # 从代码中提取
   print(aes_decrypt(encrypted, key, iv))  # 输出明文 JSON
  • 加密代码(如果需要模拟请求): from Crypto.Util.Padding import pad def aes_encrypt(plain_data, key, iv): plain_data = plain_data.encode('utf-8') key = key.encode('utf-8') iv = iv.encode('utf-8') cipher = AES.new(key, AES.MODE_CBC, iv) encrypted = cipher.encrypt(pad(plain_data, AES.block_size)) return base64.b64encode(encrypted).decode('utf-8')</code></pre></li>
  1. 测试:用抓包的响应数据测试解密,输出应为 JSON(如订单列表)。

步骤 4: 构建爬虫(模拟请求 + AES 解密)

用 Python Requests 模拟小程序的 API 请求,并解密响应。

  1. 安装库pip install requests pycryptodome
  2. 完整爬虫代码(假设目标 API 是 POST 请求,响应 AES 加密):
   import requests
   from Crypto.Cipher import AES
   from Crypto.Util.Padding import unpad
   import base64
   import json

   def aes_decrypt(encrypted_data, key, iv):
       encrypted_data = base64.b64decode(encrypted_data)
       key = key.encode('utf-8')
       iv = iv.encode('utf-8')
       cipher = AES.new(key, AES.MODE_CBC, iv)
       decrypted = unpad(cipher.decrypt(encrypted_data), AES.block_size)
       return decrypted.decode('utf-8')

   # 模拟请求
   url = "https://api.example.com/order/list"  # 从抓包获取
   headers = {
       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",  # 小程序 UA
       "Authorization": "your_token_from_grab"  # 从抓包复制
   }
   data = {"page": 1, "size": 10}  # 请求体,从代码分析

   response = requests.post(url, headers=headers, json=data)
   if response.status_code == 200:
       encrypted_resp = response.text  # 假设响应是 Base64 字符串
       key = "your_key"
       iv = "your_iv"
       decrypted_json = aes_decrypt(encrypted_resp, key, iv)
       data = json.loads(decrypted_json)
       print(data)  # 输出订单列表
   else:
       print("请求失败:", response.status_code)
  1. 运行与调试
  • 用 Fiddler 验证请求头/体一致。
  • 如果有 Sign 参数,从反编译代码中提取签名逻辑(如 MD5 或 AES 加密参数)。
  • 防重放:如果有时间戳或随机数,动态生成。

步骤 5: 验证与注意事项

  1. 验证:运行爬虫,输出应与小程序一致数据。如果失败,检查 Key/IV 或请求参数。
  2. 注意事项
  • 合法性:仅用于学习,禁止爬取敏感数据或商业用途。
  • 防封:加随机延时、代理 IP、User-Agent 轮换。
  • 高级加密:如果小程序用 VMP 保护或动态 Key,需 JS 逆向工具(如 Frida)。
  • 多包处理:小程序分包常见,先解子包再主包。
  • 工具更新:2025 年工具可能升级,检查 GitHub 最新版。

这个流程完整记录了一次实践,如果需要代码运行演示或特定小程序示例,随时问!

文章已创建 3096

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部