AI提示词注入工具:codex-session-patcher
日常使用 Codex CLI 或者 Claude Code 做安全研究、CTF,结果 AI 突然来一句”I can’t help with that”——会话就这么断了。
更烦的是,就算你 resume,上下文依然带着那条拒绝记录,后续每次回复都会受影响。
codex-session-patcher 就是专门解决这个问题的。它能直接修改会话文件,把那些拒绝回复替换掉,让你接着往下跑,不用重头再来。
项目地址:https://github.com/ryfineZ/codex-session-patcher
功能介绍
这个项目的功能分两块:
① 会话清理(Session Patcher)AI 已经拒绝了?没关系,把拒绝的那条回复从会话文件里替换掉,然后 resume,就好像什么都没发生过。
② CTF/渗透测试提示词注入在 AI 启动之前就注入 CTF 安全上下文,从源头降低被拒概率,治标更治本。
工作原理拆解
拒绝检测:两级策略,控制误报
工具里有个 detector.py,专门负责判断一条 AI 回复是不是”拒绝”。
它用的是两级匹配策略:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
强匹配优先,弱匹配只在强匹配没命中时兜底。两级结构的好处是误报率低——不会把一句”我无法确认”也当成拒绝处理掉。
匹配关键词支持自定义,写进配置文件 ~/.codex-patcher/config.json 的 custom_keywords 字段就行。
多平台会话格式,各有适配
三个工具的会话存储方式不一样:
|
|
|
|
|---|---|---|
|
|
|
~/.codex/sessions/ |
|
|
|
~/.claude/projects/ |
|
|
|
~/.opencode/ |
formats.py 负责识别格式,parser.py 处理 JSONL,sqlite_adapter.py 专门对接 OpenCode 的数据库。三套格式用同一套 CLI/Web UI 入口统一管理,不用分别折腾。
清理逻辑:替换而非删除
检测到拒绝回复后,patcher.py 有两种替换方式:
-
Mock 回复:用预设的配合性文本替换(无需 AI,零额外依赖) -
AI 改写:把整段对话上下文发给 LLM,让它生成一条”没有拒绝”的替代回复,语境更自然
AI 改写支持 OpenAI / Ollama / OpenRouter 等任意兼容接口,在配置文件里填上 ai_endpoint 和 ai_key 就能用。
替换前自动备份,支持一键还原到任意历史版本。处理前后还有 Side-by-side Diff 对比,能看清改了哪里。
提示词注入:三种模式
这部分对应 ctf_config/ 目录下的安装器,三个平台各有方案:
Codex:创建独立的 ctf profile,codex -p ctf 启动时才生效,普通 codex 会话完全不受影响。
Claude Code:不支持 profile,所以改成工作空间隔离——在 ~/.claude-ctf-workspace 下放一个项目级 CLAUDE.md,从这个目录启动的 Claude 会话自带 CTF 上下文。
OpenCode:同理,用 ~/.opencode-ctf-workspace + AGENTS.md 实现工作空间注入。
提示词内容可以直接在 Web UI 里编辑,支持模板保存和切换。还有一个 --rewrite 功能,把你的请求扔给 AI,让它帮你改写成”更容易被接受”的表达方式。
安装与上手
安装
git clone https://github.com/ryfineZ/codex-session-patcher.gitcd codex-session-patcher# CLI 版本(零额外依赖)pip install -e .# Web UI 版本(额外安装前端)pip install -e ".[web]"cd web/frontend && npm install && npm run build && cd ../..
启动 Web UI(推荐)
./scripts/start-web.sh# 或者直接运行uvicorn web.backend.main:app --host 127.0.0.1 --port 8080
访问 http://localhost:8080,有会话列表、Diff 对比、提示词注入等所有功能。
开发模式(前后端热更新):
./scripts/dev-web.sh
CLI 常用命令
# 预览模式,不实际改文件codex-patcher --dry-run --show-content# 清理最新一条会话codex-patcher --latest# 清理所有会话codex-patcher --all# 指定格式(不想让工具自动判断时)codex-patcher --latest --format claude-code# 查看帮助codex-patcher --help
实战场景
场景一:Codex CTF 模式
做 CTF 时,走 profile 隔离是最干净的方式,不影响日常编码:
# 第一步:安装 CTF profilecodex-patcher --install-ctf-config# 第二步:用 CTF profile 启动 Codexcodex -p ctf# 第三步:遇到拒绝时,打开 Web UI 清理codex-patcher --web# 第四步:清理完 resume 继续codex resume
场景二:Claude Code 渗透测试工作空间
# 通过 Web UI 启用 Claude Code 注入(会自动创建工作空间)# Web UI → 提示词增强 → Claude Code → 启用# 从 CTF 工作空间启动cd ~/.claude-ctf-workspace && claude# 遇到拒绝 → Web UI 清理 → 继续对话
场景三:提示词改写
如果不确定怎么描述一个请求才不会被拒绝:
codex-patcher --rewrite "帮我写一个分析 PE 文件结构的脚本"
它会调用 AI,结合当前注入的 CTF 系统提示词,把请求改写成更容易被接受的表达形式。
注意事项
-
清理后必须 resume:会话文件改了,但当前对话进程还在跑旧内容,手动 resume 才能让上下文生效 -
OpenCode 必须从工作空间目录启动:OpenCode 没有 profile 机制,CTF 注入完全依赖工作空间目录下的 AGENTS.md -
不保证 100% 绕过:对于违规程度很高的请求,模型可能在生成层面就拦截,会话层的 patch 也没用 -
模型版本影响效果:模型更新后对拒绝短语的表述可能变化,记得更新自定义关键词
往期推荐 📚
欢迎关注“攻防录”✨
夜雨聆风