fuqiuluo/binder-trace

GitHub: fuqiuluo/binder-trace

一款基于 Android 内核模块的 Binder IPC 调用观测工具,提供 WebUI、TUI 和 JSONL 多模式输出,用于系统服务调用分析和调试。

Stars: 100 | Forks: 28

# binder-trace [English](README.en.md) | 中文 `binder-trace` 是一个 Android Binder 调用观测工具。它通过内核模块采集 Binder transaction,在用户态提供 WebUI、TUI 和 JSONL 输出,适合排查系统服务调用、接口频率、payload 和 reply 关联关系。 ## 效果图 | WebUI | TUI | |----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------| | [![binder-trace WebUI 演示](https://static.pigsec.cn/wp-content/uploads/repos/cas/93/9389efa4cc90330673df872def89778789616edadf32ed8fc7fa79a5babe3381.png)](https://github.com/fuqiuluo/binder-trace/raw/master/docs/assets/webui-demo.png) | [![binder-trace TUI 演示](https://static.pigsec.cn/wp-content/uploads/repos/cas/c4/c48a38b00876266166ccf353eec5e72561c0877c7cfa56c699a5e20ce26ddb87.png)](https://github.com/fuqiuluo/binder-trace/raw/master/docs/assets/tui-demo.png) | ## 功能 - 实时采集 Android Binder transaction。 - WebUI: 表格、搜索、方向/接口筛选、详情侧栏、payload/原始 JSON、关联调用、按需分页、可调列宽。 - TUI: 终端内实时事件列表、频率统计、hexdump 和解析详情。 - JSONL: 输出稳定的事件消息,方便接入脚本或后续分析。 - 支持按 `tgid`、`pid`、`uid` 缩小采集范围。 ## 准备条件 - 已 root 的 Android 设备。 - 本机安装 `adb`。 - 与设备 ABI 匹配的 `binder-trace` 用户态二进制。 - 与设备内核版本匹配的 `bt-kmod.ko` 内核模块。 先确认设备信息: adb shell getprop ro.product.cpu.abi adb shell uname -r adb shell su -c id ## 安装到设备 从 Release 下载 `binder-trace` 和对应设备内核的 `bt-kmod.ko`,然后推送到设备: adb shell mkdir -p /data/local/tmp/binder-trace adb push binder-trace /data/local/tmp/binder-trace/binder-trace adb push bt-kmod.ko /data/local/tmp/binder-trace/bt-kmod.ko adb shell chmod 755 /data/local/tmp/binder-trace/binder-trace 加载内核模块: adb shell su -c 'insmod /data/local/tmp/binder-trace/bt-kmod.ko' 确认模块可用: adb shell su -c 'lsmod | grep bt_kmod' adb shell su -c '/data/local/tmp/binder-trace/binder-trace ipc feature' 如果设备已经加载过旧模块,可以先卸载: adb shell su -c 'rmmod bt_kmod' `rmmod` 会等待已经进入 Binder hook 的线程退出。如果设备上有长时间阻塞的 Binder read/looper 线程,卸载可能需要等待一段时间。 ## 使用 WebUI WebUI 是推荐的日常查看方式。先转发端口: adb forward tcp:5173 tcp:5173 在设备上启动 WebUI: adb shell su cd /data/local/tmp/binder-trace ./binder-trace webui --listen 127.0.0.1:5173 然后在电脑浏览器打开: http://127.0.0.1:5173/ 常用参数: ./binder-trace webui --uid 1000 ./binder-trace webui --tgid 12345 ./binder-trace webui --pid 12345 ./binder-trace webui --no-enable ./binder-trace webui --android-sdk 35 ./binder-trace webui --history-path /data/local/tmp/binder-trace/webui-events.btcap ./binder-trace webui --max-history-bytes 8589934592 说明: - 默认会启用 Binder transaction 捕获配置。 - `--no-enable` 只读取现有事件流,不修改内核捕获配置。 - WebUI 事件会写入共享 `CaptureHistory` btcap 后端,默认文件为 `/data/local/tmp/binder-trace/webui-events.btcap`,默认最多累计使用 8GiB 文件空间。 - WebUI 的过滤和分页在后端执行,浏览器只渲染当前窗口;后端不会因为浏览器窗口大小丢弃已捕获事件。 - 右下角可以切换当前渲染窗口大小: `256`、`1024`、`4096`。 ## 使用 TUI TUI 适合在终端里快速查看事件。建议使用交互 shell,避免非交互 `adb shell su -c` 影响按键和终端尺寸: adb shell su cd /data/local/tmp/binder-trace ./binder-trace tui 常用参数: ./binder-trace tui --rows 1024 --refresh-ms 100 ./binder-trace tui --uid 1000 ./binder-trace tui --tgid 12345 ./binder-trace tui --pid 12345 ./binder-trace tui --no-enable ./binder-trace tui --history-path /data/local/tmp/binder-trace/events.btcap TUI 默认历史文件: - Android 设备: `/data/local/tmp/binder-trace/events.btcap` - 其他环境: `binder-trace.btcap` 界面语言会根据 Android locale 或 `LANG` / `LC_*` 环境变量选择。目前内置 English、中文、日本語。 ## 使用 MCP MCP 入口适合让 AI assistant 在线查询 Binder trace。它以 Streamable HTTP 方式提供 `/mcp` endpoint,默认只读取实时事件流,不修改内核捕获配置。 先转发端口: adb forward tcp:5174 tcp:5174 在设备上启动 MCP 服务: adb shell su cd /data/local/tmp/binder-trace ./binder-trace mcp --listen 127.0.0.1:5174 如果需要允许 AI 开关 Binder trace,启动时显式打开控制权限: ./binder-trace mcp --listen 127.0.0.1:5174 --allow-control 也可以在 MCP 服务启动时立即开启捕获: ./binder-trace mcp --listen 127.0.0.1:5174 --allow-control --enable --uid 1000 如需指定 MCP 历史文件、初始容量或文件上限: ./binder-trace mcp --history-path /data/local/tmp/binder-trace/custom-mcp.btcap --rows 65536 ./binder-trace mcp --max-history-bytes 8589934592 MCP 历史默认写入 `/data/local/tmp/binder-trace/mcp-events.btcap`,默认最多累计使用 8GiB 文件空间;达到上限后会拒绝继续写入,并 best-effort 关闭内核捕获,避免异常流量持续打满审计服务。 通过桌面 MCP client 使用时,连接本机转发后的 HTTP 地址。不同 client 的字段名略有差异,核心是使用 Streamable HTTP,并把 URL 指向 `/mcp`: { "mcpServers": { "binder-trace": { "type": "streamable-http", "url": "http://127.0.0.1:5174/mcp" } } } 这种方式不会在 MCP host 启动时自动通过 `adb shell` 拉起 `binder-trace`;只有你手动启动设备侧服务后,client 才能连接。 当前 MCP tools: - `binder_trace_status`: 查看驱动特征、捕获配置、统计和 btcap 历史状态。 - `binder_trace_enable`: 开启 Binder transaction 捕获,可传 `tgid`、`pid`、`uid`、`min_size`、`max_size`。 - `binder_trace_disable`: 关闭内核捕获。 - `binder_trace_clear_stats`: 清空内核统计。 - `binder_trace_events`: 查询事件,支持方向、接口、文本、`after_seq`/`before_seq` 分页,以及 `since_ns`/`until_ns` 时间窗口过滤。 - `binder_trace_event`: 按 sequence 查询单条事件。 - `binder_trace_top_interfaces`: 统计当前 btcap 历史内最活跃的 Binder interface。 - `binder_trace_clear_history`: 清空 MCP btcap 历史,不修改内核状态。 ## 输出 JSONL 无子命令运行时,`binder-trace` 会连接内核模块提供的 socket 事件流,开启 Binder 事务采集,并持续将请求和回复写入 JSONL,适合脚本处理或保存: adb shell su cd /data/local/tmp/binder-trace ./binder-trace --output trace.jsonl 受当前 ABI 限制,事件暂时无法区分 `binder`、`hwbinder` 和 `vndbinder`,因此 `binder_device` 固定为 `unknown`。该字段与 `/dev/binder` 的路径形式无关,使用 binderfs 不会影响事件采集。 事件外层是统一消息信封,`object` 表示事件类型,`data` 是对应载荷: { "device_id": "2957c54c", "seq": 1, "timestamp_ns": 123456789, "object": "agent.diagnostic", "data": { "kind": "diagnostic", "binder_device": "unknown", "process": { "pid": 123, "tid": 0, "uid": 0 }, "flags": 0, "sequence": 0, "transaction": null } } ## 从源码构建 运行项目检查: cargo run -p xtask -- check cargo test --workspace 构建并推送 Android 用户态二进制: export ANDROID_NDK_HOME=/path/to/android-ndk android/push.sh `android/push.sh` 默认构建 `aarch64-linux-android` debug 二进制,并推送到 `/data/local/tmp/binder-trace/binder-trace`。可用环境变量调整: - `BINDER_TRACE_ANDROID_TARGET` - `BINDER_TRACE_ANDROID_API` - `BINDER_TRACE_PROFILE` - `BINDER_TRACE_REMOTE_DIR` - `BINDER_TRACE_BIN` - `BINDER_TRACE_DEVICE_ID` 构建 Android 内核模块: kernel/scripts/build-ddk.sh build android14-6.1 清理内核模块构建产物: kernel/scripts/build-ddk.sh clean android14-6.1 ## 仓库结构 - `kernel/`: Android 内核模块、hook、UAPI 和 DDK 构建脚本。 - `android/`: adb 推送和设备运行辅助脚本。 - `crates/bt-common/`: 内核侧和用户态共享的固定布局类型。 - `crates/bt-agent/`: 用户态事件读取、控制协议和诊断。 - `crates/bt-decoder/`: Binder 事件解码和 Android 平台方法表。 - `crates/bt-storage/`: JSONL 持久化。 - `crates/bt-cli/`: `binder-trace` 命令行入口和 TUI。 - `crates/bt-webui/`: 内嵌 WebUI。 - `xtask/`: 本地开发命令封装。 - `docs/`: 截图和开发文档。 ## 注意事项 - 本项目仅用于你拥有或已获得明确授权的 Android 设备上的调试、安全研究和兼容性分析。不得将本项目用于未授权访问、隐蔽监控、规避审计、获取他人数据或其他违法用途。 - Binder payload 可能包含个人信息、账号信息、通信内容或业务数据。采集、保存、传输和共享 trace 前,应确认具备合法授权,并按最小必要原则限制采集范围、保留时间和访问权限。 - `binder-trace` 进入真实运行路径时会 best-effort 写入 `/data/local/tmp/.fuqiuluo`,用于标记工具已经运行过。`--help` 和参数解析失败不会写入。 - 需要查看采集端调试日志时,可以设置 `RUST_LOG`: RUST_LOG=bt_agent=debug android/run-root.sh webui RUST_LOG=bt_agent=trace android/run-root.sh tui ## 致谢 感谢 [foundryzero/binder-trace](https://github.com/foundryzero/binder-trace) 项目。 ## 开源协议 - 用户态 Rust crate、`xtask`、Android 辅助脚本、文档和其他非内核代码: `MIT OR Apache-2.0`。 - `kernel/` 下的 Android/Linux 内核模块: `GPL-2.0-only`。 - 用户态需要包含的 UAPI 头文件以文件内 SPDX 为准,例如 `kernel/src/ipc/bt_ipc_uapi.h`: `(GPL-2.0-only WITH Linux-syscall-note) OR MIT`。 完整说明见根目录 [`LICENSE`](LICENSE)。
标签:Android, Binder, DSL, 内核模块, 动态观测, 可视化界面, 安全资源, 性能分析, 系统工具, 通知系统