市面上绝大多数 AI 逆向 Agent,都依靠堆砌系统提示词、挂载 MCP 工具实现业务能力,但这套方案在复杂 JSVMP 逆向、受控环境执行、会话状态持久保存场景下会暴露出致命缺陷:提示词约束不可靠,运行时无法强制规则,会话证据极易丢失。DeepSeek Harness 提出的 “一切皆插件” 架构,给逆向 Agent 提供了全新路径,通过 npm 分发插件包,以 bundle、preset、作用域隔离的方式组装完整 Agent,不再依赖单一提示词约束业务逻辑。本文结合 dsh‑js‑reverse‑plugin 插件落地实操,从源码层面解析这套架构的运行逻辑,厘清逆向 Agent 工程化的正确实现路径。

一、JS 逆向 Agent 真实业务痛点:仅靠提示词与工具存在天然短板

很多开发者搭建 AI 逆向 Agent 时,惯性思路是:编写大量系统提示词,挂载 MCP 工具集合,交给大模型自主完成逆向流程。在简单 AST 解混淆场景尚能应付,但面对真实复杂 JS 逆向任务,整套体系会出现多处无法规避的漏洞,这些问题并非调优提示词、更换模型就可以解决。

第一,规则约束仅停留在模型记忆,运行时没有强制保障。逆向工作有硬性工程约束,原始混淆脚本必须只读,只允许操作派生副本;JSVMP 代码必须在 iv8 受控环境运行,禁止直接使用 Node.js 执行;服务器接口返回成功不能等价于算法还原完成,必须字节级等价校验。仅靠提示词告知模型规则,模型存在遗忘、忽略指令的情况,没有底层运行时做拦截校验,极易破坏原始样本,得出错误的逆向结果。

第二,会话证据状态容易丢失。逆向过程会产生大量中间产物:断点信息、浏览器运行 Trace、Bytecode、Handler、CFG 控制流图。如果全部依靠大模型上下文记忆,会话重启、分支 fork 之后,中间证据直接丢失,任务无法接续,无法支撑长周期大型逆向任务。

第三,能力耦合严重,无法按需迭代。把 AST 处理、iv8 受控执行、JSVMP 恢复全部封装进同一个 Agent,不管当前任务是否需要 JSVMP 解析,整套能力全部加载。工具、工作流、停止条件全部写死,升级某一项逆向能力,需要整体改动 Agent 配置,无法做到组件独立版本迭代。

第四,Agent 循环逻辑不可修改。传统 Agent 框架,Agent Loop 调度逻辑属于框架内核,开发者只能调用对外暴露的接口。当逆向任务需要自定义终止条件、自定义任务流转逻辑时,没有办法替换底层调度逻辑,只能不断扩充提示词去引导模型行为。

不少技术人员会认为,只要多接入 MCP 工具、编写更完善的 Skill 提示模板,就能够覆盖全部逆向场景。实操下来会发现,MCP 只能解决 “Agent 可以调用什么工具”,Skill 只能定义 “Agent 怎么做这件事”,但是文件策略、运行环境限制、会话持久化、任务调度循环这些底层逻辑,依旧由宿主框架固定,提示词无法触及运行时底层。

二、DeepSeek Harness 逆向插件安装之后,到底发生了什么

本次落地的 dsh‑js‑reverse‑plugin,并不是简单新增几个对话技能,而是作为 bundle 组件嵌入 Harness 完整运行时。采用全局 CLI 安装方式,一条命令完成技能注册、MCP 服务挂载、逆向 Agent 预设全部部署。

plaintext

npm install -g @deepseek-ai/dsh
dsh plugin --profile web add dsh-js-reverse-plugin

执行完成后重启会话,对话面板会出现 js‑ast‑deobfuscation、iv8‑env‑runtime、iv8‑jsvmp‑recovery 三项逆向技能,MCP 工具注册为mcp__js‑reverse__*系列,Agent 选择器新增独立的逆向模式。

实操细节 1:Harness 没有官方插件市场,插件完全通过 npm 包分发,这意味着插件版本、依赖版本全部可控,dsh‑js‑reverse‑plugin 会锁定 js‑reverse‑mcp@4.0.1 固定版本,不会出现浮动依赖带来的兼容性崩溃。

查看本机$DSH_HOME/profiles/web/package.json配置文件,可以直观看到插件的加载位置:

json

{
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-js-reverse-plugin"
      ]
    }
  },
  "dependencies": {
    "dsh-js-reverse-plugin": "^0.2.0"
  }
}

