微信小程序API请求加解密全流程破解指南
1. 项目背景与核心挑战微信小程序的API请求加解密机制是开发者保护数据安全的重要手段但这也给逆向分析、安全测试和故障排查带来了困难。在实际工作中我们经常需要分析小程序的网络请求行为比如排查接口问题、研究竞品实现逻辑或是进行安全审计。传统抓包工具如Fiddler直接捕获的往往是加密后的数据这就需要我们掌握完整的加解密破解流程。小程序常用的加密方式包括AES、RSA等标准算法以及微信自定义的混合加密方案。这些加密不仅应用于接口参数还涉及通信协议、数据存储等多个层面。要完整破解这套机制需要从网络层捕获、协议分析、密钥提取到算法还原四个维度入手。2. 工具准备与环境配置2.1 核心工具链选择工欲善其事必先利其器经过多次实战测试我总结出最稳定的工具组合抓包工具Fiddler Classic比Fiddler Everywhere更稳定逆向工具微信开发者工具 Chrome DevTools解密工具Python 3.8PyCryptodome库辅助工具Wireshark用于校验网络层数据特别注意必须使用Fiddler Classic而非新版因为新版在HTTPS解密时存在证书兼容性问题。我曾在三个不同项目中被这个问题卡住数小时。2.2 Fiddler的HTTPS抓包配置这是最易出错的环节按这个流程可100%成功安装Fiddler后打开Tools Options HTTPS勾选Decrypt HTTPS traffic在Certificates generated by Fiddler区域点击Export Root Certificate将导出的证书安装到受信任的根证书颁发机构存储区在微信开发者工具中设置代理为127.0.0.1:8888常见问题处理若出现certificate not trusted错误检查证书是否安装到了正确的存储区安卓真机调试需将证书安装到手机系统证书目录需rootiOS设备需通过描述文件安装证书3. 实战抓包与协议分析3.1 捕获加密请求启动配置好的Fiddler后操作小程序触发目标API请求。在Fiddler会话列表中找到目标域名通常为二级域名如xxx.weixin.qq.com的请求重点关注Request Headers中的x-wechat-key等自定义字段Request Body的加密特征通常为Base64编码字符串Response的加密模式可能分段加密典型加密请求示例POST /api/v3/user/data HTTP/1.1 Host: miniapp.weixin.qq.com X-Wechat-Encrypt: AES/CBC/PKCS7 Content-Type: application/octet-stream U2FsdGVkX17jJ4w3GZ6NqtvX7z9J5lL...3.2 识别加密模式通过多次请求对比可以发现规律固定IV模式每次请求的加密结果前16字节相同动态密钥模式Headers中包含X-Encrypt-Key字段混合加密先用RSA加密AES密钥再用AES加密数据我开发了一个快速判断加密类型的Python脚本import base64 from Crypto.Cipher import AES def detect_encryption(data): try: decoded base64.b64decode(data) if len(decoded) % 16 0: return AES/CBC elif bSalted__ in decoded[:8]: return OpenSSL EVP else: return Unknown except: return Not Base644. 逆向获取密钥与算法4.1 小程序源码提取微信开发者工具打开目标小程序项目在Sources面板找到核心加密文件搜索关键词encrypt、decrypt、crypto重点关注utils/crypto.js等工具类文件查找微信SDK调用wx.request的transformRequest钩子典型加密代码特征const crypto require(./crypto); function encryptData(data) { const key b3BlbnNzb...; // Base64编码密钥 return crypto.AES.encrypt(JSON.stringify(data), key); }4.2 动态调试获取密钥当源码混淆严重时可采用动态注入在开发者工具Console执行window._original_request wx.request; wx.request function(params) { console.log(Request params:, params); return window._original_request(params); }触发请求后查看控制台输出的原始参数捕获加密前的原始数据和加密配置5. 完整解密实现方案5.1 Python解密代码实现基于捕获的密钥和算法编写通用解密函数from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import base64 def decrypt_aes_cbc(encrypted_data, key, iv): cipher AES.new(key, AES.MODE_CBC, iv) decrypted cipher.decrypt(base64.b64decode(encrypted_data)) return unpad(decrypted, AES.block_size).decode(utf-8) # 实战示例 enc_data U2FsdGVkX17jJ4w3GZ6NqtvX7z9J5lL... key base64.b64decode(b3BlbnNzb...) iv b\x00*16 # 根据实际情况调整 print(decrypt_aes_cbc(enc_data, key, iv))5.2 处理特殊加密场景场景1分块加密有些API响应采用分块加密需要先拼接再解密def decrypt_chunked(data_chunks, key): full_data b.join([base64.b64decode(c) for c in data_chunks]) return decrypt_aes_cbc(full_data, key)场景2动态密钥当遇到每次请求更换密钥时需要结合RSA解密from Crypto.PublicKey import RSA def decrypt_dynamic_key(enc_key, private_key): rsa_key RSA.import_key(private_key) return rsa_key.decrypt(base64.b64decode(enc_key))6. 高级技巧与避坑指南6.1 绕过证书绑定SSL Pinning新版微信客户端会校验证书导致Fiddler抓包失败。解决方案Xposed框架使用JustTrustMe模块Frida脚本注入以下代码绕过校验Java.perform(function() { var Certificate Java.use(java.security.cert.Certificate); var X509Certificate Java.use(java.security.cert.X509Certificate); // 绕过校验逻辑... });6.2 自动化加解密方案对于需要持续监控的场景建议搭建自动化代理from mitmproxy import http class DecryptAddon: def request(self, flow: http.HTTPFlow): if miniapp.weixin.qq.com in flow.request.host: flow.request.headers[X-Proxy-Decrypt] true def response(self, flow: http.HTTPFlow): if flow.request.headers.get(X-Proxy-Decrypt): flow.response.content decrypt(flow.response.content)6.3 常见错误排查错误现象可能原因解决方案解密后乱码IV值错误尝试全零IV或从Headers获取Base64解码失败非标准编码尝试urlsafe_b64decode解密报错Padding is incorrect密钥错误检查密钥是否经过二次编码7. 法律与道德边界需要特别强调的是技术手段应当用于合法合规的场景仅针对自己开发或获得授权的小程序不得破解他人小程序获取敏感数据商业用途需获得微信官方授权在实际项目中我主要将这些技术应用于自家小程序的接口调试安全审计和漏洞挖掘需授权历史数据迁移和解救当原始密钥丢失时