首页 > 其他分享 >hook 过debugger

hook 过debugger

时间:2024-11-04 14:23:33浏览次数:2  
标签:Function Closure debugger --- hook toString 函数

// 定义一个闭包函数,用来创建拦截函数的钩子
function Closure(injectFunction) {
    // 返回一个新函数,用于处理输入参数并调用原始函数
    return function() {
        // 如果没有传入参数,直接调用原始的 injectFunction
        if (!arguments.length)
            return injectFunction.apply(this, arguments);
        
        // 获取参数的最后一个值,并替换掉 "debugger" 字符串
        arguments[arguments.length - 1] = arguments[arguments.length - 1].replace(/debugger/g, "");

        // 调用原始函数并返回结果
        return injectFunction.apply(this, arguments);
    }
}

// --- 拦截 Function.prototype.constructor ---
// 备份原始的 Function 构造器
var oldFunctionConstructor = window.Function.prototype.constructor;

// 使用 Closure 包装 Function 构造器,并拦截 debugger
window.Function.prototype.constructor = Closure(oldFunctionConstructor);

// 为了保持代码一致性,绑定原始的 toString 方法到新构造器
// 这样可以让 toString 方法输出原始代码
window.Function.prototype.constructor.toString = oldFunctionConstructor.toString.bind(oldFunctionConstructor);


// --- 拦截 Function ---
// 备份原始 Function 对象
var oldFunction = Function;

// 替换全局 Function 对象,并拦截 debugger
window.Function = Closure(oldFunction);

// 同样,为了保持一致性,绑定原始的 toString 方法到新的 Function 对象
window.Function.toString = oldFunction.toString.bind(oldFunction);


// --- 拦截 eval ---
// 备份原始 eval 函数
var oldEval = eval;

// 使用 Closure 包装 eval 函数
window.eval = Closure(oldEval);

// 同样绑定原始的 toString 方法,以便 eval.toString() 返回原始代码
window.eval.toString = oldEval.toString.bind(oldEval);


// --- 拦截 GeneratorFunction ---
// 获取生成器函数的原型构造器(通常为 GeneratorFunction)
var oldGeneratorFunctionConstructor = Object.getPrototypeOf(function*() {}).constructor;

// 使用 Closure 包装生成器函数构造器
var newGeneratorFunctionConstructor = Closure(oldGeneratorFunctionConstructor);

// 绑定原始 toString 方法
newGeneratorFunctionConstructor.toString = oldGeneratorFunctionConstructor.toString.bind(oldGeneratorFunctionConstructor);

// 将拦截后的构造器重新定义为 GeneratorFunction 的构造器
Object.defineProperty(oldGeneratorFunctionConstructor.prototype, "constructor", {
    value: newGeneratorFunctionConstructor,
    writable: false, // 不允许修改
    configurable: true // 允许重新配置
});


// --- 拦截 AsyncFunction ---
// 获取异步函数的原型构造器(通常为 AsyncFunction)
var oldAsyncFunctionConstructor = Object.getPrototypeOf(async function() {}).constructor;

// 使用 Closure 包装异步函数构造器
var newAsyncFunctionConstructor = Closure(oldAsyncFunctionConstructor);

// 绑定原始 toString 方法
newAsyncFunctionConstructor.toString = oldAsyncFunctionConstructor.toString.bind(oldAsyncFunctionConstructor);

// 将拦截后的构造器重新定义为 AsyncFunction 的构造器
Object.defineProperty(oldAsyncFunctionConstructor.prototype, "constructor", {
    value: newAsyncFunctionConstructor,
    writable: false, // 不允许修改
    configurable: true // 允许重新配置
});

代码解释和用法

这个代码片段可以作为一个整体直接引入 JavaScript 项目中,用于检测和移除代码中的 debugger 关键字。其核心在于定义 Closure 函数,并利用该闭包创建钩子来拦截多个 JavaScript 构造器。

