JS逆向-HOOK技术指南 在JS逆向过程中HOOK技术是一种动态拦截、修改JavaScript函数或对象行为的核心手段。它允许你在不修改原始代码的情况下注入自定义逻辑从而绕过反调试、提取加密参数、篡改前端校验等。本笔记从渗透测试实战视角出发系统梳理HOOK的原理、开发基础及典型应用场景。1. HOOK技术概述与渗透测试价值应用场景说明渗透测试价值绕过反调试拦截debugger、setInterval等函数阻止无限断点。顺利调试加密逻辑定位签名生成函数。提取加密参数Hook加密函数如btoa、RSA.encrypt捕获输入输出。无需逆向算法直接获取加密结果或密钥。篡改前端逻辑修改价格计算、验证码生成、权限判断等函数。测试后端是否信任前端数据发现逻辑漏洞。自动化测试辅助自动填充表单、模拟点击、绕过滑块验证。配合爬虫或漏洞扫描工具提高效率。动态分析监控XMLHttpRequest、fetch等网络请求函数记录所有API调用。发现隐藏接口、参数结构拓展攻击面。2. HOOK开发基础油猴脚本Tampermonkey元数据HOOK脚本通常以油猴插件为载体其头部元数据定义了脚本的运行规则。以下是常用字段字段作用示例name脚本名称Bypass Debuggernamespace命名空间用于区分脚本http://tampermonkey.net/version版本号1.0description脚本描述Hook Function构造函数绕过无限debuggerauthor作者YourNamematch关键字段定义脚本在哪些URL下运行*://*.target.com/*icon脚本图标URLhttps://www.google.com/s2/favicons?domaintarget.comgrant授权使用GM_*函数如GM_setValuenone如无特殊需求可不填run-at脚本执行时机如document-start页面加载前document-start示例模板// UserScript // name Bypass Debugger // namespace http://tampermonkey.net/ // version 1.0 // description Hook Function to bypass infinite debugger // author Pentester // match *://*.example.com/* // icon https://www.google.com/s2/favicons?domainexample.com // grant none // run-at document-start // /UserScript (function() { use strict; // HOOK代码写在这里 })();3. HOOK原理与实现方式HOOK的本质是替换原始函数在调用前后插入自定义逻辑。常见实现方式直接替换将目标函数重新赋值为新函数。let originalFunction window.someFunction; window.someFunction function(...args) { console.log(Called with:, args); return originalFunction.apply(this, args); };拦截构造函数针对Function、setInterval等全局构造函数进行替换阻止恶意代码生成。使用Object.defineProperty修改对象属性的getter/setter监控属性访问。4. 本地案例HOOK绕过无限Debugger目标页面中存在setInterval周期性执行debugger导致调试中断。反调试代码示例function enableDebugProtection() { var dbg new Function(debugger); setInterval(dbg, 3000); }HOOK思路拦截Function构造函数当检测到构造的字符串包含debugger时返回空函数同时拦截setInterval阻止定时器设置。HOOK脚本// UserScript // name Bypass Debugger // match *://*/* // run-at document-start // /UserScript (function() { // 1. Hook Function构造函数 const OriginalFunction Function; window.Function function(...args) { // 如果最后一个参数函数体包含debugger返回空函数 const body args[args.length - 1]; if (typeof body string body.includes(debugger)) { console.log([Hook] Blocked debugger in Function); return function() {}; } return new OriginalFunction(...args); }; // 保持原型链完整 window.Function.prototype OriginalFunction.prototype; // 2. Hook setInterval const originalSetInterval window.setInterval; window.setInterval function(callback, interval) { // 如果回调是函数且包含debugger如通过Function构造的忽略 if (callback callback.toString callback.toString().includes(debugger)) { console.log([Hook] Blocked setInterval with debugger); return null; } return originalSetInterval(callback, interval); }; })();验证刷新页面调试器不再无限暂停可正常分析。5. 实战案例真实网站debugger绕过目标某网站反调试代码为function() {}.constructor(debugger)()通过Function构造函数动态执行debugger。原理分析{}.constructor指向Function因此等价于new Function(debugger)()会立即执行一次debugger。HOOK思路拦截Function构造函数当参数为debugger时返回空函数阻止执行。增强版HOOK兼容多种调用方式// UserScript // name Universal Debugger Bypass // match *://*/* // run-at document-start // /UserScript (function() { const OriginalFunction Function; function safeFunction(...args) { // 检查所有参数若存在debugger字符串返回空函数 for (let arg of args) { if (typeof arg string arg.includes(debugger)) { console.log([Hook] Blocked debugger in Function); return function() {}; } } return new OriginalFunction(...args); } // 替换Function safeFunction.prototype OriginalFunction.prototype; window.Function safeFunction; // 同时处理eval某些情况下也会被用于debugger const originalEval window.eval; window.eval function(code) { if (typeof code string code.includes(debugger)) { console.log([Hook] Blocked debugger in eval); return; } return originalEval(code); }; })();效果页面加载后function() {}.constructor(debugger)()不再触发断点调试器正常运行。6. HOOK在签名逆向、参数提取中的扩展应用场景HOOK目标代码示例捕获加密前明文Hook加密函数如encrypt、md5、btoaconst originalBtoa btoa; btoa (s) { console.log(btoa input:, s); return originalBtoa(s); }提取签名生成参数Hook发送请求的函数fetch、XMLHttpRequest在fetch前打印参数或在XMLHttpRequest.prototype.send前拦截。篡改价格/数量Hook前端计算函数如电商网站计算总价函数直接返回固定低价。绕过滑块验证Hook滑动轨迹生成函数替换轨迹生成逻辑模拟真人滑动。示例Hook fetch捕获所有请求参数const originalFetch window.fetch; window.fetch function(...args) { console.log([Fetch] URL:, args[0]); console.log([Fetch] Options:, args[1]); // 可在此修改请求头、body等 return originalFetch.apply(this, args); };7. 与其他逆向工具的结合工具结合方式优势JsRPC通过WebSocket调用HOOK函数实时获取加密结果无需手动复制直接在Python中调用。AutoDecode在Burp中自动解码加密参数HOOK可提供解密函数实现Burp与前端解密的无缝对接。Yakit热加载编写Yakit插件动态注入HOOK脚本在流量代理层面实现HOOK适合大规模自动化。Burp Suite使用Match and Replace替换响应注入HOOK脚本无需油猴全局生效。示例在Burp中通过“匹配并替换”自动注入HOOK脚本抓取目标HTML响应。在/body前插入script标签内容为HOOK代码。Burp自动替换每次加载页面都会执行HOOK。8. 总结与学习建议HOOK是JS逆向的“瑞士军刀”能解决大多数动态分析难题。从油猴脚本入手快速验证HOOK效果再逐步迁移到Burp或自动化工具。遇到反调试优先考虑HOOK而不是手动点击无数个“继续执行”。HOOK与断点调试结合先通过HOOK绕过反调试再用断点分析加密逻辑。善用AI辅助将反调试代码片段提供给AI生成对应的HOOK代码提高效率。下一步学习路径练习油猴脚本编写尝试HOOK常见函数如alert、console.log。针对真实网站的反调试如无限debugger编写HOOK脚本。尝试在Burp中通过响应替换注入HOOK实现全局拦截。学习JsRPC将HOOK捕获的数据实时转发到本地脚本。掌握HOOK技术后你将能从被动分析转向主动控制大幅提升JS逆向的效率与成功率。