第三方 npm 包和官方基础组件dsh-basedsh-web-app处于同一 bundle 层级,共同参与产品配置组装。插件内部依靠cordis.patch.yml完成两项核心注入:注册三项逆向 Skill 到技能注册表,复用框架内置 MCP 客户端启动 js‑reverse‑mcp 子进程。除此之外,包内preset.yml逆向预设文件被安装至.agent‑presets/reverse目录。

实操细节 2:很多使用者误以为逆向模式仅仅是一套高级角色提示词。实际上 preset 在这里是一棵带作用域隔离的 Agent 插件子树,不仅仅是 system prompt 文本,会同步挂载人物设定、技能集合、MCP 工具、工作流配置,并且支持完整卸载,卸载之后所有注册的能力全部回收,不会残留全局污染。

核心注册逻辑精简如下:

javascript

运行

for (const skill of collectSkills()) {
  ctx.skills.register(skill)
}
installPreset(join(presetUserRoot(), PRESET_ID))

Skill 完成注册,preset 完成挂载,一个完整的逆向 Agent 就此就绪。这和 Codex、Claude Code 的插件兼容模式有着本质区别:后者只是给已有 Agent 追加能力,Agent 底层会话、循环、策略仍然由宿主牢牢控制;而 DSH 中 npm 包可以参与 Agent 整体组装。

三、三段源码读懂架构核心:没有特权内核的 Agent 组装体系

DeepSeek Harness 对外宣传 “everything is a plugin”,很多人理解为仅支持 Skill、MCP、钩子扩展,而研读源码可以发现,它的扩展能力穿透到产品组装、Agent 调度循环、预设作用域三层核心,这也是它和其他 Harness 框架最大的差异。

3.1 Profile:从空列表逐层堆叠完整产品

profile.ts 中的composeEntries()函数是整个框架配置组装的入口。配置起始是空数组,所有 bundle 的 patch 补丁按顺序叠加,最终生成完整运行配置。Web 版本、无头版本并不是框架内置写死,二者共用 dsh‑base 基础包,再分别叠加 Web UI 或者命令行运行器;用户安装的第三方 bundle 继续叠加在最上层。

typescript

运行

export function composeEntries(
  layers: readonly PatchOptions[][], warn: (message: string) => void = () => {},
): EntryOptions[] {
  return applyEntryPatches([], structuredClone(layers.flat()), (message: string, ...args: unknown[]) => {
    let index = 0
    warn(message.replace(/%C/g, () => JSON.stringify(args[index++])))
  })
}

框架不存在只能官方修改的特权核心,任何 bundle 都可以替换配置树上任意 id 对应的模块。执行dsh --profile web --dump‑config命令,就可以打印本次启动完整配置树,模型适配器、沙箱、审批策略、前端配置全部可视化输出。

实操细节 3:排查插件异常的时候优先使用 dump‑config 命令,直接查看合并之后完整配置,不要只看原始 yaml 文件,多层 patch 叠加之后最终配置和源文件会存在差异,这是排查问题最高效手段。

3.2 AgentLoop 本身也是可替换插件服务

AgentLoop 调度引擎,并非硬编码在框架内核,它是一个标准 Cordis Service。

typescript

运行

export class AgentLoop extends Service implements AgentFactory {
  static inject = ['agents', 'sessions', 'llm', 'tools', 'systemPrompt']
  constructor(ctx: Context, config: Config) {
    super(ctx, 'agentLoop')
    ctx.effect(() => ctx.agents.setFactory(this), 'agentLoop.setFactory()')
  }
}

LLM 实例、工具管线、会话管理、系统提示全部依赖外部注入,通过 effect 机制注册成为 Agent 工厂。当插件卸载,注册同步撤销。这代表开发者不需要修改 Harness 源代码,直接通过插件就可以替换整套 Agent 调度循环。针对 JSVMP 逆向自定义任务终止条件、自定义任务流转,就可以直接替换 Loop 实现,而不是在提示词反复约束模型行为。

3.3 Preset 实现带隔离作用域的插件子树

mountPreset()源码可以破除 “preset 等于角色提示词” 的误区。挂载 preset 的时候会先校验 Agent 上下文 scope,保证所有注册的服务限定在当前 Agent 实例,不会泄漏到进程全局。一旦检测服务全局泄漏,挂载直接失败。

preset 可以批量挂载人物设定、工具、工作流、子 Agent,卸载的时候整棵子树一并回收。同一进程内,一个 Agent 启用逆向 Code 模式,另一个 Agent 依旧使用原生工具,互不干扰,依靠 scope 隔离实现。

