dsh-plugin-rea
Verifieddsh-plugin-rea · v2.0.2 · MIT
One-plugin bundle: provisions Node/REA/JDK/Ghidra for you, then registers the upstream REA MCP server as mcp__rea__* tools. · 一体包:自动准备 Node/REA/JDK/Ghidra,并把上游 REA 的 MCP 服务接入 DeepSeek Harness。
Install
dsh plugin add dsh-plugin-rea Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-plugin-rea
English · 简体中文
这是哪个版本?2.x —— 而
main就是它。 2.x 自己准备运行时(Node、REA CLI、JDK、Ghidra)再把那一行接好: 装插件 → 跑一次scripts/setup.mjs→ 重启 dsh。 1.x 是更早的纯配置适配器 —— 它假设rea在 PATH 上、Ghidra 由你自己装好 —— 保留在v1分支,npm 上仍是[email protected]。 完整对比:两条线:1.x 与 2.x · 升级:从 1.x 升级。
把上游 REA — Reverse Engineer Anything 的 MCP 服务接入
DeepSeek Harness(dsh),让它的工具在会话里以 mcp__rea__* 出现。

这是什么
一个带供给层的 Cordis bundle。package.json 声明 dsh.bundle.patch,该 patch 插入一行官方 MCP 客户端
插件(@deepseek-ai/dsh-mcp-client)。这一行用当前运行的 Node 可执行文件启动 bin/rea-shim.mjs,由 shim
读取 scripts/setup.mjs 写下的本机状态,再拉起它供给的 REA CLI。这里没有任何分析代码,且发布出去的
patch 里不含任何机器路径。
第三方适配。 本仓库不属于 REA,不携带 REA 的任何代码,也不由 REA 作者维护;它只组装一行配置, 并从上游官方源拉取上游自己的发布物。 上游:github.com/morluto/rea(MIT)· 中文文档 · rea.tools · npm 包
rea-agents。 REA 自身的问题请提给上游;本插件的问题提到 本仓库 issues。
它只做三件事:注册 mcp__rea__* 这批工具名;把每台机器各自的引擎环境
(GHIDRA_INSTALL_DIR、JAVA_HOME、REA_ADB_PATH、REA_APKTOOL_COMMAND、REA_JADX_MCP_JAR、
REA_BROWSER_EXECUTABLE 等)限定在那一个 MCP 子进程上、而不是整个 harness;以及把这些组件装到盘上。
能做什么、不能做什么
分析能力属上游,本节只是复述上游自己的契约,避免预期错位。
- 它无法还原完整源码。 原生二进制上游给的是伪代码与汇编,APK 是反编译方法,JEB 单元是伪代码, JavaScript/Electron 是模块及其关系。上游的工具契约明确写着伪代码"是反编译器输出,不是原始源码, 也不与另一 provider 的输出文本等价"。
- 实际上拿不回来的:原始标识符名、类型、注释、宏与模板展开、构建脚本与资源。优化(内联、重排)、 符号剥离、混淆、加壳、VM 保护只会让输出更差。
- 每个结果都带置信度与限制(
observed/derived/inferred,外加一份明确的 limitations 列表)。 请当证据读,别当还原出来的源码。 - 适合:理解行为、定位实现、互操作与兼容重写、安全审阅、迁移参考。要拿真正的源码,走正规渠道 —— 上游仓库、厂商授权,或厂商自己的 SDK。
供给解决不了的部分。 这些是上游的宿主门槛,不是本插件漏配了什么:
| 能力 | 门槛 |
|---|---|
| Hopper provider | 仅 macOS |
| IDA provider | 需要你自己的 IDA 与 REA_IDA_MCP_CONFIG;REA 从不启动 IDA |
固件 binwalk / unblob |
仅 Linux |
| Wakaru JS 还原、pwntools 的 ELF/宕机转储路径 | 仅 Linux x64 |
| pwndbg / gdb 核心上下文 | 仅 Linux、macOS |
| 原生 mitmproxy 抓包 | 仅 Linux(REA_MITMDUMP_COMMAND);HAR 不需要引擎 |
| 苹果工具链(Mach-O、plist、资源目录、LLDB) | 仅 macOS |
capture_process_scenario |
仅 Linux/macOS 的 PTY |
| apktool(Android 资源解码) | 仅当 REA_APKTOOL_COMMAND 指向 Node 能直接执行的文件时才可用:上游用 execFile 不加 shell 直接起这个命令,而 Windows 上 Node 无法直接执行 .bat/.cmd(EINVAL)。本包按上游文档接的是官方 apktool.bat,所以在 Windows 上它拿不到版本、该能力不可用;JADX 走 jar,不受影响 |
两条线:1.x 与 2.x
2.x —— 当前这条,main |
1.x —— v1 |
|
|---|---|---|
| 是什么 | 适配器加供给:自己准备 Node、REA CLI、JDK、Ghidra,再把那一行接好 | 纯配置适配器:一行 MCP 行,指向你自己装好的 rea |
| 前置 | 运行时什么都不用装 —— 缺什么它去取(--reuse 则复用机器上已有的 Ghidra/JDK) |
Node.js(满足 REA engines)、npm i -g rea-agents,原生分析还要 Ghidra 12.1.x |
| 首次运行 | 先跑一次 scripts/setup.mjs(或引导脚本),再重启 dsh |
不用跑任何东西 |
| 那一行启动什么 | 当前 Node 可执行文件 + <DSH_HOME>/plugins/rea-bundle/bin/rea-shim.mjs(由 shim 读本机状态) |
Windows 上 cmd.exe /c rea mcp,macOS/Linux 上 rea mcp |
| 机器状态 | <DSH_HOME>/plugins/rea-bundle/ —— bundle.json、vendor/、cache/ |
你自己的 REA 与 Ghidra 安装 |
| 安装 | dsh plugin --profile <profile> add dsh-plugin-rea(npm latest ≥ 2.0.0) |
… add [email protected],或 github:czcdr/dsh-plugin-rea#v1.0.6 |
两条线发布的是同一种 patch 形态(一条 insert 行,@deepseek-ai/dsh-mcp-client),对外也提供同一套
mcp__rea__* 工具面;区别只在"谁准备运行时"。从 1.x 到 2.x 只要两条命令,见
从 1.x 升级。
安装
前置什么都不用装。 在干净的 Windows x64 机器上:
powershell -ExecutionPolicy Bypass -File scripts\rea-bundle-bootstrap.ps1 -Reuse
-Reuse 会复用你已有的 Ghidra/JDK;去掉它则从官方发布下载两者(约 775 MB,逐个校验和验证)。然后为你的
profile 安装插件:
dsh plugin --profile <profile> add dsh-plugin-rea
# 或钉住这个版本,而不是跟着 npm latest 走:
dsh plugin --profile <profile> add github:czcdr/dsh-plugin-rea#v2.0.0
Electron 宿主(DeepSeek Harness 桌面版)的 profile 由应用独占。 那种机器上
dsh plugin --profile desktop …会被 CLI 直接拒绝(profile "desktop" is managed exclusively by the Electron application),请改用应用内的 插件管理器安装/更新;上面这条 CLI 只适用于你自己用 CLI 建的非desktopprofile。
如果机器上已经有 Node,可以跳过引导脚本直接供给:
node scripts/setup.mjs --reuse # 或先 --dry-run 看计划
反过来先装插件也可以,但要分两步:发布的行指向 <DSH_HOME>/plugins/rea-bundle/bin/rea-shim.mjs,
而那个文件只有 setup 会创建——所以在第一次供给之前,该行会以 MODULE_NOT_FOUND 退出,也就没有
任何东西能去启动后台供给(harness 本身不受影响:failOnStartupError: false 是刻意的)。先手动跑一次
node scripts/setup.mjs;此后 shim 就位,之后每一次「状态缺失」都由它自己发现并在后台补供给。
配置 —— 不需要
发布的那一行不含任何机器路径:
- insert:
- id: mcp-rea
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: rea
transport: stdio
command: !!js process.execPath
args:
- !!js "(process.env.DSH_HOME && process.env.DSH_HOME.trim() !== '' ? process.env.DSH_HOME : (process.env.USERPROFILE || process.env.HOME || '') + '/.dsh') + '/plugins/rea-bundle/bin/rea-shim.mjs'"
- mcp
env:
ELECTRON_RUN_AS_NODE: '1'
failOnStartupError: false
这一行里有四个"承重"细节,而且都先以 bug 的形式出现过:
!!js标量必须加引号。 裸标量里同时出现?和:时,它就不是一个标量了:YAML 会把它读成显式键值对,于是 loader 拿到的是一个 mapping 而不是表达式节点。用 harness 自己的方言实测(JSON_SCHEMA+app.asar里的!!js类型),不加引号时args[0]变成{"[object Object]": "..."}—— 一个行根本无法用来启动的对象。加引号消除歧义,内部的 JS 字符串改用单引号。- 必须用正斜杠,不能用反斜杠。 YAML 单引号标量会保留
\字面量,接着 JavaScript 会把它吃掉:'\plugins'不是路径而是 BEL 控制字符,'\rea-bundle'变成回车、'\bin'变成退格 —— 路径被静默摧毁。正斜杠在 Windows 与 POSIX 上都成立。 DSH_HOME的兜底是<home>/.dsh,不是<home>。 shim、setup.mjs、bootstrap.ps1三者都把未设置的DSH_HOME解析到<home>/.dsh/...;兜底少这一层,行就会指向供给永远不会写的位置 —— 而在DSH_HOME恰好被设置的机器上,这个错误完全不可见。!!js表达式里没有path/require:ctx是 loader 作用域,所以 DSH_HOME 的兜底写成纯字符串拼接。
npm run bundle:audit 会把前三条钉住:它用「DSH_HOME 未设 / 为空 / 已设」三种情形求值这个表达式,并拒绝会被 YAML 读成 mapping 的裸标量。
ELECTRON_RUN_AS_NODE 只在 harness 本身跑在 Electron 上时才有意义;对纯 Node 宿主无害,而显式写出来胜过依赖它恰好能在子进程环境清洗中存活。
command 是当前运行的 Node 可执行文件,args[0] 由 DSH_HOME 在启动时算出,所以同一份 patch 在
Windows、macOS、Linux 上都成立,且不依赖 PATH 上的 rea。所有机器相关的真相都放在
<DSH_HOME>/plugins/rea-bundle/bundle.json,由 setup 写入,可随时查看:
node bin/rea-shim.mjs --shim-status # 解析到的路径、版本、校验状态
node bin/rea-shim.mjs --shim-print-env # MCP 子进程将看到的环境变量
这两个命令在插件目录(checkout 副本)或 <DSH_HOME>/plugins/rea-bundle(镜像副本)里跑都给出同一
答案:checkout 副本按与 setup 相同的规则解析供给位置,镜像副本用自身位置(因为 MCP 子进程的环境里
DSH_* 会被剥掉,它不能依赖 DSH_HOME)。
设 REA_BUNDLE_AUTO_PROVISION=0 可关掉首次运行的后台自动供给。
想在本机把这一行改成别的启动命令(例如用你自己全局装的 rea),从 profile 自己的
cordis.patch.yml 按 id 覆盖即可 —— 那个文件是机器本地的,永不发布。一个 profile 里只允许一行使用
serverName: rea。
验证
随便发一个 mcp__rea__* 调用 —— binary_session 会报引擎各项检查
(configuration / installation / headless / native_decompiler / java),应当全为 ok: true。
然后 open_binary 一个 PE、binary_overview、procedure_pseudo_code。
供给本身结束时也会跑两道探针:rea doctor --json(如实报告,并点名未满足项),以及与 MCP 行完全相同的
shim 启动。
实测环境
作者机器,2026-10-13 / 14:
| 组件 | 版本 |
|---|---|
REA(rea-agents) |
6.4.0(170 个工具) |
| DeepSeek Harness | desktop runtime 0.2.0-rc.2,内含 dsh CLI 0.1.7-rc.2 |
@deepseek-ai/dsh-mcp-client(行 provider) |
随 harness 打包 |
| Ghidra | 12.1.4 |
| JDK | Temurin 21(供给)/ Microsoft OpenJDK 25.0.4(复用) |
| Node.js | 24.21.0(REA engines:^22.19.0 || ^24.11.0 || >=26.0.0) |
| 宿主 | Windows 11 x64(build 26200) |
实测跑过:一次干净的 setup.mjs --reuse 走到 setup complete;一次不经 PATH 上的 rea、完全经由
shim 的 MCP initialize 握手返回 serverInfo {name: rea, version: 6.4.0};以及真实桌面宿主下的完整链路 ——
宿主自己的 Electron 二进制启动 <DSH_HOME>/plugins/rea-bundle/bin/rea-shim.mjs mcp,shim 拉起 bundle 内置
的 REA,随后一次真实工具调用报出 path_source: environment,而那个路径只有该机的 bundle.json 知道。
本机没有端到端跑过、因此不做承诺的:约 775 MB 的 JDK + Ghidra 下载分支(--dry-run 有计划,本机用
--reuse 复用了已有安装),以及 macOS/Linux 的首次运行。
边界与注意事项
- REA 在 6.4.0 有 170 个工具,每个会话的工具列表都会变长。
- 校验和对得起良心:厂商发布了的就固定并验证;没发布的(jadx-headless-mcp、apktool 包装脚本、
Android platform-tools、滚动的
latest地址)则实测一次并记录,之后若漂移是报告而不是默默接受。bundle.json的unverifiedChecksums会列出处于该状态的组件。 - 某些网络下很慢(这里实测 GitHub release CDN 只有 0.35–0.54 MiB/s,光 Ghidra 就要 25–45 分钟)。 下载是可续传的:缓存保留并重新校验,被中断的一轮会继续而不是从头再来。
- 代理:Node 的全局
fetch不读系统代理,而 .NET/PowerShell 会读。在开着 WinINET 代理的机器上, 同一个地址Invoke-WebRequest通、Node 却ECONNRESET/超时。setup 自己解析代理 (环境变量优先,Windows 上回退读注册表)并用 CONNECT 隧道,NO_PROXY也照常生效。 - REA 的部分工具会启动进程、写文件、访问网络 —— DSH 的权限策略照常适用。只分析你有权检视的样本。
scripts/setup.mjs为 REA CLI 跑的是带--ignore-scripts的npm install:官方 tarball 不带node_modules,必须解析依赖闭包;而供给过程中刻意跳过包的 lifecycle 脚本。
更新 —— 三件互相独立的事
从 1.x 升级
装上 2.x 后,先跑一次供给,再重启 dsh:
node scripts/setup.mjs # 或:powershell -File scripts\rea-bundle-bootstrap.ps1 -Reuse
为什么必须先跑:1.x 的行从 PATH 上启动 rea mcp,而 2.x 的行启动
<DSH_HOME>/plugins/rea-bundle/bin/rea-shim.mjs —— 那个文件只有 setup.mjs 会创建。升级后直接重启,
该行会以 MODULE_NOT_FOUND 退出:harness 本身照常(failOnStartupError: false 是刻意的),但
mcp__rea__* 工具会消失,而且不会有任何修复提示 —— 会打提示的 shim 本身还不存在。跑完 setup 再启动,
工具就回来了。
- 本插件从不自更新。从市场装的就在市场更新;从
file:检出的就覆盖目录重装。 - 从
2.0.0-bundle.1升级:那一版镜像了 shim 与setup.mjs,却漏了 manifest,也没有留下插件 checkout 的记录,所以它供给出来的 bundle 无法自愈 —— 后台供给会因缺 manifest 而崩溃且完全不可见,而它自己写下的 lock 又会让重试被抑制六小时。请从插件目录重跑一次node scripts/setup.mjs:它会重新镜像三个文件, 并写下让后续运行找到真源的记录。check-updates.ps1会报告这个状态。 - 供给的组件:重跑
node scripts/setup.mjs,它会重新校验盘上的东西,只补缺失或不对的。 版本钉在manifest/bundle.manifest.json。 - 上游 REA / Ghidra:改清单里的钉子再重跑 setup。REA 对 Ghidra 有版本闸门(目前 12.1.x), 所以先更新 REA。
check-updates.ps1(Windows PowerShell)会一次性报告以上各项的状态。
还想用纯配置的 1.x 线?
1.x 是不带供给的适配器:一行配置,从 PATH 上启动 rea mcp,并假设 Ghidra 由你自己装好。这些情况它是更合适的选择 ——
你已经自己管理 REA 与 Ghidra、不希望插件去下载任何东西、或者想让那一行继续指向你自己的 rea:
dsh plugin --profile <profile> add [email protected]
# 或钉住分支而不是版本号:
dsh plugin --profile <profile> add github:czcdr/dsh-plugin-rea#v1.0.6
两条线发布的 patch 形态与 mcp__rea__* 工具面完全相同。1.x 维护在
v1 分支,它自己的安装说明也在那里(Node 满足 REA engines、
npm i -g rea-agents、原生分析需要 Ghidra 12.1.x)。
许可证
MIT(本适配器)。REA 是 MIT、归其作者;Ghidra 是 Apache-2.0、归 NSA;Temurin 是 GPLv2+CE;Node.js 是 MIT;apktool、jadx-headless-mcp、Android platform-tools 各自保留自己的许可。 本包不再分发任何上游代码或二进制 —— 供给过程是从各组件的官方源逐个拉取。