记录一次完整的微信小程序反编译 + AES 加解密爬虫流程(2025 年最新实践版)
以下是基于 2025 年最新工具和社区教程(如 CSDN、腾讯云开发者社区、Bilibili 等)的完整记录。 这个流程假设你有基本的编程知识(Node.js、Python),目的是逆向分析微信小程序的代码和网络请求,提取 AES 加密的数据,并用爬虫模拟请求进行解密。整个过程仅用于学习和研究,禁止用于非法用途(如侵犯隐私或商业破解)。如果小程序启用了代码混淆或高级加密(如 VMP),难度会大幅增加。
前置准备
- 环境要求:
- Windows/Mac/Linux 系统。
- 安装 Node.js(v18+,官网下载)。
- 安装 Python 3.8+(用于 AES 加解密和爬虫)。
- 安装 Visual Studio Code(可选,用于代码查看)。
- Python 库:
pip install pycryptodome requests(pycryptodome 用于 AES)。
- 工具下载:
- 微信小程序反编译工具:从 CSDN 或 GitHub 下载
wecgatMiniAppReverse.zip或unveril2.0。 - Node.js 反编译脚本:安装全局包
npm install -g wxappUnpacker(用于多包反编译)。 - Fiddler/Charles:用于抓包分析小程序网络请求(免费版即可)。
- 获取小程序包:
- 在 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 代码中体现。
- 安装反编译工具:
- 解压
wecgatMiniAppReverse.zip,进入目录。 - 运行命令:
node wuWxapkg.js __APP__.wxapkg(如果有子包,先解子包,再解主包)。 - 输出文件夹:生成
__APP__-unpack目录,包含:app.js/app.json:全局配置和入口。pages/:页面代码(WXML/JS)。utils/:工具函数(可能包含 AES 加解密逻辑)。
- 处理多包反编译(如果小程序有分包):
- 先解分包:
node wuWxapkg.js packageA.wxapkg。 - 再解主包:
node wuWxapkg.js __APP__.wxapkg。 - 如果失败,用
unveril2.0工具:运行 exe,选择 wxapkg 文件,一键解包。
- 验证反编译:
- 用 VS Code 打开 unpack 目录,搜索关键词如 “AES” 或 “encrypt” / “decrypt”,找到加密逻辑(通常在 utils/crypto.js 或类似文件中)。
步骤 2: 分析网络请求(抓包找 AES 加密点)
小程序的反编译代码中往往有加密的 API 请求(如数据用 AES 加密传输)。用抓包工具分析。
- 设置抓包:
- 安装 Fiddler 或 Charles,开启 HTTPS 解密(安装证书)。
- PC 微信设置代理:微信设置 → 网络 → 代理 → 手动设置 Fiddler 代理(127.0.0.1:8888)。
- 打开小程序,操作页面(如下单、查询),抓取请求。
- 分析请求:
- 找到关键 API(如
/api/order/list,请求体或响应体是 Base64 字符串)。 - 从反编译代码中搜索 API 路径,找到加密函数(如
CryptoJS.AES.encrypt(data, key))。 - 常见 AES 参数:模式 CBC/ECB,Padding PKCS7/Zero,Key/IV 从代码中提取(可能硬编码或动态生成)。
- 提取 Key 和 IV:
- 从 JS 代码中找:如
const key = 'your_fixed_key'; const iv = 'fixed_iv';。 - 如果动态生成(如基于时间或设备 ID),需模拟 JS 逻辑。
步骤 3: AES 加解密实现(Python 示例)
AES 是小程序常见加密算法(通常 CBC 模式 + PKCS7 Padding)。用 Python 模拟解密响应数据。
- 安装库:
pip install pycryptodome。 - 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>
- 测试:用抓包的响应数据测试解密,输出应为 JSON(如订单列表)。
步骤 4: 构建爬虫(模拟请求 + AES 解密)
用 Python Requests 模拟小程序的 API 请求,并解密响应。
- 安装库:
pip install requests pycryptodome。 - 完整爬虫代码(假设目标 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)
- 运行与调试:
- 用 Fiddler 验证请求头/体一致。
- 如果有 Sign 参数,从反编译代码中提取签名逻辑(如 MD5 或 AES 加密参数)。
- 防重放:如果有时间戳或随机数,动态生成。
步骤 5: 验证与注意事项
- 验证:运行爬虫,输出应与小程序一致数据。如果失败,检查 Key/IV 或请求参数。
- 注意事项:
- 合法性:仅用于学习,禁止爬取敏感数据或商业用途。
- 防封:加随机延时、代理 IP、User-Agent 轮换。
- 高级加密:如果小程序用 VMP 保护或动态 Key,需 JS 逆向工具(如 Frida)。
- 多包处理:小程序分包常见,先解子包再主包。
- 工具更新:2025 年工具可能升级,检查 GitHub 最新版。
这个流程完整记录了一次实践,如果需要代码运行演示或特定小程序示例,随时问!