除此之外还有一条关键不变量约束:所有模型能够读取的内容,必须可以从会话日志重建。在向 LLM 推送数据流之前,框架会重新派生消息,比对模型参数、系统提示、工具定义。如果有影响推理的状态无法从会话日志复原,运行时直接抛出报错。这就强制逆向产生 Trace、断点样本等证据,必须存入 SessionEventMap,不能仅仅临时返回工具结果,保障会话 fork、重启之后任务状态完整保留。

表格

逆向业务诉求仅使用提示词 + MCP 的实现效果DeepSeek Harness 正确落地层级
保护原始混淆文件,禁止修改源文件只能依靠模型自觉记忆,容易误改原始样本filesystem policy 文件策略插件
抓取浏览器真实请求取证仅提供操作指引,没有强制现场环境MCP Tools 工具层
混淆代码强制 iv8 受控执行,禁止 Node.js 直接运行模型偶尔忽略约束,执行环境错乱runtime /tool policy 运行策略
断点、Trace、字节码跨会话保存上下文丢失之后全部数据销毁session event 会话事件体系
任务分阶段有序推进依靠模型自主维持流程,流程容易跑偏workflow 工作流插件
必须字节等价校验才算逆向完成,拒绝接口成功即结束很难约束终止逻辑,任务提前错误结束workflow + AgentLoop 调度层

表格清晰展示:复杂逆向任务诉求贯穿文件策略、运行环境、会话存储、工作流、调度循环多层。传统方案全部挤压到提示词文本,运行时没有强制保障。而 DSH 架构允许每一条业务约束下沉到对应扩展层,各司其职。

四、dsh‑js‑reverse‑plugin 的工程验证:复用成熟能力,专注组件组合

这套逆向插件并不是从零开发全套逆向 Agent。在此之前,项目已经维护 js‑reverse‑plugin,三套逆向 Skill 和独立的 js‑reverse‑mcp 已经适配 Codex、Claude Code。过往模式下,插件只能输出能力,Agent 底层会话、循环依旧由宿主接管。

接入 DeepSeek Harness 之后,没有重写已经验证成熟的逆向解析逻辑。bundle 负责加载原有 Skill 与锁定版本的 MCP 服务;reverse preset 完成组件编排,复用 Harness 原生文件操作、Shell 工具、任务规划、子 Agent 能力,叠加逆向专属人物设定。

预设内置三条硬性工作规则,直接绑定 Agent 作用域:

  1. 保护原始输入:目标源文件保持只读,分析前生成格式化派生副本;
  2. 受控执行:动态证据通过 iv8 或者 js‑reverse MCP 获取,Node.js 仅承担静态代码分析;
  3. 等价验收:接口服务器返回正常,不能作为逆向完成判定标准。

整套逆向 Agent 的交付,本质是组件组合,而不是全盘重写。不同模块可以独立迭代升级:逆向解析 Skill 迭代、MCP 工具升级、Harness 框架本身更新,三者互不耦合。0.2.0 版本快速产出可直接使用的逆向模式,根源就是这套分层解耦的设计。

五、面向未来:Agent 成为可版本化、可审计的依赖组合单元

观察插件包的 package.json 文件,能够看见全新的 Agent 交付形态。

json

{
  "files": [
    "index.js",
    "cordis.patch.yml",
    "skills",
    "preset"
  ],
  "dsh": {
    "bundle": {
      "patch": "./cordis.patch.yml"
    }
  }
}

npm 包交付的不再只是单一工具函数:包含逆向业务 Skill、运行时注入配置、Agent 组合预设、插件加载入口,并且锁定 MCP 依赖具体版本。用户安装一个 npm 包,得到的是一套完整可运行的 Agent 实例,版本号可以完整标记整套 Agent 全部组件组合状态。

过去,MCP 解决 Agent 调用什么工具,Skill 解决 Agent 处理方法,但是模型选型、会话存储、任务调度循环全权交给宿主。现在 bundle+preset+scope 的组合,把整套 Agent 的组件依赖完整固化,配置可以导出查看,会话日志可以复现全部模型输入。

后续迭代扩展路径也非常清晰:

  1. 如果需要断点、Trace 跨会话持久保存:开发逆向证据 SessionEventMap 插件,bundle 发布,preset 按需启用,无需改动 Harness 内核;
  2. 如果 JSVMP 场景需要全新任务终止逻辑:开发自定义 AgentLoop 服务,通过 profile 层替换 AgentFactory,原有 Skill、MCP 工具全部复用。

表格

新增业务需求Harness 已有扩展点所处架构层级
Trace、断点证据跨会话恢复SessionEventMap 会话事件体系reverse bundle 提供事件插件,preset 选择启用
JSVMP 强制字节等价才允许任务结束AgentLoop / AgentFactoryreverse bundle 在 profile 层替换 Loop 实现

