多符号匹配
🔍 ApiResolver 找到多个 SSL_read/write 实现时的优先级处理。
📎 源码在线查看:
script.js#L124-L183(initializeGlobals)
现象
Android 上 SSL_read/SSL_write 可能在多个库都有导出:
| 库 | 来源 |
|---|---|
libssl.so | 系统 OpenSSL/BoringSSL |
libconscrypt_jni.so | Conscrypt JNI |
App 自带 libssl | 打包进 APK |
libflutter.so | Flutter 静态链接 |
ApiResolver enumerateMatches("exports:*!SSL_write") 会返回所有匹配。
优先级
r0capture 按优先级排序选择 hook 目标:
Conscrypt 优先,因为新版 Android 上绝大多数 App 流量走它。
为什么不全 hook
- 全 hook 可能重复抓(同一流量多个实现都触发)
- 性能开销
- 部分 App 自带 SSL 是诱饵/不用的
r0capture 选主用实现 hook,避免重复。
实现
javascript
var matches = resolver.enumerateMatches("exports:*!SSL_write");
matches.sort(function(a, b) {
// Conscrypt 的排前
var aCon = a.name.indexOf("conscrypt") !== -1 ? 0 : 1;
var bCon = b.name.indexOf("conscrypt") !== -1 ? 0 : 1;
return aCon - bCon;
});
// hook matches[0] 或前几个setssllib 的影响
调用 setssllib 会绕过自动匹配,强制用指定库。