🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

逆向工程模式 Verisw/rea-dsh

DeepSeek Harness
Verisw11 天前有提交已提供中文文档扫描:含敏感能力

调用 Ghidra、IDA 等工具反编译样本并产出证据化分析记录

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/25 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Verisw/rea-dsh
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 11 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 49 处,展示前 32 条)
  • 执行外部命令来自配置/变量
    scripts/setup.mjs:61
    const result = spawnSync(command, args, { stdio: 'inherit', cwd: repoRoot, ...options });
  • 执行外部命令来自配置/变量
    scripts/setup.mjs:66
    return spawnSync(command, args, { encoding: 'utf8', cwd: repoRoot, ...options });
  • 执行外部命令来自配置/变量
    scripts/setup.mjs:308
    const child = spawn(process.execPath, [proxy], {
  • 读取本地文件
    scripts/market-check.mjs:22
    const pkg = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8'));
  • 执行外部命令来自配置/变量
    scripts/market-check.mjs:92
    return execFileSync(cmd, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
  • 读取本地文件
    scripts/market-check.mjs:102
    if (existsSync(anchor)) return { profile: name, anchor, lib: join(dirname(anchor), 'lib') };
  • 读取本地文件
    scripts/market-check.mjs:114
    if (existsSync(join(repoRoot, 'cordis.patch.yml'))) pass('cordis.patch.yml 在包根');
  • 读取本地文件
    scripts/market-check.mjs:129
    const readme = existsSync(join(repoRoot, 'README.md')) ? readFileSync(join(repoRoot, 'README.md'), 'utf8') : '';
  • 读取本地文件
    scripts/market-check.mjs:129
    const readme = existsSync(join(repoRoot, 'README.md')) ? readFileSync(join(repoRoot, 'README.md'), 'utf8') : '';
  • 读取本地文件
    scripts/market-check.mjs:147
    if (!existsSync(root)) {
  • 发起网络请求
    scripts/market-check.mjs:266
    const res = await fetch(CATALOG_URL, { signal: AbortSignal.timeout(15000) });
  • 请求外部主机registry.npmjs.org
    scripts/market-check.mjs:280
    const res = await fetch('https://registry.npmjs.org/' + encodeURIComponent(pkg.name), { signal: AbortSignal.timeout(10000) });
  • 发起网络请求
    scripts/market-check.mjs:280
    const res = await fetch('https://registry.npmjs.org/' + encodeURIComponent(pkg.name), { signal: AbortSignal.timeout(10000) });
  • 读取本地文件
    scripts/publish-check.mjs:13
    const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
  • 读取本地文件
    scripts/publish-check.mjs:14
    const changelog = readFileSync(join(root, 'CHANGELOG.md'), 'utf8');
  • 执行外部命令固定命令
    scripts/publish-check.mjs:47
    return execFileSync('npm', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
  • 执行外部命令固定命令
    scripts/rea-lazy.mjs:129
    const proc = spawn('npx', ['--prefer-offline', '-y', SPEC, 'mcp'], {
  • 读取本地文件
    scripts/sync-tui.mjs:28
    const lines = readFileSync(PATCH, 'utf8').split('\n');
  • 读取本地文件
    scripts/sync-tui.mjs:56
    try { current = readFileSync(TARGET, 'utf8'); } catch {}
  • 写入本地文件
    scripts/sync-tui.mjs:67
    writeFileSync(TARGET, next);
  • 读取本地文件
    scripts/verify.mjs:36
    try { if (candidate && existsSync(candidate)) return candidate; } catch {}
  • 读取本地文件
    scripts/verify.mjs:63
    const parse = (path) => yaml.load(readFileSync(path, 'utf8'), { schema });
  • 读取本地文件
    scripts/verify.mjs:68
    const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
  • 读取本地文件
    scripts/verify.mjs:71
    if (pkg.license === 'MIT' && existsSync(join(root, 'LICENSE'))) ok('license declared and present', 'MIT'); else bad('license declared and present', St
  • 读取本地文件
    scripts/verify.mjs:74
    if (patchPath === './cordis.patch.yml' && existsSync(join(root, patchPath))) ok('dsh.bundle.patch resolves', patchPath);
  • 读取本地文件
    scripts/verify.mjs:78
    const missing = [...new Set(shipped)].filter((entry) => !existsSync(join(root, entry)));
  • 删除本地文件递归
    scripts/verify.mjs:217
    rmSync(fake, { recursive: true, force: true });
  • 写入本地文件
    scripts/verify.mjs:218
    mkdirSync(join(fake, 'node_modules'), { recursive: true });
  • 删除本地文件递归
    scripts/verify.mjs:220
    return { baseUrl: `${pathToFileURL(fake).href}/`, cleanup: () => rmSync(fake, { recursive: true, force: true }) };
  • 删除本地文件递归
    scripts/verify.mjs:271
    rmSync(fake, { recursive: true, force: true });
  • 写入本地文件
    scripts/verify.mjs:272
    mkdirSync(join(fake, 'node_modules'), { recursive: true });
  • 删除本地文件递归
    scripts/verify.mjs:275
    rmSync(fake, { recursive: true, force: true });
扫描于 2026/11/4(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
展开完整介绍(123 字)↓

DeepSeek Harness 逆向工程预设:一个预设挂载约 139 个 REA 工具(Ghidra / Hopper / IDA),配逆向工程师人设和证据优先的分析工作流,以 dsh 包形式安装到桌面、web、无头与 dsh-tui 配置档。

README

由 DeepSeek 最新模型翻译生成
dsh-rea-reverse-preset 简体中文 · English · 架构说明 · 排障手册 · 更新日志 给 DeepSeek Harness(dsh) 加一个「逆向工程模式」。 在 dsh 的 preset 选择器里会多出一项 逆向工程模式,选中后 agent 就带着 REA 的逆向工具(约 139 个,覆盖 Ghidra / Hopper / IDA 与二进制、Electron 制品分析)、一套逆向分析师人设,以及一个强调「证据落点」的逆向工作流技能,可以直接对着样本开始干活。 这个模式能做什么 - 反编译 / 反汇编:调 Ghidra、Hopper、IDA 的 headless 或 CLI,拿伪代码、交叉引用、调用图、函数边界。 - 二进制侦察:字符串、符号、节区、导入导出表、熵与编译器指纹,先摸清结构再动手。 - 打包制品:Electron 的 .app 与 asar、APK / IPA、JS bundle,解开再分析。 - 交叉验证:同一个函数在多个引擎里对照,减少单一反编译器的误判。 - 落文档:按「证据 → 结论」写分析记录,而不是「看起来像」。 引擎缺哪个,就少哪一组工具,其余照常可用——不会因为没装 IDA 就整个模式起不来。
展开完整文档(README 剩余 1 节)
dsh-rea-reverse-preset

简体中文 · English · 架构说明 · 排障手册 · 更新日志

给 DeepSeek Harness(dsh) 加一个「逆向工程模式」。

在 dsh 的 preset 选择器里会多出一项 逆向工程模式,选中后 agent 就带着 REA 的逆向工具(约 139 个,覆盖 Ghidra / Hopper / IDA 与二进制、Electron 制品分析)、一套逆向分析师人设,以及一个强调「证据落点」的逆向工作流技能,可以直接对着样本开始干活。

这个模式能做什么

- 反编译 / 反汇编:调 Ghidra、Hopper、IDA 的 headless 或 CLI,拿伪代码、交叉引用、调用图、函数边界。
- 二进制侦察:字符串、符号、节区、导入导出表、熵与编译器指纹,先摸清结构再动手。
- 打包制品:Electron 的 .app 与 asar、APK / IPA、JS bundle,解开再分析。
- 交叉验证:同一个函数在多个引擎里对照,减少单一反编译器的误判。
- 落文档:按「证据 → 结论」写分析记录,而不是「看起来像」。

引擎缺哪个,就少哪一组工具,其余照常可用——不会因为没装 IDA 就整个模式起不来。

为什么用它

| 优势 | 说明 |
| 一条命令装好 | npm run setup 装进所有界面,顺手探引擎、自检,最后告诉你重启哪一个。 |
| 一套覆盖四个界面 | 桌面 App、dsh web、dsh-tui、headless 共用同一份 bundle,不用各写一份配置。 |
| 不动宿主 | 只在 preset 里加一棵子树;权限、模型路由、沙箱、持久化仍由你的部署决定。 |
| 不常驻 | 宿主启动时不拉引擎:工具清单来自本地缓存,第一次真正调用工具才起 REA,静默 10 分钟自动退出。 |
| 换机器不用改文件 | 包里没有任何机器相关路径,引擎位置全走环境变量。 |
| 坏了不影响主流程 | REA 起不来时模式仍可选,只是少一组工具,不会把 dsh 拖崩。 |
| 卸载干净 | 摘掉 bundle 就回到原状,宿主自带组合一行未改。 |
| 自带自检 | npm run verify 离线校验结构与可移植性,verify:profiles 用宿主真实装载链路再验一遍。 |

安装

一条命令(推荐)

npx -y dsh-rea-reverse-preset setup # 从 npm 包跑
npm run setup # 从 checkout 跑

它会依次:检查 node / dsh 版本与本机 profile → 装进每一个界面 → 探测 Hopper / Ghidra / Java / IDA → 跑校验 → 打印重启清单。中途不需要回答任何问题,重复执行是幂等的。

npx -y dsh-rea-reverse-preset --check # 只看状态,不动文件
npm run setup -- --write-env # 把探到的引擎路径写进 ~/.zshrc
npm run setup -- --warm # 预热:把 REA 下好,并生成工具清单缓存
npm run setup -- --uninstall # 从所有界面卸掉

分界面手动装

| 你在用 | profile | 装法 | 生效方式 |
| 桌面 App | desktop | dsh plugin --profile desktop add github:Verisw/rea-dsh | 完全退出 App 再打开(Cmd+Q,不是关窗口) |
| 浏览器里的 dsh web | web | dsh plugin --profile web add github:Verisw/rea-dsh | 重启 dsh web |
| 终端里的 dsh-tui | dsh-tui | dsh plugin --profile dsh-tui add github:Verisw/rea-dsh | 重启 TUI |
| dsh -p(脚本 / headless) | headless | dsh plugin --profile headless add github:Verisw/rea-dsh | 下次运行自动带上 |

桌面 App 与 dsh web 是两个独立 profile,各装各的,装哪个只影响哪个界面。
桌面 profile 需要 App 自己先创建过一次——装之前先完全退出 App。

dsh plugin 本身要求 Node ≥ 22.18 / ≥ 24(更早的 Node 缺少 import.meta.main,命令会静默退出、exit 0 但什么都没装)。npm run setup 会先探这一步;症状与处理见
docs/troubleshooting.md §10。

看本机装没装:

node scripts/install.mjs

profiles under /Users/you/.dsh/profiles:
desktop installed
dsh-tui not installed

使用

1. 重启对应界面。
2. /preset → 逆向工程模式(或直接 /preset reverse)。
3. /mcp 看一眼 REA 是否起来;起来后工具名形如 mcp__rea__。
4. 开始分析:给它一个样本路径,说清楚要查什么(功能、协议、校验逻辑、版本差异…)。

有两点需要知道:

- 已经产生过对话的会话不能切 preset,新开一个会话再切。
- 引擎不常驻。模式挂载时 dsh 只启动一个很轻的转接进程,工具清单直接从本地缓存(~/.dsh/cache/dsh-rea-reverse-preset/)读出来给宿主,139 个工具照样在列;第一次真正调用 mcp__rea__ 才把 REA 拉起来(热缓存约 1–2 s),之后静默 10 分钟自动退出,下次调用再起。已经开着逆向会话也不会闲着占内存。
缓存还没生成时(全新机器)第一次启动会拉起一次 REA 来填清单,跑 npm run setup -- --warm 可以提前把这步做完,也顺带把 npx 的那份包下好。

引擎位置(可选)

不配也能用:REA 会自己找引擎。装了多个版本、或不在默认位置时,用这些变量指定。

| 环境变量 | 作用 |
| HOPPER_LAUNCHER_PATH | Hopper 的 CLI 入口。macOS 默认位置存在时会自动用上。 |
| GHIDRA_INSTALL_DIR | Ghidra 解压目录。版本要对得上 REA 的要求(当前 12.1.4)。 |
| JAVA_HOME | Ghidra 用的 JVM;PATH 上的 java 版本不够新时才需要。 |
| REA_IDA_MCP_CONFIG | IDA MCP 配置文件,IDA 9.x 走这个开关。 |
| REA_MCP_SPEC | 换 REA 版本,例如 REA_MCP_SPEC=rea-agents@6.7.0,不用改本包。 |
| REA_LAZY_IDLE_MS | 引擎静默多久自动退出,毫秒,默认 600000(10 分钟);0 表示不退出。 |
| REA_LAZY_MODE | 填 eager 退回旧行为(宿主启动就拉起 REA),默认 lazy。 |

这些变量由 dsh 进程读取,改完要重启界面。写成空字符串等于没配,会被自动忽略。

卸载

dsh plugin --profile <desktop|web|headless|dsh-tui> remove dsh-rea-reverse-preset
npm run unlink:all # 本地软链安装的用这个

常见问题

| 现象 | 先去查 |
| preset 列表里没有「逆向工程模式」 | 装到了别的 profile,或者没重启;dsh 版本不在支持区间时会被整包跳过。 |
| 模式在,但 REA 工具是 0 个 | npx 冷启动超时、环境变量传了空串、引擎路径不对、走了代理。 |
| 工具少了几十个 | 对应引擎没找到(例如没配 IDA),这是预期行为。 |
| 技能没挂上 | 包路径被移动过,或 profile 里同时装了两份。 |
| 改了配置不生效 | dsh 只在启动时读取这些设置,必须重启进程。 |
| 没开逆向模式却有个 rea mcp 进程 | 老版本装的是直连版(启动即拉起),或设了 REA_LAZY_MODE=eager。 |

逐条排查步骤见 docs/troubleshooting.md。

说明

- 本包只声明一个 preset(id: reverse),正文是 21 个顶层行 / 34 个插件行;打包形态是一个
dsh bundle,因此 dsh plugin add 就能装。
- 宿主版本要求 @deepseek-ai/dsh >=0.2.0-rc.2 <0.3.0-0。超出区间时本包会被跳过并给出提示,而不是把你的组合改坏。
- 装了什么、为什么这么装、!!js 求值环境与兼容性门槛,见 docs/architecture.md。

许可

MIT(见 LICENSE)。本包调用 REA(MIT),不打包其代码; Ghidra / Hopper / IDA 各自独立授权,本包不附带也不代管。
预览分享卡片长什么样 ↓Verisw/rea-dsh
分享 · DeepSeek Harness Hub
Verisw/rea-dsh

调用 Ghidra、IDA 等工具反编译样本并产出证据化分析记录

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部