微信小程序API加解密与抓包分析实战
1. 微信小程序API加解密机制解析微信小程序采用HTTPS协议进行通信所有API请求默认经过SSL加密传输。但开发者往往会在基础加密之上再增加业务层的加解密逻辑主要出于以下考虑防止中间人攻击获取敏感数据避免请求参数被篡改保护核心业务逻辑不被逆向分析常见的加解密方案包括AES对称加密最常用RSA非对称加密用于密钥交换自定义签名算法参数防篡改数据压缩Base64编码组合重要提示本文仅讨论技术原理所有操作必须在小程序开发者授权范围内进行违反用户协议的行为可能导致法律风险。2. 抓包环境搭建与配置2.1 Fiddler抓包工具配置Fiddler Classic是目前最常用的HTTP调试代理工具配置步骤如下安装最新版Fiddler Classicv5.0开启HTTPS解密功能Tools Options HTTPS勾选Decrypt HTTPS traffic信任Fiddler根证书设置手机代理确保手机和PC在同一局域网手机WiFi设置手动代理指向PC的IP和8888端口过滤微信小程序流量# FiddlerScript规则 if (oSession.host.Contains(weixin.qq.com) || oSession.host.Contains(wx.qlogo.cn)) { return; }2.2 常见抓包问题解决问题现象解决方案证书错误安装Fiddler根证书到手机信任存储无网络关闭手机代理后重试检查防火墙设置乱码数据在Inspectors面板切换HexView查看原始数据抓不到包重启微信进程清除小程序缓存3. 加解密算法逆向分析3.1 识别加密特征通过抓包可观察到以下典型特征请求参数包含encryptData等字段响应数据为固定长度Base64字符串请求头包含x-signature等签名字段相同操作每次请求参数完全不同3.2 常见加密模式定位AES加密识别数据长度为16/24/32字节的倍数包含IV初始向量参数常见模式CBC/ECB/GCMRSA加密识别数据长度固定1024/2048位通常用于加密对称密钥请求中包含keyencryptedKey参数自定义签名识别参数按特定顺序拼接加入timestamp防重放最后进行MD5/SHA256哈希4. 实战解密流程4.1 获取小程序源码安卓手机获取小程序包adb pull /data/data/com.tencent.mm/MicroMsg/{userhash}/appbrand/pkg/使用unwxapkg工具解包python unwxapkg.py __APP__.wxapkg4.2 关键代码定位在解包后的项目中搜索以下关键词// 加密相关 encryptData decryptData CryptoJS WXBizDataCrypt // 网络请求 wx.request wx.uploadFile4.3 解密算法还原示例假设发现AES加密代码const CryptoJS require(crypto-js) const key b2c3d4e5f6g7h8i9 function encrypt(data) { return CryptoJS.AES.encrypt( JSON.stringify(data), CryptoJS.enc.Utf8.parse(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } ).toString() }对应Python解密代码from Crypto.Cipher import AES import base64 def decrypt(encrypted_data): cipher AES.new( key.encode(utf-8), AES.MODE_ECB ) decrypted cipher.decrypt( base64.b64decode(encrypted_data) ) return decrypted.decode(utf-8).strip()5. 高级对抗方案破解5.1 证书固定SSL Pinning绕过微信7.0版本启用了证书固定常规抓包会失败。解决方案使用Xposed模块JustTrustMeTrustMeAlreadyFrida脚本hookJava.perform(function() { var Certificate Java.use(java.security.cert.Certificate); var X509Certificate Java.use(java.security.cert.X509Certificate); // 绕过证书验证 Certificate.verify.overload(java.security.PublicKey).implementation function() { console.log(Bypassing certificate verification); return; }; });5.2 动态密钥防护部分小程序会定期从服务端获取新密钥拦截密钥交换请求通常在登录后第一个API调用路径包含/getKey或/init静态分析密钥生成逻辑// 常见密钥派生算法 const key md5(deviceId timestamp).substr(8,16)6. 法律与道德边界合法使用场景自家小程序的安全测试授权范围内的渗透测试学术研究需脱敏处理绝对禁止行为破解他人小程序获取商业数据绕过付费验证机制篡改请求参数获取未授权服务技术是把双刃剑建议开发者将本文所述技术仅用于提升自身小程序的安全防护能力。