Skip to main content

安卓抓包

Hodor 现已原生支持 安卓。不同于依赖系统 HTTP 代理的抓包工具,Hodor 通过 VPN(VpnService)隧道在 IP 层抓包,因此能看到代理型工具看不到的流量—— 包括 Flutter 应用以及刻意不走系统代理的原生应用。

本页把两件事讲透,形成闭环:

  1. Hodor 在安卓上能解密什么——HTTPS 解密能力矩阵,以及它为什么取决于目标 应用类型和证书存放位置。
  2. 怎么把它跑起来——两条部署路径(一台手机,或用免费的 HodorTrust 工具搞定的模拟器),以及各自的精确步骤。

下载​

  • Hodor 安卓版(APK)——见下载页。需 Android 10(API 29)及以上,且仅支持 64 位设备。
  • HodorTrust(macOS 端模拟器/已 root 设备证书工具)——见下载页。需 macOS 12 及以上(Intel 与 Apple Silicon 通用)或 Windows 10/11(64 位)。

安卓抓包的原理​

  • Hodor 通过内置 VPN 建立 tun 网卡,所有流量——无论 Wi-Fi 还是蜂窝——都被 重定向进 Hodor,可以像 iOS/macOS 一样录制、查看、重写和脚本化。
  • 因为是 VpnService(TUN)方案,Hodor 天然免疫经典代理盲区:忽略 HTTP_PROXY 的应用,以及完全不走系统代理的 Flutter Dart HttpClient。
  • HTTPS 解密需要一张 中间人(MITM)证书。某个应用是否接受这张证书,就是下 面矩阵所描述的内容。

HTTPS 解密能力矩阵​

解密一个 HTTPS 会话需要同时满足两个条件:

  1. 引擎侧——Hodor 有一张可用证书,其 VPN 引擎才会对目标 host 真正发起 MITM。 若设备上完全没装证书,引擎会对 HTTPS 原样透传而不尝试解密(应用照常上网, 但你看到不了明文)。
  2. 客户端侧——目标应用必须信任 Hodor 的证书。在安卓上,这一点因应用类型、 以及证书是「用户证书」还是「系统证书」而差异巨大。

安卓上证书可存放于两处:

  • 用户证书——通过设置 → 安全 → 安装证书装入(无需 root),存放在 Android 密钥库(/data/misc/keychain)。
  • 系统证书——写入系统信任库(/system/etc/security/cacerts,安卓 14+ 还在 APEX 的 conscrypt/cacerts)。需要已 root 设备或模拟器。
目标应用用户证书(无 root)系统证书(root / 模拟器)
明文 HTTP(不走 TLS)✅ 无需解密——始终可见✅
声明信任用户证书的原生应用(NSC network_security_config,或 targetSdk < 24)✅✅
普通第三方正式应用(无信任声明)❌ 握手被拒→透传,无明文✅
Flutter / dart:io 应用❌ dart:io 完全忽略用户证书区✅(读系统证书区)
做了**证书锁定(pinning)**的应用❌❌(pinning 才是真正的天花板)
两个广为流传的误解,已被实测证伪
  • 「debug 包会自动信任用户证书。」 不会。安卓 7.0+ 上,一个没有显式 network_security_config 的可调试构建同样会拒绝未受信的 MITM 证书。信任由 NSC / targetSdk 决定,与 debuggable 无关。
  • 「Flutter 永远解不了。」 也不成立。dart:io 直接从 /system/etc/security/cacerts 读取信任锚。一旦 Hodor 的证书进入系统信任库 (已 root 设备或模拟器),Flutter 应用就和原生应用一样被解密。真正的限制只有 证书锁定(pinning)。

该走哪条路径?​

路径 A——真机,无 root​

