lm060719/reconbridge

GitHub: lm060719/reconbridge

ReconBridge 是一个 KernelSU 模块,将 Android 设备端的逆向原子能力(拉包、读文件、动态 hook)与 PC 端的 AI 智能分析(Claude Code + MCP)桥接,实现通用逆向分析。

Stars: 5 | Forks: 0

**中文** | [English](README_en.md) # ReconBridge —— 通用逆向分析 KernelSU 模块 在 Android(KernelSU root)设备上运行的**通用逆向能力后端**。手机侧只做原子能力(拉包 / 读文件 / 列 so / 注入 hook),所有智能(定位函数、生成 hook、分析结果)都在 PC 侧(Claude Code + MCP)完成。 ## 快速开始 ### PC 端(一键装 MCP 工具) 支持两种 AI 客户端:**Claude Code**(写 `~/.claude.json`)与 **ChatGPT Codex**(写 `~/.codex/config.toml`)。默认 `both`=**自动探测**:只注册进「已安装」的客户端(Claude 看 `~/.claude.json`/`~/.claude/`,Codex 看 `~/.codex/`),没装的那个自动跳过、不建目录;**两个都没检测到就只装工具本体、不写任何配置**(等你装好客户端再重跑注册,或用 `--target` 强制写入)。另需 `adb`(Android platform-tools,连真机用)。 **推荐:一行在线安装(Windows,无需 clone 仓库、无需 Python)** irm https://github.com/lm060719/reconbridge/releases/latest/download/install.ps1 | iex 自动下载打包好的 MCP exe、解压到 `%LOCALAPPDATA%\ReconBridge\`、注册进客户端用户级配置,并铺一个 `reconbridge` skill(逆向类任务时新会话自动加载工作流): - **Claude Code** → `~/.claude.json` 的 `mcpServers.reconbridge` + skill 到 `~/.claude/skills/` - **ChatGPT Codex** → `~/.codex/config.toml` 的 `[mcp_servers.reconbridge]` + skill 到 `~/.codex/skills/` 装完**重启对应客户端**即用。 **更新**:重跑上面那条安装命令即可——它会原地覆盖 exe 并重新注册,保留 `work\`(拉包/dump 数据)与 `tools\`。 **卸载**: irm https://github.com/lm060719/reconbridge/releases/latest/download/uninstall.ps1 | iex 从两个客户端注销 reconbridge 并删除安装目录(默认保留 `work\`/`tools\` 数据;连数据一起删设 `$env:RB_PURGE="1"`;只卸某一个设 `$env:RB_TARGET="codex"`)。等价地,exe 也能自注销:`reconbridge-mcp.exe --unregister [--target codex]`。 **本地控制台(可选,图形化选连接方式 / 看状态)** reconbridge-mcp --serve # 一键安装会把它加进 PATH——装完「新开一个终端」即可用;浏览器自动打开 127.0.0.1:9000 # 若提示找不到命令(PATH 未生效或未加),用全路径: # %LOCALAPPDATA%\ReconBridge\reconbridge-mcp\reconbridge-mcp.exe --serve # 源码装法:python -m reconbridge_mcp --serve 网页里选 adb / wifi、一键连接、看 daemon 状态与只读监控(活动 hook / 近期事件流 / 落盘 dumps),省去命令行设环境变量、手抄 token。仅绑 `127.0.0.1`(本机)。`--port N` 改端口、`--no-open` 不自动开浏览器。 **adb 还是 wifi?监听地址的坑** - **adb(USB,默认)**:自动读 token、建 USB 隧道,免配置、最安全(daemon 只绑本机回环)。代价:连接时会把设备端监听地址**钉成 `127.0.0.1`**(配合隧道),且要给 adb shell root。 - **wifi(局域网直连)**:需要设备端 daemon 绑到**局域网 IP**。在**手机 WebUI「网络设置」→「监听地址」**填 `auto`(自动绑 `wlan0` 局域网 IP)保存,或设备上 `rbctl setbind auto`;然后用 `http://<手机IP>:<端口>` + token 连(IP / 端口 / token 都在手机 WebUI 显示)。 - ⚠️ **用过 adb 模式后想切 wifi**:`bind` 已被钉成 `127.0.0.1`,电脑连不上——把「监听地址」改回 `auto` 即可。想固定走 wifi,就别再用 adb 模式(每次会重新钉回 `127.0.0.1`)。 **从源码运行(开发者 / Linux / macOS,需 Python 3.10+)** # Windows git clone https://github.com/lm060719/reconbridge.git cd reconbridge ./install.ps1 # 建 venv → 装依赖 → 注册 reconbridge + 铺 skill(默认 Claude + Codex) ./install.ps1 -Target codex # 只装 Codex(另可 -Transport wifi) # Linux / macOS git clone https://github.com/lm060719/reconbridge.git cd reconbridge ./install.sh # 默认 both;只装 Codex:./install.sh adb codex 装完**重启对应客户端**:Claude Code 里 `claude mcp list` / `/mcp` 能看到 `reconbridge`(25 个工具),Codex 的 `~/.codex/config.toml` 里有 `[mcp_servers.reconbridge]`;两端都会随装一个 `reconbridge` skill(`~/.claude/skills/` 或 `~/.codex/skills/`,逆向类任务时新会话自动加载工作流与踩坑清单)。 ### 设备端(刷入 KernelSU 模块) 设备需已 root(KernelSU),装 ZygiskNext(M3/M4 动态 hook 需要)。 ./build.ps1 # 用 NDK 编译 arm64-v8a(需 Android NDK,见下) ./pack.ps1 # 打包 dist/ReconBridge-M1.zip 在 KernelSU Manager → 模块 → 从本地安装 `dist/ReconBridge-M1.zip` → 重启。 装好后对 Claude Code 说一句「连一下手机看状态」即可开始。详见下方各里程碑文档。 ## 里程碑总览 | 里程碑 | 内容 | 文档 | |--------|------|------| | **M1** | 静态传输层:KernelSU 模块 + C++ HTTP 守护进程 + WebUI + 静态接口 | 本文(下方) | | **M2** | PC 端 MCP Server:M1 接口 + 本地反编译链(jadx / DexKit→androguard / Ghidra / Hermes)封装为 Claude Code 工具 | [`pc/README.md`](pc/README.md) | | **M3** | 通用动态 hook 执行器:Zygisk 注入 + 数据驱动 ShadowHook + SSE/WS 命中推流 | [`m3/README.md`](m3/README.md) · 协议 [`m3/HOOK_PROTOCOL.md`](m3/HOOK_PROTOCOL.md) | | **M4** | 加固/反调试增强:通用内存 dex dump(`/dump_dex`)+ 反检测 hook 配置模板 | [`m4/README.md`](m4/README.md) | 构建全部产物:`./build.ps1` → `./pack.ps1`(生成 `dist/ReconBridge-M1.zip`)。 ## M1 —— 静态传输层 KernelSU 模块骨架 + C++ HTTP 守护进程 + WebUI 端口开关 + 静态接口。 ### 目录结构 逆向模块/ ├─ src/ │ ├─ daemon.cpp # C++17 守护进程源码 │ └─ third_party/ │ ├─ httplib.h # cpp-httplib 0.18.3(单头) │ └─ json.hpp # nlohmann/json 3.11.3(单头) ├─ module/ # 刷入 zip 的内容(zip 根 = 此目录) │ ├─ module.prop │ ├─ customize.sh # 安装脚本(架构检查 / 权限) │ ├─ service.sh # late_start 拉起守护进程 │ ├─ rbctl # 控制脚本(enable/disable/info…) │ ├─ bin/reconbridge_daemon # 编译产物(arm64-v8a) │ └─ webroot/index.html # KernelSU WebUI ├─ CMakeLists.txt # cmake 构建(可选) ├─ build.ps1 # 直接用 NDK clang++ 构建(推荐,无需 cmake) ├─ pack.ps1 # 打包成刷入 zip └─ README.md ### 一、编译 需要 Android NDK(本项目用 r27c)。已在 `%LOCALAPPDATA%\Android\Sdk\ndk\` 下自动探测。 # 方式 A(推荐,无需 cmake):直接调用 NDK clang++ ./build.ps1 # 方式 B:cmake + ninja cmake -B build -G Ninja ` -DCMAKE_TOOLCHAIN_FILE=$env:ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake ` -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-26 -DCMAKE_BUILD_TYPE=MinSizeRel cmake --build build 产物:`module/bin/reconbridge_daemon`(AArch64 PIE ELF,~900 KB,静态链接 libc++)。 ### 二、打包刷入 zip ./pack.ps1 # 生成 dist/ReconBridge-M1.zip ### 三、刷入 - KernelSU Manager → 模块 → 从本地安装 → 选 `ReconBridge-M1.zip` → **重启**。 - 或 `adb`: adb push dist/ReconBridge-M1.zip /data/local/tmp/ adb shell su -c "ksud module install /data/local/tmp/ReconBridge-M1.zip" adb reboot ### 四、开启端口 重启后端口**默认关闭**。在 KernelSU Manager → 模块 → ReconBridge 打开 WebUI: 1. 打开「端口开关」。 2. 记下页面显示的 **访问 URL**(如 `http://192.168.x.x:8787`)与 **token**。 3. 用完记得关闭开关。 ### 五、验收(PC 侧,同一 Wi-Fi) 设 `IP`/`TOKEN`/`PKG` 为实际值: # 1) 存活 curl -H "X-Token: TOKEN" http://IP:8787/health # 2) 列应用 curl -H "X-Token: TOKEN" "http://IP:8787/packages" # 3) 查某应用全部 apk 路径(含所有 split) curl -H "X-Token: TOKEN" "http://IP:8787/apk?pkg=PKG" # 4) 拉某个 apk(流式,等价 adb pull,不依赖 adb 授权) # 从上一步取到具体 path 后: curl -H "X-Token: TOKEN" "http://IP:8787/apk?pkg=PKG&path=/data/app/.../base.apk" -o base.apk # 5) 拉 native so curl -H "X-Token: TOKEN" "http://IP:8787/libs?pkg=PKG" curl -H "X-Token: TOKEN" "http://IP:8787/libs?pkg=PKG&path=/data/app/.../lib/arm64/libfoo.so" -o libfoo.so # 6) 读任意文件 curl -H "X-Token: TOKEN" "http://IP:8787/file?path=/system/build.prop" # 7) procfs curl -H "X-Token: TOKEN" "http://IP:8787/proc?pid=1&what=status" # 8) 白名单 shell curl -H "X-Token: TOKEN" -X POST "http://IP:8787/shell" \ -d '{"argv":["getprop","ro.product.model"]}' **M1 验收标准**:PC 上用 curl 带 token,能把手机上任意一个 App 的完整 APK(含所有 split)和 native so 拉到本地,效果等价于 `adb pull` 但不依赖 adb 授权。 ## 静态接口清单 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/health` | 存活探测(name/version/pid/uptime) | | GET | `/packages` | 列出已安装应用(包名 / versionCode / 路径 / 是否系统应用) | | GET | `/apk?pkg=` | 列出该应用全部 apk 路径(base + split);加 `&path=` 流式下载单个 | | GET | `/file?path=` | root 流式读任意文件(绝对路径) | | GET | `/libs?pkg=` | 列出该应用 lib 目录下 native `.so`;加 `&path=` 下载单个 | | GET | `/proc?pid=&what=maps\|status\|cmdline` | 转发 procfs | | POST | `/shell` | 白名单命令执行,body:`{"argv":[...]}` 或 `{"cmd":"..."}` | 鉴权:三选一 —— 请求头 `X-Token: `、`Authorization: Bearer `、或查询参数 `?token=`。 `/shell` 白名单:`id whoami getprop uname ls cat stat du df md5sum sha1sum sha256sum pm cmd dumpsys ps getenforce settings wc head tail ip netstat pgrep mount readlink basename dirname find date`。不走 `sh -c`,直接 `execvp`,白名单外拒绝。 ## 安全说明 - 端口**默认关闭**,仅用户在 WebUI 手动开启,用完手动关闭;重启后回到关闭。 - 全部接口 token 鉴权;token 启动时随机生成(16 字节 hex)。 - 默认绑定 `wlan0` 的局域网 IP(`bind=auto`),非 `0.0.0.0`;未探测到时回退 `0.0.0.0` 并告警。监听地址可在 **WebUI「网络设置」→「监听地址」**修改(`auto` / `0.0.0.0` / 具体 IP / `127.0.0.1`)。注意 adb 模式连接会自动把它设为 `127.0.0.1`。 - 手机侧只做搬运,不含任何特定 App 逻辑(符合 `ndde.md` 设计原则)。 ## 运行时文件 `/data/adb/reconbridge/`: - `config.conf` —— `enabled` / `port` / `bind` / `token` - `daemon.log` —— 守护进程日志 ## 已知限制(M1) - `/packages` 的「版本」取 `versionCode`(`pm` 一次调用即可,快);`versionName` 需 `dumpsys`,M1 未纳入。 - `/libs` 只列**落地**的 `.so`;若应用 `extractNativeLibs=false`,so 在 apk 内 `lib/arm64-v8a/`,请用 `/apk` 拉包后本地解包(接口会在 `note` 提示)。 - `/shell` 的 `cmd` 字符串按空白朴素切分,不支持引号;复杂命令用 `argv` 数组形式。
标签:AI辅助分析, Android, DSL, KernelSU, MCP, 云资产清单, 动态注入, 逆向工具, 逆向工程