概念
JS Hook(钩子)是一种通过拦截和修改JavaScript函数或对象行为的技术
钩子、注入劫持
主要用于:
- 动态分析网页行为
- 修改页面功能
- 调试和逆向工程
- 自动化测试
- 安全研究
HOOK原理
hook类似于在浏览器控制台中执行想要的代码,注入到当前js执行流程中,干扰原本进程

hook类似于这里把变量覆盖写在控制台中,这里写debugger则会停止进程

HOOK开发前置
每个hook脚本必须写,并非注释可有可无

@name:定义脚本的名称@namespace: 用于区分不同脚本的作用域(重要)在油猴使用就写http://tampermonkey.net/@version: 定义脚本的版本号@description:描述脚本的功能或用途@author:定义脚本的作者@match: 定义脚本的运行匹配规则(重要)全匹配:http://*/*针对http下的所有网站(不建议)精确匹配:https://abc.com/*针对这个域名,包括其下所有目录@icon:定义脚本的图标@grant:定义脚本所需的特殊权限默认为none当需要调用自带js中的window类时,写unsafeWindow
案例1:HOOK改宽高
在控制台中查看当前浏览器窗口宽高:
宽:window.innerHeight
高:window.innerWidth

hook脚本固定宽高
// ==UserScript==
// @name Fixed_window_size
// @namespace https://github.com/0xsdeo/Hook_JS
// @version 2025-01-11
// @description js获取浏览器高度或宽度时获取到的是脚本中设置的固定值,如果网站js尝试去设置高度和宽度值会直接去设置固定值,并不会按照网站js设置的值去设置。
// @author 0xsdeo
// @match http://*/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
(function () {
'use strict';
let height = 660; // 固定的高度值
let width = 1366; // 固定的宽度值
let innerHeight_property_accessor = Object.getOwnPropertyDescriptor(window, "innerHeight"); // 获取innerHeight属性访问器描述符
let innerHeight_set_accessor = innerHeight_property_accessor.set; // 获取setter
Object.defineProperty(window, "innerHeight", {
get: function () {
// 在这里写你想让hook后的属性在被获取值时执行的代码
return height;
},
set: function () {
// 在这里写你想让hook后的属性在被设置值时执行的代码
innerHeight_set_accessor.call(window, height);// 将网站js设置目标属性值时所传入的内容传给原setter设置并返回结果
}
});
let innerWidth_property_accessor = Object.getOwnPropertyDescriptor(window, "innerWidth"); // 获取innerWidth属性访问器描述符
let innerWidth_set_accessor = innerWidth_property_accessor.set; // 获取setter
Object.defineProperty(window, "innerWidth", {
get: function () {
// 在这里写你想让hook后的属性在被获取值时执行的代码
return width;
},
set: function () {
// 在这里写你想让hook后的属性在被设置值时执行的代码
innerWidth_set_accessor.call(window, width);// 将网站js设置目标属性值时所传入的内容传给原setter设置并返回结果
}
});
})();
添加到油猴中

此时无论如何调整窗口大小,控制台打印出的宽高都是固定值
案例2:本地Debug绕过
找到过滤代码机制
function enableDebugProtection() {
var dbg = new Function("debugger");
setInterval(dbg, 3000); // 每3秒触发一次debugger
}
配合AI和基础开发hook
让ai写一个hook脚本:“写一个篡改猴应对如上反调试的hook代码,作用域为http://x.x.x.x”
拦截Function构造函数及替换
拦截setInterval及替换
油管猴配合HOOK脚本测试
打开油管猴进行测试,看反调试是否绕过成功

案例3:真实Debug绕过
全局搜索找到过滤代码机制

function() {}.constructor("debugger")()
配合AI和基础开发hook
拦截Function构造函数
找到debugger并实现替换

油管猴配合HOOK脚本测试
开启后可进行正常调试

本节知识点
JS逆向-JS Hook原理&Hook脚本&开发前置
JS逆向-Hook开发&绕过Debug
