news 2026/10/2 12:27:15

dsh-purge 补丁注入原理深潜:Apply/Restore/Uninstall 如何幂等改写 DeepSeek Harness

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dsh-purge 补丁注入原理深潜:Apply/Restore/Uninstall 如何幂等改写 DeepSeek Harness

dsh-purge 补丁注入原理深潜:Apply/Restore/Uninstall 如何幂等改写 DeepSeek Harness

【免费下载链接】dsh-purgeDeepSeek Harness 破甲:让所有模型都能破甲,不同模型可换不同提示词;默认提示词面向国模「小码酱」。Jailbreak for every model — swap prompts per model. 求 Star 收藏 ⭐项目地址: https://gitcode.com/gh_mirrors/ds/dsh-purge

如果你正在研究dsh-purge 补丁注入原理,想知道它如何对 DeepSeek Harness 做幂等改写,这篇文章会带你从「点击 Apply」到「文件落盘」的完整链路走一遍。dsh-purge 是一款面向本地官方 DeepSeek Harness 的提示词注入 / 红队评估插件,它用Apply / Restore / Uninstall三个动作反复、安全、可回滚地改写宿主文件。它的核心难题正是「幂等」:同一个补丁点多少次,结果都一致,绝不重复叠加,也绝不盲改。

一次改写,反复生效:dsh-purge 的补丁注入是什么

传统插件「装一次就完事」,但 dsh-purge 的宿主会被 npm 升级、会被官方覆盖,node_modules一变,补丁就可能失效。所以它不追求「装一次」,而追求「每次启动都能把宿主恢复到期望状态」。

它把本地宿主里的渲染文案、默认值、运行时逻辑看作一组可改写的目标文件,用一份声明式补丁表(cordis.patch.yml)驱动。每次 Apply 都先探测当前状态,再决定「要改」还是「已就位跳过」。这就是为什么同一套操作可以反复执行而不产生副作用——补丁注入的「幂等」不是口号,而是写进每个函数分支里的判断。

下图是打开 dsh-purge 右侧抽屉后的 **Drill(演练台)**页,它与 Clean 页并排,共同构成插件的两个主界面:

三个动作各自负责什么:Apply / Restore / Uninstall 对照

新手最容易混淆这三个词。先建立一个整体认知:Apply 是「写入期望态」,Restore 是「回到写入前」,Uninstall 是「先 Restore 再拔线」。

动作命令 / 入口做什么对备份文件的处理
Applydsh-purge --apply、Clean 页按钮、/purge apply备份原件 → 匹配改写 → 注入 shim → 静默控制台每个目标首次才建.dshpurge.bak
Restoredsh-purge --revert、/purge revert把.dshpurge.bak拷回并删除备份有备份则回拷,无备份则跳过、绝不删原件
Uninstalldsh-purge --uninstall、/purge uninstall若已 Apply 则先 Restore,再删插件本体与注入文件复用 Restore 的回滚逻辑

一句话记忆:Apply 只负责「让它对」,Restore 只负责「让它回」,Uninstall = Restore + 卸载。三者都是幂等的——重复调用不会越用越乱。

从点击 Apply 到文件落盘:补丁注入的完整链路

Apply 是整条链路的中枢,入口在 lib/index.js 的apply(),真正的重活由它调度的purge_apply工具完成,顺序如下(见 lib/index.js):

  1. 定位宿主gatherState():先探测是 Web 还是桌面宿主,锁定ai_base与dsh_home,找不到目标就直接报错,不碰任何文件。
  2. 备份backupAll():为每个目标文件建.dshpurge.bak。
  3. 改写applyPatches():按补丁表逐个文件做 pattern 匹配替换。
  4. 注入patchAllShims():改写dsh.cmd/dsh.ps1/dsh等启动 shim。
  5. 静默silenceCmdFlash():消除 Windows 控制台闪烁等体验补丁。

补丁表由四组拼接而成:ALL_PATCHES = [...PATCHES, ...CODE_PATCHES, ...ENGINE_PATCHES, ...NEW_TOOL_PATCHES](lib/core.js),分别覆盖提示词层、代码默认值、引擎级审批/沙箱、新工具四个层次。

幂等是怎么做到的:标记、状态机与「不重复叠加」

这是全文的核心。dsh-purge 用三层防线保证「点多少次 Apply 结果都一样」:

① 标记自检(marker)注入进宿主的代码都带[dsh-purge]注释标记。改写前先看文件里是否已含标记,含则记为already(已就位),直接跳过——见 lib/core.js 里if (text.includes(marker)) { hit = "already"; continue; }的典型写法。

② needle 找不到就不改(天然幂等)真正的替换引擎在 lib/core.js 的applyReplacementsToText()。它对每对pattern → replace执行out.split(needle).join(written):只有原文里还留着那段「待改」needle 时才会命中并写入;一旦被改过,needle 已消失,changed保持false,文件不落地。所以重复调用自然变成「无操作」。