适用于调试你自己的应用(或可重新配置的应用)。

  1. 安装 Hodor APK,在应用内开启 VPN——流量即经 Hodor 转发。

  2. 把 Hodor 的证书装为用户证书(应用的证书页会引导你走完设置 → 安全 → 安装 证书)。通用步骤见证书安装。

  3. 让目标应用信任这张用户证书:

    • 原生应用——加一个信任用户证书的 network_security_config.xml,并在 manifest 中引用:

      <!-- res/xml/network_security_config.xml -->
      <network-security-config>
      <debug-overrides>
      <trust-anchors>
      <certificates src="user" />
      </trust-anchors>
      </debug-overrides>
      </network-security-config>
    • Flutter / dart:io 应用——用户证书对 dart:io 不可见,改为把 Hodor 的 证书经 SecurityContext 内置进应用:

      import 'dart:io';
      import 'package:dio/dio.dart';
      import 'package:dio/io.dart';
      import 'package:flutter/services.dart' show rootBundle;

      final caBytes = (await rootBundle.load('assets/hodor_ca.pem')).buffer.asUint8List();

      HttpClient createHttpClient() {
      final ctx = SecurityContext(withTrustedRoots: true)
      ..setTrustedCertificatesBytes(caBytes);
      return HttpClient(context: ctx);
      }

      final dio = Dio()
      ..httpClientAdapter = IOHttpClientAdapter(createHttpClient: createHttpClient);

      withTrustedRoots: true 保留正常校验,只是额外追加信任 Hodor 的证书。证书 可从 Hodor 证书页导出。此改动只用于调试/测试构建,切勿上线到正式包。

路径 B——模拟器或已 root 设备(完整解密)​

适用于抓取任意应用(自家的或第三方正式包),并完整解密 HTTPS。关键是把 Hodor 的证书放进系统信任库——这需要 root,而这正是 HodorTrust 自动化的 部分。

HodorTrust(安卓证书工具)​

HodorTrust 是一款 macOS 小工具,把 Hodor 的证书注入安卓系统信任库,从而让 所有应用——原生与 Flutter 皆然——都信任它。它支持两种模式:

  • 一键创建——从一台干净的机器到可解密的模拟器,全程不用打开终端。HodorTrust 依次走完八个阶段,每个阶段都显示进度,且任何单步都能单独重试:

    1. 检测环境(Android SDK、emulator、adb)。
    2. 下载 Google APIs 系统镜像。
    3. 创建 AVD。
    4. 启动模拟器并等待开机完成。
    5. 确认 root。
    6. 安装 Hodor APK。
    7. 提取 Hodor 的证书。
    8. 将证书注入系统信任库。

    大件组件(镜像、AVD、Hodor、证书)只装一次——下次运行时已满足的步骤会自动跳过。

  • 向已有已 root 设备注入——指向任意已在跑的、已 root 的模拟器或设备(Magisk、 adb root、虚机里的 LineageOS 等),它会扫描已连接设备、让你选择目标,然后几秒内 注入——或还原——系统证书。

前置要求

  • macOS 12+(推荐 Apple Silicon,因 AVD 镜像为 arm64-v8a)。
  • 一键创建模式:需要带 cmdline-tools、platform-tools 和 emulator 的 Android SDK。缺少 Google APIs 系统镜像时 HodorTrust 会提示下载。(已有已 root 设备模式 只需 adb。)
  • HodorTrust 已经 Developer ID 签名并公证,打开时不会有 Gatekeeper 拦截。
平台可用性

HodorTrust 现已提供 macOS(12 及以上,Intel 与 Apple Silicon 通用)与 Windows 10/11(64 位)版本——两者均覆盖一键创建模拟器与已有已 root 设备注入两种模式。

上手步骤

  1. 从下载页获取 HodorTrust 并打开,把应用拖到「应用」 文件夹。HodorTrust 已签名并经公证,可通过 Gatekeeper。
  2. 选择模式:
    • 全新模拟器选一键创建,或
    • 已有已 root 设备/模拟器选已有已 root 设备注入。
  3. 注入完成后,在模拟器里启动 Hodor 的 VPN——包括 Flutter 应用在内的流量都会 被解密,会话列表里直接可见明文。
已 root 真机

安卓 14(API 34)起,运行时信任锚迁到了只读的 APEX 模块 (/apex/com.android.conscrypt/cacerts),只写 /system 并不够。HodorTrust 通过 bind mount 一份含 Hodor 证书的合并副本来处理这一点。该覆盖挂载重启后失效——设备 重启后需重新执行注入。

排查​

  • 应用能上网但看不到明文/没有会话——目标 host 很可能拒绝了 Hodor 的证书, 于是 Hodor 原样透传(这同时保证应用不断网)。改用路径 B把证书装进系统信任库。
  • 切了规则开关后什么都抓不到——确认 Hodor 的 VPN 确已连接,且应用内的抓包记录 开关已开启。
  • 已 root 设备上的 Flutter 应用仍未解密——确认你走的是系统证书路径(用户证书 对 dart:io 永不生效),并确认该流量不是证书锁定(pinning)。

准备好上手了?下载 Hodor 安卓版和 HodorTrust 工具,或继续阅读抓包教程。