Skip to content

多符号匹配 ​

🔍 ApiResolver 找到多个 SSL_read/write 实现时的优先级处理。

📎 源码在线查看:script.js#L124-L183(initializeGlobals)

现象 ​

Android 上 SSL_read/SSL_write 可能在多个库都有导出:

库来源
libssl.so系统 OpenSSL/BoringSSL
libconscrypt_jni.soConscrypt JNI
App 自带 libssl打包进 APK
libflutter.soFlutter 静态链接

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 会绕过自动匹配,强制用指定库。

相关文档 ​

基于 VitePress 构建 · 教学用途