③ 状态机收敛结果每个文件改完后被归入一个状态,再由rollupPatchStatus汇总成补丁级状态(lib/core.js):

  • applied:本次真的改写了
  • already:早已就位,跳过
  • pending:原文还在,等待下次改写
  • skipped:这份原文对不上,明确跳过、不假装待应用
  • missing_file:目标文件不存在

skipIfMarked补丁还会在 lib/core.js 额外加一道「已有标记就不再replaceAll」的保险。三层叠加,让「已改 → 识别 → 跳过」成为默认路径。

备份与回滚:.dshpurge.bak 让每次改写都有退路

改写之前先备份,是「可回滚」的前提。backupAll(lib/core.js)的关键就在这一行:if (!fs.existsSync(bak))——只有当.dshpurge.bak不存在时才建。这意味着备份的「原件」永远是第一次 Apply 之前的纯版本,而不是上一次补丁后的版本,回滚才能回到真正的初始态。

回滚由revertAll(lib/core.js)完成,逻辑同样讲究分寸:

  • 有.dshpurge.bak→ 拷回目标文件,并删除备份;
  • 无备份→ 只把该文件标记为skipped,绝不删除目标(源码部署的构建产物缺备份时,删了无法自愈)。

还有一层「用户文件保护」:属于用户自定义层的补丁文件永不建 bak、回滚时也绝不拷回,只清掉可能存在的旧备份。你的prompt-inject.md等用户文件始终被保留——补丁注入只动宿主的,不动你的。

只改当前宿主:Surface 检测如何隔离 Web 与桌面

同一台机器上,Web、社区桌面、官方 EXE 可能各自有独立的安装树,绝不能「从桌面去 Apply Web」。dsh-purge 在 lib/surface.js 先探测宿主形态(web/desktop),再由 lib/core.js 的pathZone()+allowTargetPath()给每个文件划分「辖区」:

  • 桌面宿主只动「桌面安装树 + 共享的$DSH_HOME/.agent-presets」,不碰 Web 与 npm-global;
  • Web 宿主则反过来排除桌面专属路径。

这样补丁注入严格限定在「你正在打开的那台宿主」内,跨宿主互不干扰,也避免误伤。

关键源码位置速查 📍

想自己动手验证幂等逻辑,按这份索引看最快:

关注点位置
Apply 总调度lib/index.js
purge_apply / purge_revert 工具lib/index.js
补丁声明与默认配置cordis.patch.yml
补丁表汇总ALL_PATCHESlib/core.js
备份backupAlllib/core.js
回滚revertAlllib/core.js
替换引擎applyReplacementsToTextlib/core.js
批量改写applyPatcheslib/core.js
状态计算patchStatuslib/core.js
宿主 Surface 隔离lib/core.js

Clean 页除了三个动作,还集成了多套规则集的启用/删除管理,让不同评估场景可切换不同的AGENTS.md/CLAUDE.md,而不必反复 Apply:

Clean 页的整体布局——补丁分组状态、提示词编辑器、规则集列表、Apply / Restore / Uninstall 入口都集中在这里:

小结

dsh-purge 把「补丁注入」做成了一件可反复执行的事:Apply 靠 marker 自检 + needle 匹配 + 状态机三层防线保证幂等;备份靠「只建一次.dshpurge.bak」锁定真原件;Restore 靠「无备份不删原件」守住底线;Surface 隔离确保只动当前宿主。理解了这四件事,你就掌握了它对 DeepSeek Harness 做幂等改写的完整原理。

【免费下载链接】dsh-purgeDeepSeek Harness 破甲:让所有模型都能破甲,不同模型可换不同提示词;默认提示词面向国模「小码酱」。Jailbreak for every model — swap prompts per model. 求 Star 收藏 ⭐项目地址: https://gitcode.com/gh_mirrors/ds/dsh-purge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 12:26:44

MySQL 存储过程赋值全解析:从 SET 到 SELECT INTO 的 TaoToken 实战配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 12:24:25

OpenClaw连接飞书二维码扫描失败?TaoToken统一Key通道排查实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 12:21:10

ESP32无MMU如何实现沙箱?基于能力约束的MCU轻量级权限框架

1. 从一个真实困境说起:为什么MCU上的"小应用"需要被管住很多人第一次接触ESP32的时候,脑子里想的都是"这玩意儿能跑什么",而不是"这玩意儿该被允许跑什么"。我自己也是这么过来的。早期做ESP32项目&#xff0…

作者头像 李华
网站建设 2026/10/2 12:21:09

搞懂 AI Agent 的管道与技能:MCP 和 Skill 的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华