eCapture 使用方法

eCapture 使用方法

eCapture 是一款基于 eBPF 的流量观测工具,核心用途是直接抓取 TLS/SSL 明文内容,而不需要像传统 MITM 那样安装 CA 证书。它适合做 Android App 抓包、Go 程序网络分析、以及一些主机侧审计场景。

我自己用下来,最重要的结论只有一个:先判断目标用的是什么 TLS 实现,再决定用哪个模块。选错模块,后面怎么折腾都抓不到。

1. eCapture 能做什么

官方仓库里支持的内容大致分几类:

  • tls:抓 OpenSSL / BoringSSL / LibreSSL / GnuTLS / NSS 的 TLS 明文
  • gotls:抓 Go crypto/tls
  • bash / zsh:主机命令审计
  • mysql:数据库查询审计

它的优势是不用装 CA,不依赖浏览器证书链,适合一些“证书装了也没用”的场景。

2. 运行前提

官方说明里,eCapture 支持 Linux / Android,CPU 架构主要是 amd64aarch64。Android 上通常需要 root,或者满足对应的系统能力要求。

几个常见前提:

  • Linux 或 Android
  • 内核版本满足要求
  • 目标进程确实走的是标准 TLS 库
  • 如果要抓 Go 程序,最好能拿到未过度裁剪的 ELF

3. 安装方式

最直接的方式是去官方 release 下载预编译包,解压后直接运行:

1
sudo ecapture --help

如果是容器环境,也可以用官方镜像:

1
2
docker pull gojue/ecapture:latest
docker run --rm --privileged=true --net=host gojue/ecapture --help

4. 最常用的两个模块

4.1 tls 模块

如果目标 App 或服务使用的是 OpenSSL、BoringSSL 这类常见 TLS 库,优先试 tls

1
sudo ecapture tls

如果想看更偏文本的输出,可以用文本模式:

1
sudo ecapture tls -m text

这个模块适合:

  • 浏览器
  • curl / wget
  • 大多数 C/C++ 网络程序
  • 部分 Android App

4.2 gotls 模块

如果目标是 Go 写的程序,尤其是 crypto/tls,要用 gotls

1
sudo ecapture gotls --elfpath=/path/to/binary --hex

这个模块最容易踩坑的地方是:

  • 二进制被 strip 了
  • Go 版本和 eCapture 解析逻辑不匹配
  • 目标 ELF 的符号和函数范围不完整

如果遇到解析失败,先别急着怀疑 eCapture 本身,先检查目标文件:

1
2
readelf -S /path/to/binary | grep gopclntab
strings /path/to/binary | grep -E 'crypto/tls|go1\.'

5. Android 场景怎么用

Android 上抓包,核心是先判断 App 的网络栈。

场景 适合模块
Java / Kotlin App 走系统 TLS tls
Go 编写的 App,例如一些代理、工具类程序 gotls
自定义加密 / 自研网络协议 eCapture 不一定能直接看到明文

5.1 先确认进程是谁

先找包名和进程:

1
adb shell ps -A | grep your.package.name

如果是自己调试的设备,也可以直接看前台应用:

1
adb shell dumpsys window | grep mCurrentFocus

5.2 抓 Go 程序的 TLS

如果目标是 Go 程序,常见思路是把 libclash.so、主程序或相关 ELF 拿出来,再用 gotls 跑。

1
sudo ecapture gotls --elfpath=/data/local/tmp/libclash.so --hex

我自己的经验是,Go 程序比普通 TLS 程序更容易失败,原因通常不是网络没走通,而是:

  • 目标二进制被裁剪
  • 编译优化把函数边界打散了
  • eCapture 需要的 Go 运行时信息不完整

6. 一个实用的排查顺序

如果你只是想快速判断能不能抓到,建议按这个顺序:

  1. 先确认目标是不是标准 TLS
  2. 再决定用 tls 还是 gotls
  3. 先用最简单的命令跑起来
  4. 再加过滤条件、输出格式和路径参数
  5. 最后再考虑代理链、重放和二次分析

这样比一开始就把 Clash、代理、证书、重放全叠上去更稳。

7. 常见问题

7.1 为什么 tls 抓不到 Go 程序

因为 tls 针对的是 OpenSSL / BoringSSL 这类库,不是 Go 标准库。

7.2 为什么 gotls 报错

最常见的是目标 ELF 不完整、符号被 strip、或者 Go 版本兼容性不好。这个时候先换一个更干净的二进制,或者确认 .gopclntab 是否存在。

7.3 为什么 Android 上看起来没有任何输出

常见原因有三个:

  • 权限不够
  • 内核不支持当前 hook
  • 目标 App 根本没走你以为的那条 TLS 路径

8. 我的使用建议

如果你要在 Android 上做 App 抓包,我建议先按这个优先级试:

  1. 标准 App 先试 tls
  2. Go 程序再试 gotls
  3. 目标复杂时再结合代理、日志和重放工具

eCapture 不是“万能解密器”,它更像是一个很强的观测点。抓到明文的前提,始终是目标真的走了它能 hook 到的那一层。

9. 可以直接复制的命令

如果你只想先跑通流程,可以直接从这几条开始。

9.1 Linux 上先看帮助

1
2
3
sudo ecapture --help
sudo ecapture tls -h
sudo ecapture gotls -h

9.2 抓一个标准 TLS 程序

1
sudo ecapture tls -m text

然后在另一个终端发一个 HTTPS 请求:

1
curl https://example.com

9.3 抓 Go TLS 程序

先找到目标 ELF,再把路径传给 gotls

1
sudo ecapture gotls --elfpath=/path/to/target_binary --hex

9.4 Android 设备上的最小流程

先确认前台应用或进程名:

1
2
adb shell dumpsys window | grep mCurrentFocus
adb shell ps -A | grep your.package.name

如果设备已 root,可以直接在手机端跑:

1
su -c 'ecapture tls -m text'

如果是 Go 程序,先把 ELF 放到手机可读路径,再跑:

1
2
adb push libclash.so /data/local/tmp/
su -c 'ecapture gotls --elfpath=/data/local/tmp/libclash.so --hex'

参考