普通 AST 解混淆,只需要加载基础技能;浏览器签名逆向叠加 MCP 与 iv8 运行策略;复杂 JSVMP 恢复继续追加证据事件、自定义工作流,极端场景替换调度循环。不需要把所有能力硬编码塞进通用 Agent。

Harness 负责维护稳定底层基座:插件生命周期、作用域隔离、会话日志、配置加载;逆向插件承载高频迭代的业务层:解析方法、取证工具、访问策略、证据格式、工作流与终止条件。两部分独立演进,preset 决定当前 Agent 启用哪些组件。

Agent 好坏不再只看功能多少,而是可以审计整套依赖关系。通过 dump‑config 导出完整插件树,preset 文件查看 Agent 开启的组件集合,会话日志复现全部模型输入输出。Agent 不再是一团不断膨胀的系统提示词文本,转变为一套可视化、可版本控制的依赖图。

对于逆向领域而言,未来逆向 Agent 不一定是独立开发的大型客户端。更大可能性就是 Harness 基座叠加按需选配的插件集合,dsh‑js‑reverse‑plugin 逆向模式已经把这套理论方案落地为可直接运行的工程产物。

结论

AI Agent 工程化最大的误区,就是不断堆砌提示词和工具,试图用上层文本约束底层运行时行为。DeepSeek Harness “一切皆插件” 的架构,提供了另外一条路径:把业务约束下沉到对应运行扩展层,依靠 bundle 做产品组装、preset 做 Agent 组件编排、scope 实现实例隔离,会话事件保障状态可复现。

JS 逆向任务复杂度跨度极大,从简单 AST 解混淆到 JSVMP 字节码还原,会依次触及文件权限、受控执行环境、会话证据、自定义工作流、Agent 调度循环多层逻辑。只有框架开放到 Agent 本身,而不是仅仅开放工具插槽,才能适配这种动态变化的领域诉求。npm 包不再仅仅分发工具,而是直接交付一套完整版本化 Agent 组合,这会成为垂直领域 Agent 重要的发展方向。

效率龙虾 会带着下面这段开聊

按文章《2026 逆向 Agent 新范式:DeepSeek Harness 搭配插…》把卡点收成可执行步骤:先做什么、别踩哪条、怎么验证。

用效率龙虾试这篇

不同业务场景的验收标准不同。建议先定义成功指标,再选用工具,避免千篇一律的「试用—转化」收尾。

常见问题 FAQ

为什么传统的基于提示词的逆向 Agent 存在缺陷?

传统逆向 Agent 依赖遗忘指令导致原始样本被破坏。此外,会话状态如断点信息、Trace 等中间证据容易丢失,任务无法接续,不适合长周期大型逆向任务。

Harness 的“一切皆插件”架构是什么意思?

这表示 Harness 将 Agent 的所有组件,包括技能、工具、工作流甚至调度循环,都设计为可插拔的插件。通过 npm 分发插件包,以 bundle、preset 的方式组装 Agent,不再依赖单一提示词。每个插件可以独立版本化和卸载,实现灵活组合与定制。

如何安装和配置 dsh-js-reverse-plugin 插件?

首先全局安装 Harness CLI:npm install -g @-ai/dsh,然后运行命令 dsh plugin –profile web add dsh-js-reverse-plugin 完成插件添加。安装后自动注册逆向技能、挂载 MCP 服务,并加载预设。你可以查看 $DSH_HOME/profiles/web/package.json 文件了解具体配置。

在逆向 Agent 中,“会话证据状态容易丢失”具体指什么问题?

逆向过程会产生断点信息、浏览器运行 Trace、Bytecode、CFG 控制流图等大量中间产物。如果仅靠大模型上下文记忆,当会话重启或分支 fork 时,这些证据会直接丢失,导致任务无法接续,特别影响长周期大型逆向任务的可靠性。

Harness 的架构与其他 Agent 框架(如 Codex、 Code)有何不同?

Harness 允许 npm 包参与 Agent 整体组装,没有特权内核,bundle 可替换配置树上的任意模块;而其他框架如 Codex、 Code 只是给已有 Agent 追加能力,底层会话、循环、策略仍由宿主控制,无法深度定制调度逻辑。

文章提到的“Agent 成为可版本化、可审计的依赖组合单元”意味着什么?

这意味着未来 Agent 将像软件包一样,通过版本控制管理每个组件,确保依赖可控、可审计和可升级。 Harness 已通过 npm 分发插件实现这一点,插件版本锁定,避免兼容性问题,使 Agent 更加可靠、易维护,支持长周期迭代。