关于 Reverse Engineer Anything (Docker)
Reverse Engineer Anything (Docker) 将 REA 打包在 Docker 镜像中,供 Agent 和分析人员检查无源代码的软件。镜像包含 Android 分析依赖,并提供 Streamable HTTP MCP、stdio MCP 和命令行模式。
主要功能
- 01检查并反编译 Android APK
- 02分析 Electron、.NET、Go、Rust 和 WASM
- 03搜索类并追踪引用
- 04解码 Android 资源
- 05可选安装 Ghidra 以分析原生二进制
- 06带令牌和会话控制的 HTTP 桥接
适用场景
- 01检查 APK 登录流程及令牌存储
- 02追踪 Android 类之间的引用
- 03分析无源代码的二进制文件或应用包
- 04通过 HTTP 或 stdio MCP 客户端运行 REA
MCP 相关
镜像提供带 bearer 令牌认证的 Streamable HTTP MCP 端点 `/mcp`,也可运行 REA 的 stdio MCP 服务以供本地客户端使用。每个 HTTP 会话运行独立的 REA 进程。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e REA_BRIDGE_TOKEN docker.io/psyb0t/reverse-engineer-anything:v0.1.1REA_BRIDGE_TOKEN密钥Bearer token clients must send; at least 32 characters本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
docker-reverse-engineer-anything
将 REA (Reverse Engineer Anything) 打包为 Docker 镜像,镜像中已包含拆解 Android APK 所需的一切,并提供 Streamable HTTP MCP 端点。
REA 是 morluto 的 MCP 服务和 CLI,可让 AI agent 检查没有源代码的软件:反编译 APK、追踪引用、读取资源、通过 adb 操作设备、深入分析 Electron 包、.NET 程序集、Go 和 Rust 二进制文件。上游以 rea-agents
npm 包的形式发布,通过 stdio 使用 MCP,并要求你自行安装 JDK、JADX 和 Apktool。这个镜像替你完成了这些工作。
这是非官方打包。REA 本身位于 morluto/rea,采用 MIT 许可证。REA 工具中的问题请提交到上游;镜像或 HTTP 桥接中的问题请提交到这里。
目录
镜像包含内容
| 组件 | 版本 | 用途 |
|---|---|---|
REA (rea-agents) | 6.4.0 | 分析引擎,包含 170 个 MCP 工具 |
| OpenJDK 21 (full) | Debian 13 | REA 使用 jdk.compiler 编译其 JADX 桥接程序;仅有 JRE 不够用 |
| jadx-headless-mcp | 0.7.1 | REA 指定的 JADX 桥接 jar,已根据 REA 的 SHA-256 校验 |
| Apktool | 3.0.3 | 资源和字符串解码 |
| adb | 34.0.5 | 设备工具;这是 REA 验证过的版本 |
| Node.js | 24 | 运行 REA 和桥接程序 |
APK 分析无需额外设置:inspect_android_package、
search_android_classes、inspect_android_class、inspect_android_method、
trace_android_references 和 decode_android_resources 开箱即用,REA 的静态 JavaScript/Electron、.NET、Go、Rust、WASM、SQLite 和捕获工具也同样如此。
原生二进制反编译(APK 中的 .so 库,或任何其他 ELF、PE 或 Mach-O 文件)需要 Ghidra。它是免费的,但会额外占用约 900 MB,因此未预装:设置 REA_INSTALL=ghidra,容器便会在首次启动时下载它。详见可选工具。
镜像为 linux/amd64 和 linux/arm64 构建。CI 会在两种架构上运行 APK 测试。Ghidra 仅支持 amd64。
快速开始
export REA_BRIDGE_TOKEN="$(openssl rand -hex 32)"
mkdir -p targets && cp /path/to/app.apk targets/
docker run -d --name rea \
-e REA_BRIDGE_TOKEN \
-p 127.0.0.1:8080:8080 \
--read-only \
--tmpfs /tmp:rw,nosuid,size=4g \
--tmpfs /home/rea:rw,nosuid,size=256m \
--cap-drop ALL \
--security-opt no-new-privileges \
-v "$PWD/targets:/work:ro" \
psyb0t/reverse-engineer-anything:latest
claude mcp add --transport http rea http://localhost:8080/mcp \
--header "Authorization: Bearer $REA_BRIDGE_TOKEN"
然后向你的 Agent 提出类似这样的问题:“反编译 /work/app.apk 中的登录流程,并告诉我令牌存储在哪里。”路径是容器内的路径:挂载到 /work 的内容就是 REA 能看到的内容。
运行方式
入口点接受一个参数:
| 命令 | 运行内容 |
|---|---|
bridge | 默认值。在 /mcp 上通过 8080 端口提供 Streamable HTTP MCP,需要 bearer token。 |
mcp | REA 自带的 stdio MCP 服务,供仅支持 stdio 的客户端通过 docker run -i 启动。 |
| 其他任何值 | REA CLI,例如 --help 或 inspect-android-package /work/app.apk。 |
Streamable HTTP 桥接
桥接服务是在 rea mcp 前端运行的轻量 Node 服务。每个 MCP 会话都会启动独立的 REA 进程,因为 REA 会按进程保存分析状态。消息会原样传递,包括进度通知。会话会在收到 DELETE、达到空闲超时时间或容器停止时结束,关联的 REA 进程也会随之终止。
stdio MCP
适用于只能启动本地命令的客户端:
{
"mcpServers": {
"rea": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--read-only",
"--tmpfs",
"/tmp:rw,nosuid,size=4g",
"--tmpfs",
"/home/rea:rw,nosuid,size=256m",
"--cap-drop",
"ALL",
"--security-opt",
"no-new-privileges",
"-v",
"/absolute/path/to/targets:/work:ro",
"psyb0t/reverse-engineer-anything:latest",
"mcp"
]
}
}
}
CLI
docker run --rm --network none --read-only \
--tmpfs /tmp:rw,nosuid,size=4g --tmpfs /home/rea:rw,nosuid,size=256m \
--cap-drop ALL --security-opt no-new-privileges \
-v "$PWD/targets:/work:ro" \
psyb0t/reverse-engineer-anything:latest \
search-android-classes /work/app.apk MainActivity
输出为 JSON。--help 会列出所有命令。
选择启用的工具
REA 可以驱动的一些工具可免费再分发,但体积太大,不适合放入每个镜像中。将它们的名称填入 REA_INSTALL,并在 /opt/rea-tools 挂载一个卷:
docker run -d --name rea \
-e REA_BRIDGE_TOKEN \
-e REA_INSTALL=ghidra \
-v rea-tools:/opt/rea-tools \
-p 127.0.0.1:8080:8080 \
--read-only \
--tmpfs /tmp:rw,nosuid,size=4g \
--tmpfs /home/rea:rw,nosuid,size=256m \
--cap-drop ALL \
--security-opt no-new-privileges \
-v "$PWD/targets:/work:ro" \
psyb0t/reverse-engineer-anything:latest
启动时,在运行 REA 之前,入口点会安装列表中尚未存在于卷内的工具。它会下载镜像中固定的版本,验证 SHA-256 匹配后才会继续,然后解压并将 REA 指向该工具。后续启动时会在卷内找到该工具,因此跳过下载。此功能适用于所有模式,包括 mcp 和 CLI,并且只向 stderr 输出日志。
| 名称 | 安装内容 | 下载 / 安装后大小 | 架构 | 启用功能 |
|---|---|---|---|---|
ghidra | Ghidra 12.1.4 | 570 MB / 880 MB | amd64 | 原生反编译、函数、交叉引用、字符串 |
首次启动需要访问 GitHub 网络。若没有挂载卷,--read-only 容器无处存放工具,因此会退出并说明原因;可写容器则会将工具安装到自身层中,每个新容器都需要重新下载。Ghidra 的官方发行版没有 arm64 反编译器,因此在 arm64 上设置 REA_INSTALL=ghidra 时会说明原因并拒绝安装,而不是以不完整状态运行。
自行提供
付费或需要登录的工具不会被自动下载。请自行安装,并将 REA 指向它们:
- 自行构建的 Ghidra(arm64 构建版或较新版本):挂载后设置
GHIDRA_INSTALL_DIR。设置了GHIDRA_INSTALL_DIR时,它的优先级高于REA_INSTALL=ghidra。 - IDA:挂载你的安装目录,并按照 REA 的 IDA 指南设置
REA_IDA_MCP_CONFIG。 - JEB:在 REA 可通过回环地址访问的位置运行其 MCP 服务(与容器共享网络命名空间的 sidecar),并设置
REA_JEB_MCP_URL。 - Hopper 是桌面应用,此处不支持。
配置
| 变量 | 默认值 | 描述 |
|---|---|---|
REA_BRIDGE_TOKEN | 必需 | Bearer 令牌,至少 32 个字符。绝不会传递给 REA。 |
REA_BRIDGE_PORT | 8080 | 容器内的监听端口。 |
REA_BRIDGE_HOST | 0.0.0.0 | 容器内的监听地址。 |
REA_BRIDGE_PATH | /mcp | MCP 端点路径。 |
REA_BRIDGE_ALLOWED_HOSTS | localhost,127.0.0.1,[::1] | 接受的 Host 标头名称(防范 DNS 重绑定)。* 可禁用此限制。 |
REA_BRIDGE_MAX_SESSIONS | 4 | 并发 MCP 会话数,每个会话都有自己的 REA 进程。 |
REA_BRIDGE_IDLE_TIMEOUT_SECONDS | 1800 | 空闲会话会关闭,其 REA 进程也会停止。 |
REA_BRIDGE_MAX_BODY_BYTES | 4194304 | 可接受的最大请求正文大小。 |
REA_BRIDGE_LOG_LEVEL | info | debug、info、warn 或 error。日志以 JSON 格式输出到 stdout。 |
REA_INSTALL | 未设置 | 启动时要安装的逗号分隔的可选工具。 |
REA_TOOLS_DIR | /opt/rea-tools | 可选工具的安装位置。在此处挂载卷。 |
REA 自身的变量会直接传递,例如用于处理大型 APK 的 REA_JADX_HEAP_MIB 和
REA_JADX_OPERATION_TIMEOUT_MS、REA_LOG_LEVEL 或
REA_MCP_MAX_RESPONSE_BYTES。请参阅 REA 的
文档。镜像会预设
JAVA_HOME、REA_JADX_MCP_JAR、REA_APKTOOL_COMMAND 和
REA_ADB_PATH。
GET /healthz 无需令牌即可响应:{"status":"ok","sessions":N}。
安全
REA 可以运行、操控和检测它所分析的软件,并且自身不执行权限检查。容器就是安全边界,因此请严格限制:
- 桥接服务没有令牌就不会启动,会以恒定时间比较令牌,检查
Host标头,并且绝不会将令牌交给 REA。 - 镜像以非特权
rea用户运行。请按示例中的方式运行:根文件系统设为只读,为/tmp和/home/rea使用 tmpfs,移除所有功能,启用no-new-privileges,以只读方式挂载目标,并将端口绑定到 127.0.0.1。 /tmp不能设为noexec:JVM 会从中加载原生库。- 要将其暴露给 localhost 以外的网络?请在前置位置配置 TLS,并将主机名添加到
REA_BRIDGE_ALLOWED_HOSTS。 - 仅分析你拥有或获准检查的软件。REA 的 免责声明适用。
Agent 集成
- 面向 Claude Code、Codex 和 OpenClaw 的技能:
claude plugin install reverse-engineer-anything@psyb0t、codex plugin add reverse-engineer-anything@psyb0t,或从 ClawHub 安装。它会向 Agent 介绍 APK 工作流,并附带一个限制严格的 CLI 包装器。请先添加市场:claude plugin marketplace add psyb0t/agents。 - OpenClaw 插件
@psyb0t/reverse-engineer-anything:用于连接运行中容器的 stdio 桥接程序。设置REA_URL和REA_BRIDGE_TOKEN。 - MCP 注册表:
io.github.psyb0t/reverse-engineer-anything。
版本和更新
镜像版本使用本仓库自己的版本(VERSION);REA 的版本见上表和
package.json。REA 几乎每天都会发布新版本。此镜像仅在 REA 版本或其他 npm 包至少发布七天后才会采用,并通过冻结的锁文件安装,且禁用生命周期脚本;每个下载的 jar 都会与固定的 SHA-256 值进行校验。可选工具遵循相同规则:每个镜像版本只采用一个版本,且该版本至少发布七天,并通过其 SHA-256 值进行校验。基础镜像通过摘要固定。
开发
宿主机需要安装 Docker、Make、Git 和 shell。其他所有操作都在容器中运行。
make help # every target
make lint # tsc, eslint, prettier, shellcheck, hadolint
make test # bridge unit tests + the image against a real APK
make build # build psyb0t/reverse-engineer-anything locally
make run # run the bridge on 127.0.0.1:8080 (needs REA_BRIDGE_TOKEN)
make pkg-update PKG=rea-agents # move to the newest REA that clears the age gate
集成测试会启动经过强化的容器,检查缺少令牌时是否返回 401,然后通过桥接器调用 REA 的 Android 工具,对 Appium 的 ApiDemos APK 进行测试。测试还会启动一个设置了 REA_INSTALL=ghidra 的容器,让 Ghidra 通过桥接器分析一个二进制文件(在 arm64 上则会检查是否拒绝执行)。Ghidra 下载文件会缓存到 rea-integration-tools 卷中;make clean 会将其删除。
许可证
本仓库代码采用 WTFPL 许可证。REA 采用 MIT 许可证,捆绑的工具则保留各自的许可证:详见 THIRD_PARTY_NOTICES.md。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。