主要用途

  1. 移除 debugger:自动去除动态生成的 JavaScript 代码(例如通过 FunctionevalGeneratorFunctionAsyncFunction 创建的代码)中的 debugger 关键字,防止调试断点。
  2. 兼容多种函数类型:覆盖了普通函数、生成器函数和异步函数,确保不同类型的函数构造行为统一。
  3. 保留原始行为:虽然代码拦截了构造过程,但调用 .toString() 依然返回原始函数的内容,不会影响外部代码逻辑。

如何使用

可以将整个代码片段直接粘贴到 JavaScript 文件中,执行后环境中的 FunctionevalGeneratorFunctionAsyncFunction 的构造器都会自动去除 debugger

标签:Function,Closure,debugger,---,hook,toString,函数
From: https://www.cnblogs.com/lyt263/p/18525116

相关文章

  • JS HOOK 代码段
    1、定位header关键字(function(){letheaderCache=window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader=function(key,value){console.log('Hooksetheader%s=>%s',key,value);......
  • 解决QT5升级Creator 14.x后出现launch debugger红色报错问题-OK
       QT5升级QtCreator14.x后出现launchdebugger红色报错,QT5C++项目可以编译运行,但无法调试运行。经试验:选择DesktopQT5.15.2MinGW64-bit调试运行无法启动,红色报错。增加安装QT6.7.3后,选择DesktopQT6.7.3MinGW64-bit可以成功进行调试运行。   经过多次测试,发......
  • chrome浏览器断点调试工具之无限debugger的原理与绕过
    文章目录1、debugger介绍2、无限debugger案例演示3、无限debugger解决方法3.1实现原理3.2方法1:禁用断点(全局)3.3方法2:局部禁用(1)3.4方法3:局部禁用(2)3.5方法4:利用第三方工具fiddler解除无限debug1、debugger介绍debugger是JavaScript中定义的一个专门用于断点调......
  • Chromium127编译指南 Linux篇 - 同步第三方库以及Hooks(六)
    引言在成功克隆Chromium源代码仓库并建立新分支之后,配置开发环境成为至关重要的下一步。这一过程涉及获取必要的第三方依赖库以及设置钩子(hooks),这些步骤对于确保后续的编译和开发工作能够顺利进行起着决定性作用。本指南旨在详细阐述这些配置步骤的执行方法,为开发者提供清晰......
  • 从变量的角度理解 Hooks , 变得更简单了
    从变量角度理解Hooks在React的世界里,Hooks的引入为函数式组件带来了前所未有的灵活性和能力。它们让我们得以完全摆脱class式的写法,在函数式组件中完成生命周期管理、状态管理、逻辑复用等几乎全部组件开发工作。这次,我们就从变量的角度来深入理解一下这些强大的Hooks。......
  • ArgoWorkflow教程(八)---基于 LifecycleHook 实现流水线通知提醒
    本篇介绍一下ArgoWorkflow中的ExitHandler和LifecycleHook功能,可以根据流水线每一步的不同状态,执行不同操作,一般用于发送通知。1.概述本篇介绍一下ArgoWorkflow中的ExitHandler和LifecycleHook功能,可以根据流水线每一步的不同状态,执行不同操作,一般用于发送通知。......
  • react hook应用详解+diff 理解 + 父子组件渲染
    文章目录ReactHook函数全解1.useState2.useEffect3.useContext4.useReducer5.useCallback6.useMemo7.useRef8.useImperativeHandle9.useLayoutEffect10.useDebugValueReact渲染更新原理1.虚拟DOM(VirtualDOM)2.协调(Reconciliation)3.批量更新和DOM操作Reac......
  • kube-prometheus-stack 自定义 alertmanager 配置推送webhook
    创建AlertmanagerConfig资源在没有使用prometheus-operator的情况下,需要手动配置alertmanager.yaml来路由&发送从prometheus接收的警报。使用prometheus-operator之后,事情变得简单一些。只需要创建AlertmanagerConfig资源,prometheus-operator会自动merge所有的Ale......