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 再拔线」。
| 动作 | 命令 / 入口 | 做什么 | 对备份文件的处理 |
|---|---|---|---|
| Apply | dsh-purge --apply、Clean 页按钮、/purge apply | 备份原件 → 匹配改写 → 注入 shim → 静默控制台 | 每个目标首次才建.dshpurge.bak |
| Restore | dsh-purge --revert、/purge revert | 把.dshpurge.bak拷回并删除备份 | 有备份则回拷,无备份则跳过、绝不删原件 |
| Uninstall | dsh-purge --uninstall、/purge uninstall | 若已 Apply 则先 Restore,再删插件本体与注入文件 | 复用 Restore 的回滚逻辑 |
一句话记忆:Apply 只负责「让它对」,Restore 只负责「让它回」,Uninstall = Restore + 卸载。三者都是幂等的——重复调用不会越用越乱。
从点击 Apply 到文件落盘:补丁注入的完整链路
Apply 是整条链路的中枢,入口在 lib/index.js 的apply(),真正的重活由它调度的purge_apply工具完成,顺序如下(见 lib/index.js):
- 定位宿主
gatherState():先探测是 Web 还是桌面宿主,锁定ai_base与dsh_home,找不到目标就直接报错,不碰任何文件。 - 备份
backupAll():为每个目标文件建.dshpurge.bak。 - 改写
applyPatches():按补丁表逐个文件做 pattern 匹配替换。 - 注入
patchAllShims():改写dsh.cmd/dsh.ps1/dsh等启动 shim。 - 静默
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_PATCHES | lib/core.js |
备份backupAll | lib/core.js |
回滚revertAll | lib/core.js |
替换引擎applyReplacementsToText | lib/core.js |
批量改写applyPatches | lib/core.js |
状态计算patchStatus | lib/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),仅供参考