抓包前须绕过ssl pinning,安卓用justtrustme或objection,ios需越狱后用ssl-kill-switch2或frida;定位加密参数重点查post的body及x-sign等header;可手动改参测服务端返回以确认签名字段;hook加解密函数比静态分析更高效;复现时注意字节/字符串处理、json格式、时间戳位数及aes的iv来源。

抓包前必须关掉 SSL Pinning
APP 用 HTTPS 却看不到请求,八成是开了 SSL Pinning。不绕过它,Charles 或 Fiddler 抓到的全是空连接或 SSL handshake failed。安卓常见方案是用 JustTrustMe(Frida 脚本)或 Objection 动态禁用;iOS 则需越狱后跑 ssl-kill-switch2 或用 Frida 注入绕过 NSURLSession / AFNetworking 的证书校验逻辑。注意:部分新 APP 会检测 Frida 进程或 hook 行为,得先 patch libfrida-gadget.so 或改包重签名。
定位加密参数通常在 request body 或 header 里
翻抓包记录时重点看 POST 请求的 body 和自定义 header,比如 X-Sign、sign、token、timestamp、nonce 这类字段。常见组合是:body 本身被 AES 加密(base64 编码后传),同时外层加一个由 body + timestamp + secret 拼接后算出的 sign。别急着反编译,先手动改几个参数(如改 timestamp 加 1 秒)发包,看服务端返回 "sign error" 还是 "timestamp expired"——这能帮你确认哪些字段参与签名计算。
用 Frida Hook Python 环境里的加密函数最省事
如果 APP 是用 React Native、Flutter 或嵌了 Python(如 chaquopy),直接 hook 对应 JS/Java/Python 层的加解密函数比静态分析快得多。例如 hook Python 层的 encrypt() 函数,用 Frida 注入后打印出入参:
frida -U -f com.example.app -l hook_encrypt.js --no-pause
其中 hook_encrypt.js 里写:
Java.perform(() => {
const Crypto = Java.use("com.example.crypto.CryptoUtil");
Crypto.encrypt.implementation = function(data) {
console.log("[+] encrypt input:", data);
const ret = this.encrypt(data);
console.log("[+] encrypt output:", ret);
return ret;
};
});
注意:Java 层 hook 要确认类名和方法签名是否含 byte[] 或 String;JS 层(RN)优先 hook global.crypto.subtle.digest 或自定义 signRequest() 函数。
Python 复现加密逻辑时小心字节与字符串混用
很多 APP 的 sign 计算最后一步是 hashlib.sha256().hexdigest(),但输入可能是 bytes 拼接(如 b"a"+b"b"),也可能是 UTF-8 编码后的字符串。错用 str + str 拼接再 encode,容易漏掉原始二进制结构。典型坑点:
-
json.dumps()默认带空格和排序,而 APP 原始 body 是紧凑无空格、key 顺序固定的 —— 得加参数separators=(',', ':'), sort_keys=False - 时间戳用
int(time.time())还是int(time.time() * 1000)?看抓包里timestamp字段是 10 位还是 13 位 - AES 加密模式常见是
CBC,但 IV 可能固定(如全 0)、也可能从服务端下发,或从 timestamp 衍生 —— 光有 key 不够,IV 错一位整个解不出来
逆向最难的不是算法本身,而是那些没写在文档里、靠观察和试错才能确认的格式细节和时序依赖。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











