browser-hook-snippets
围绕 $ARGUMENTS 生成最小可用的浏览器 hook 脚本,并说明注入位置、预期现象和回收方式。
目标
当用户已经知道要盯的对象或行为时,直接给出可执行的 hook 方案,而不是停留在原理说明。
触发信号
下面这些说法通常应该触发本 skill:
- “给我一个 hook xxx 的脚本”。
- “给一段控制台 hook 脚本,临时观察是谁写了 cookie/token/header”。
- “帮我盯住 fetch/xhr/websocket/postMessage/worker”。
- “想观察某个 DOM、canvas、blob、随机数、加密 API 调用时的入参和调用栈”。
- “给一个能直接贴到 DevTools Console 或 Snippets 的脚本”。
下面这些说法通常不该由本 skill 单独处理,应转交对应 skill:
- "这个签名参数在哪生成" 或 "帮我找到脚本 URL、函数名、行列号" 或 "用浏览器定位关键加解密 JS 代码" →
camoufox-js-reverse。 - "把这段浏览器 JS 搞到 Node 里跑" →
env-patch。 - "帮我反混淆这个大文件" →
ast-deobfuscate。 - "Python + iv8 执行防护页 / 动态 cookie / 翻页请求" →
iv8-web-reverse。 - 瑞数/Ruishu/Rivers 如果不是“只要可粘贴 hook 脚本”,按目标分流:入口/调用链定位 →
camoufox-js-reverse;Node/proxy 跑通 →env-patch;iv8/suffix 请求可用性 →iv8-web-reverse。 - 用户目标已超出单点观察、需要完整协议链路恢复(签名/挑战/解码/传输一体化)→
web-protocol-recovery。
适用范围
按目标读取对应分类:
- 请求、header、WebSocket、postMessage:
references/network.md - cookie、storage、输入值:
references/storage.md - base64、WebCrypto、随机数、编码边界:
references/crypto.md - createElement、DOM 注入、MutationObserver、canvas:
references/dom.md - JSON、eval、Function、Blob、Worker:
references/runtime.md
输出要求
默认给出这 4 项:
- 一段可以直接执行的最小 hook 脚本。
- 脚本应该注入在哪里:Console、Snippets、Sources 断点后注入,还是页面脚本标签注入。
- 预期能看到什么日志或断点。
- 需要注意的副作用和恢复方式。
如果用户目标比较明确,再补 1 项:
- 为什么优先 hook 这个点,而不是附近其它点。
工作方式
按最小侵入原则处理:
- 先确认 hook 目标是“属性”“方法”还是“构造器”。
- 优先包装单个目标,不要一上来全局代理整页对象。
- 保留原函数引用,调用原实现时避免递归调用自身。
- 默认只做记录和断点,不主动改返回值,除非用户明确要求篡改行为。
- 如果目标代码跑在页面上下文而不是 Console 沙箱里,使用
script.textContent = '(' + fn + ')()'注入页面上下文。 - 如果页面存在完整性检测、native 伪装检测、原型链检测或 JSVMP 环境探测,先提醒用户:JS hook 可能改变行为、失去命中或直接被检测。
确认检查点
默认只输出观察型脚本。遇到下面情况必须先确认用户意图,再生成或注入脚本:
- 用户要求阻断请求、篡改参数、改返回值、覆盖 cookie/storage 或改变页面行为。
- 用户要求打印完整 Cookie、Authorization、token、请求体、响应体、canvas/dataURL、ArrayBuffer、Blob 或其它敏感原文;默认只给预览、长度、哈希或
FULL_LOG开关。 - 脚本需要全局代理
window、document、navigator、所有 XHR/fetch/WebSocket,或会显著增加页面开销。 - 需要用工具直接注入到真实目标页,而不是只给 Console/Snippets 代码;先确认页面已打开、注入范围和回收方式。
- 页面有完整性检测、native 检测、JSVMP 环境检测或 hook 后行为变化;先收缩 hook 点或转
camoufox-js-reverse,不要叠加更大的代理。
浏览器工具注入与降级
本 skill 默认交付可粘贴脚本,不强制启动浏览器工具。只有用户要求“帮我直接注入/验证/截图/抓日志”,或当前会话已经在浏览器工具里运行目标页时,才使用工具化注入。
优先级:
- 当前已打开目标页的页面上下文:直接注入 hook,读取 console/network 日志。
- 未打开页面时,启动
cloakbrowser-reverse-mcp:用于页面导航、evaluate_script/main-world evaluate、network、console、CDP 断点、SourceMap、Profiler、WebSocket 和 Hook。不可用时降级为手工 Console/Snippets 脚本或用户样本。 - 工具不可用或会改变页面行为时:只输出 Console/Snippets 脚本和触发说明。
- 被目标站风控拦截(412/403/验证码)时,说明需要反检测能力,转交
camoufox-js-reverse。
如果工具化注入改变页面行为,立即降级为更小 hook 点或只给手工脚本,不继续叠加全局 proxy。
跨 skill 的阶段协议见 references/js-reverse-workflow.md。本 skill 主要服务 Capture 阶段:优先用 hook 采样真实运行行为;hook 无法回答函数位置或完整调用链时,再升级到 camoufox-js-reverse。需要落地 hook 日志、采样证据或临时脚本时,按共享协议写入执行代码的工作区下的 js_reverse_cache/;不存在则先创建,不要写到工作区之外。
Hook 数据降噪
默认输出要帮助定位调用点,不要把页面刷死或泄出整份无关数据。生成 hook 时优先保留字段名、URL、调用栈、类型、长度和少量预览,必要时再给“完整值开关”。
- 对 cookie、Authorization、token、storage value、请求体或响应字段,默认使用
mask()、slice()、substring()、bodySnippet或长度/哈希摘要降噪。 - 高频 hook 默认加 URL、字段名、调用次数、时间戳、去重 key 等辅助字段,避免重复刷屏。
- 对 request body、WebSocket message、canvas/dataURL、ArrayBuffer、Blob 等大体积数据,默认只打印类型、长度和前后片段。
- 如果用户明确要求“完整原文 / 不脱敏 / 不截断 / 用于补环境复现”,再输出完整值或提供
FULL_LOG = true开关。 - 如果目标是后续补环境,额外补充候选环境依赖,如
cookie、storage、Date、crypto、location,并说明如何临时打开完整值采样。
Request Binding
当用户要观察“哪个请求带了目标字段”时,hook 输出应尽量绑定请求上下文:
target: fetch | xhr | websocket | form | beacon。event: open | send | setRequestHeader | response | message。method和url。- 命中的 header / query / body 字段名。
- 可选
console.trace()或一次性debugger,用于后续转交camoufox-js-reverse。
如果用户只要最小脚本,不要强行附带复杂摘要器;但可以在说明里给出如何按 URL/字段过滤,以及如何切换为完整值输出。
经验规则
document.createElement、XMLHttpRequest.prototype.open这类宿主方法,先bind或保存原引用再调用,避免Illegal invocation。WebSocket.prototype.send、fetch、eval这类函数 hook 时,返回值必须继续走原实现,否则页面容易异常。- 属性 hook 优先用
Object.defineProperty;如果原属性已经不可配置,改用外围调用点或原型方法 hook。 - 只在用户明确要求时才提供“阻断”型脚本;默认提供“观察”型脚本。
- 如果用户想知道“请求是谁发起的”,而当前环境没有专门的 request initiator 工具,优先在
fetch/xhrhook 里补console.trace(),用调用栈替代专用调试工具能力。 - 如果用户问“某个 cookie 是谁写的”,先提醒:
document.cookiehook 只能看到 JS 写入;若 cookie 实际来自 HTTPSet-Cookie,必须同时检查目标请求或响应头。 - 遇到 SDK 或拦截器型页面时,不要默认只 hook
XMLHttpRequest;很多站点会同时走xhr和fetch,漏掉其中一个就会误判“签名函数没跑到”。 - 观察环境读取型行为时,优先从
navigator、screen、document.createElement、canvas.getContext、WebGLRenderingContext.getParameter、performance.now、localStorage、sessionStorage里选一个最可疑点定向下手,不要一次全开。 - 如果 hook 后页面行为变化、请求消失、签名降级或日志极多,先收缩 hook 点、改断点或补
console.trace(),不要继续叠加更多 hook。 - 高频 hook 默认加 URL、字段名或调用次数条件,并对请求体、cookie、storage 做预览或摘要;只有用户明确要求完整现场值时才全量打印。
反模式
不要默认输出下面这些高风险写法:
- 无条件清空所有定时器。
- 粗暴替换所有
debugger、所有console、所有RegExp。 - 会递归调用自己的错误 hook,比如在
send里再次调用被改写后的send。 - 大范围改写原生对象却不说明恢复方式。
- 默认代理整个
window、document、navigator。 - 在强完整性检测页面里,不提醒风险就直接输出重写原型链的大脚本。
这些片段可以作为特殊场景候选,但不作为默认答案。
参考片段
索引见 references/snippets.md。hook 输出样本和降噪效果示例见 references/hook-output-samples.md。
预置 hook 模板(可直接复制粘贴使用):
| 模板 | 用途 |
|---|---|
scripts/xhr_fetch.js |
XHR + fetch 双通道 hook,含请求/响应摘要和调用栈 |
scripts/cookie_header.js |
document.cookie 写入 + Headers 构造观察 |
scripts/crypto_api.js |
WebCrypto.subtle + CryptoJS 加解密调用 hook |
scripts/storage.js |
localStorage / sessionStorage 读写监控 |
生成答案时:
- 先按用户目标只读最相关的 1 个分类文件,必要时再补第 2 个。
- 按当前页面需求裁剪,不要整份堆给用户。
- 如果用户给了关键字或 URL 片段,直接代入条件判断。
- 如果用户没说注入时机,优先提醒“可在 Sources 首个脚本处暂停后再注入”。
- 如果页面明显会因为 hook 方式不同而失效,显式说明是“Console 沙箱 hook”还是“页面上下文 hook”。
升级与降级
当最小 hook 不能满足需求时,按这个顺序调整:
- 先缩小到单个属性、单个方法或单个 URL 条件。
- 再补
console.trace()、条件断点或一次性debugger。 - 如果用户真正要的是函数位置、脚本 URL、调用链,转给
camoufox-js-reverse。 - 如果用户真正要的是 Node.js 独立复现,转给
env-patch。 - 如果浏览器工具不可用,降级为手工 Console/Snippets 脚本,并在说明中写明未验证运行时日志。
回答风格
- 先给能跑的最小脚本。
- 再给注入位置和触发条件。
- 最后再补副作用和升级建议。
- 除非用户明确要求,不要一次贴多个大脚本方案。
完成标准
完成时,用户应能直接拿到:
- 可执行脚本。
- 断点或日志触发条件。
- 为什么这个 hook 点有效。
- 何时需要升级为调用链定位、补环境或解混淆。
- 对高频场景,知道如何去重、过滤和绑定到具体请求。