LogoLinso的基地
Blog

某音 HTTPS 抓包与 libsscronet.so 逆向分析

深入分析 Cronet 网络库 SSL Pinning 实现与 Native 层绕过方案

Danger

本文仅供安全研究与学习使用,请勿用于非法用途

针对某音 App 采用自定义 SSL 库 (libsscronet.so) 导致常规抓包工具失效的问题,本文提供了一种基于 Native 层 Patch 的绕过方案

概述

某音 App 并未完全使用 Android 系统原生的网络栈,而是集成了基于 Chromium 网络栈定制的 Cronet 库,并封装在 libsscronet.so 中。这使得它具有独立的证书校验机制(SSL Pinning),能够绕过系统代理设置和系统证书信任存储。

本文主要探讨如何通过逆向分析 Native 库,定位并 Patch 核心证书校验函数,从而实现 HTTPS 流量的解密与抓取。


技术架构与核心机制

关键库与校验逻辑

组件名称功能说明
Librarylibsscronet.so定制的 Cronet 网络栈,包含 SSL/TLS 握手与校验逻辑
FunctionVerifyCert负责校验服务端证书链的有效性(符号名可能被去除)
ToolIDA Pro用于静态分析汇编代码与 Patch 二进制文件

校验流程与绕过逻辑

flowchart TD
    A[App 发起 HTTPS 请求] --> B[libsscronet.so 处理]
    B --> C{SSL 握手}
    C --> D[服务端返回证书]
    D --> E[VerifyCert 校验]
    E -- 校验失败 --> F[断开连接]
    E -- 校验成功 --> G[建立加密通道]
    
    H[Patch 修改] -.-> E
    E -. 强制返回成功状态 .-> G

逆向分析与定位

由于该 App 使用了自定义的 SSL 库,传统的 Xposed 模块(如 JustTrustMe)往往针对的是 Java 层的 javax.net.ssl 类,因此对 Native 层的 Cronet 无效。我们需要直接在汇编层面对校验逻辑进行修改。

1. 符号定位

通过 IDA Pro 加载 libsscronet.so,利用字符串搜索功能定位关键校验函数。

  • 搜索关键词: VerifyCert
  • 目标函数: 通常位于字符串引用附近的 sub_XXXXXX 函数(如 sub_3A6DF8

2. 代码逻辑分析

VerifyCert 及其相关调用链中,校验逻辑通常会返回一个状态码来指示验证结果。

Tip

伪代码,仅作逻辑示意
int64_t VerifyCert(void* cert_chain) {
    // ... 复杂的证书链校验逻辑 ...
    
    if (is_valid) {
        return 1LL; // 原始逻辑:1 代表某种状态(如校验结束/通过)
    }
    
    return 0; // 0 代表另一种状态
}

Patch 策略:

通过分析发现,需要修改特定分支的返回值以绕过校验错误。根据实战经验,定位到关键判断处,修改返回值逻辑。


Patch 实战操作

提取与反编译

  1. 提取: 使用 MT 管理器或 adb pull 从已 Root 设备中提取 /data/app/.../lib/arm64/libsscronet.so
  2. 分析: 将文件拖入 IDA Pro (64-bit),等待分析完成。

修改汇编指令

定位到校验函数的关键返回点,直接修改汇编指令。

; 原始指令示例
MOV W0, #1   ; 原始逻辑可能返回 1
RET

; 修改后指令
MOV W0, #0   ; 强制修改返回值为 0
RET

Tip

修改要点: 在 sub_3A6DF8 等关键函数中,将原计划返回 1 (或特定非零值) 的逻辑修改为返回 0。 注意:具体修改的值需根据不同版本的汇编上下文判定,核心目标是让函数返回“成功”状态。

重打包与替换

  1. 应用 Patch: 在 IDA 中选择 Edit -> Patch program -> Apply patches to input file
  2. 替换文件:
    # 备份原文件
    mv /data/app/com.ss.android.ugc.aweme-.../lib/arm64/libsscronet.so /data/app/com.ss.android.ugc.aweme-.../lib/arm64/libsscronet.so.bak
    
    # 替换并赋权
    cp /sdcard/libsscronet.so /data/app/com.ss.android.ugc.aweme-.../lib/arm64/
    chmod 755 /data/app/com.ss.android.ugc.aweme-.../lib/arm64/libsscronet.so
  3. 重启应用: 强行停止 App 并重启,必要时清除缓存。

常见问题与排查

在替换 so 文件后,可能会遇到以下问题:

  • App 闪退:
    • 原因:Patch 位置错误导致堆栈不平衡,或 App 存在完整性校验(Signature check)。
    • 解决:检查 IDA 修改的指令是否正确,尝试使用 Frida Hook 内存中的函数而非物理替换文件。
  • 仍然无法抓包:
    • 原因:Cronet 可能存在多级校验,仅 Patch 了一处;或 App 升级导致函数偏移变化。
    • 解决:继续追踪 VerifyCert 的交叉引用 (Xref),检查是否有其他校验点。
  • 权限拒绝:
    • 原因:替换后未赋予 chmod 755 权限,导致系统无法加载 so 库。

结论

  • Native 级对抗: 对于集成 Cronet 的应用,Native 层的逆向分析是必经之路。
  • 持久化方案: 直接 Patch so 文件相比 Frida 脚本具有更好的持久性,但面临签名校验的风险。
  • 风险控制: 修改系统或应用库文件存在风险,操作前务必备份。

声明

Tip

本文所提供的逆向思路仅用于安全研究技术交流

请勿利用相关技术攻击目标应用或窃取用户数据。

在此页面...