JavaScrip中常用的HOOK脚本分享

 更新时间:2024年12月18日 09:10:31   作者:田小涛  
Hook 技术又叫做钩子函数,简单来说,就是把系统的程序拉出来变成我们自己执行代码片段,本文为大家整理了一些JavaScrip中常用的HOOK脚本,需要的可以参考下

Hook定义

Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权

这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递

简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。

在 js 中,系统程序可以指浏览器API,也可以指代码中实现的一些方法等

Hook 步骤

1、寻找 hook 点

2、编写 hook 逻辑

3、调试

注:最常用的是hook cookie response open 表单

常见hook脚本

COOKIE

(function() {
    //严谨模式 检查所有错误
    'use strict';
    var cookieTemp = "";
    Object.defineProperty(document, 'cookie', {
        set: function(val) {
 
                console.log('Hook捕获到cookie设置->', val);
                cookieTemp = val;
                return val;
        },
        get: function()
        {
            return cookieTemp;
        }
    });
})();

HEADER

(function () {
    var org = window.XMLHttpRequest.prototype.setRequestHeader;
    window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
        if (key == 'Authorization') {
            debugger;
        }
        return org.apply(this, arguments);
    };
})();

URL / XHR

(function () {
    var open = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function (method, url, async) {
        if (url.indexOf("login") != -1) {
            debugger;
        }
        return open.apply(this, arguments);
    };
})();

FETCH

(function () {
    let fetchCache = Object.getOwnPropertyDescriptor(window, "fetch");
    Object.defineProperty(window, "fetch", {
        value: function (url) {
            console.log("Hook fetch url => ", url);
            debugger;
            return fetchCache.value.apply(this, arguments);
        }
    });
})();

EVAL

(function() {
    var eval_ = eval;
    // 重写 eval
    var myeval = function(src) {
        if(src.includes('debugger')){
            src = src.replace(/debugger\s*;?/g, '')
        }
        return eval_(src);
    }
    var myeval_ = myeval.bind(null);
    myeval_.toString = function(){
        return eval_.toString();
    };
    Object.defineProperty(window, 'eval', {
        value: myeval_
    });
})();
 
 
var a=eval+""
var _eval=eval
eval=function(arg){
console.log(arg)
    return _eval(arg)
}
eval.toString=function(){return "function eval() { [native code] }"}
var _old=Function.prototype.toString.call
Function.prototype.toString.call=function(arg){
    if(arg==eval)
    return "function eval() { [native code] }"
    return _old(arg);
 
}
console.log(Function.prototype.toString.call(eval))

JSON

// JSON.stringify   ------------------------------------------
(function() {
    var stringify = JSON.stringify;
    JSON.stringify = function(params) {
        console.log("Hook JSON.stringify ——> ", params);
        debugger;
        return stringify(params);
    }
})();
 
// JSON.parse   ------------------------------------------
(function() {
    var parse = JSON.parse;
    JSON.parse = function(params) {
        console.log("Hook JSON.parse ——> ", params);
        debugger;
        return parse(params);
    }
})();

无限 DEBUGGER 

(function () {
    let constructorCache = Function.prototype.constructor;
    Function.prototype.constructor = function (string) {
        if (string === "debugger") {
            console.log("Hook constructor debugger!");
            return function () {};
        }
        return constructorCache(string);
    };
})();
 
 
 
Function.prototype.constructor_bk = Function.prototype.constructor
Function.prototype.constructor = function(){
    if (arguments[0]=="debugger"){
        return function () {};
    }else{
        return Function.prototype.constructor_bk.apply(this, arguments)
    }
}

WEBSOCKET

WebSocket

(function () {
    let sendCache = WebSocket.prototype.send;
    WebSocket.prototype.send = function (data) {
        console.info("Hook WebSocket send => ", data);
        return sendCache(data);
    };
})();

CONSOLE

CONSOLE

(function () {
    let consoleCache = console.log;
    console.log = function (msg) {
        consoleCache("Hook console.log =>", msg);
        if(msg === "value") {
            debugger;
        }
        consoleCache(msg);
    };
})();

CREATEELEMENT

(function () {
    let createElementCache = document.createElement;
    document.createElement = function (tagName) {
        console.info("Hook createElement tagName => ", tagName);
        if(tagName === "div") {
            debugger;
        }
        return createElementCache(tagName);
    };
})();

GETELEMENTBYID

(function () {
    let getElementByIdCache = document.getElementById;
    document.getElementById = function (id) {
        console.info("Hook getElementById id => ", id);
        if (id === "spiderapi") {
            debugger;
        }
        return getElementByIdCache(id);
    };
})();

SETATTRIBUTE

(function () {
    let setAttributeCache = window.Element.prototype.setAttribute;
    window.Element.prototype.setAttribute = function (name, value) {
        console.info("Hook setAttribute name => %s, value => %s", name, value);
        if (name === "value") {
            debugger;
        }
        return setAttributeCache(name, value);
    };
})();

SETINTERVAL / SETTIMEOUT

(function () {
    let setIntervalCache = setInterval;
    setInterval = function (func, delay) {
        console.log("Hook setInterval func => %s, delay => %s", func, delay);
        debugger;
        return setIntervalCache(func, delay);
    };
})();
 
 
 
(function () {
    let setTimeoutCache = setTimeout;
    setTimeout = function (func, delay) {
        console.log("Hook setTimeout func => %s, delay => %s", func, delay);
        debugger;
        return setTimeoutCache(func, delay);
    };
})();

原型链

// 备份原函数,并添加至原型链
String.prototype.split_ = String.prototype.split;
// hook split 方法
String.prototype.split = function(val){
    
    str = this.toString();
    debugger;
    return str.split_(val);
};
// 过检测
String.prototype.split.toString = function (){
    
    return "function split() { [native code] }";
}

hook 正则 test 方法,使其总是返回 true

RegExp.prototype.test_ = RegExp.prototype.test;
RegExp.prototype.test = function (val) {
    
    return true;
};
RegExp.prototype.test.toString = function () {
    
    return "function test() { [native code] }"
}

以上就是JavaScrip中常用的HOOK脚本分享的详细内容,更多关于JavaScrip HOOK脚本的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript使用FileSystemObject对象写入文本文件内容的方法

    JavaScript使用FileSystemObject对象写入文本文件内容的方法

    这篇文章主要介绍了JavaScript使用FileSystemObject对象写入文本文件内容的方法,实例分析了javascript使用ActiveXObject的技巧与常见问题的解决方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • js采用concat和sort将N个数组拼接起来的方法

    js采用concat和sort将N个数组拼接起来的方法

    这篇文章主要介绍了js采用concat和sort将N个数组拼接起来的方法,涉及JavaScript针对数组的合并与排序操作相关技巧,需要的朋友可以参考下
    2016-01-01
  • JavaScript时间格式化函数功能及使用示例

    JavaScript时间格式化函数功能及使用示例

    这篇文章主要为大家介绍了JavaScript时间格式化函数功能及使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Typescript中的数据类型实例总结

    Typescript中的数据类型实例总结

    ts中数据类型的定义是重点之一,所以必须明确ts有哪些数据类型,下面这篇文章主要给大家介绍了关于Typescript中数据类型的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 如何通过JS实现日历简单算法

    如何通过JS实现日历简单算法

    这篇文章主要介绍了如何通过JS实现日历简单算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • JavaScript读写二进制数据的方法详解

    JavaScript读写二进制数据的方法详解

    avascript里有两个内置对象,一个是ArrayBuffer;一个是DataView,读写二进制数据都需要使用这两个对象。这篇文章主要给大家介绍了关于JavaScript读写二进制数据的方法,需要的朋友可以参考下
    2018-09-09
  • 微信小程序用户后台定位及录音授权及请求示例

    微信小程序用户后台定位及录音授权及请求示例

    这篇文章主要为大家介绍了微信小程序用户后台定位及录音授权及请求示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • js获取当月最后一天实例代码

    js获取当月最后一天实例代码

    这篇文章主要介绍了js获取当月最后一天实例代码,有需要的朋友可以参考一下
    2013-11-11
  • 可以用来调试JavaScript错误的解决方案

    可以用来调试JavaScript错误的解决方案

    我们在书写js的过程中,经常会出现一些js错误,对于如果找出错误的解决方法就是关键,下面的文章就是相关的调试方法。
    2010-08-08
  • JS辨别访问浏览器判断是android还是ios系统

    JS辨别访问浏览器判断是android还是ios系统

    扫描二维码之后自动分辨出是android还是ios系统,因此就要用JS辨别访问浏览器针对于不同的系统进行不同的下载,需要的朋友可以参考下
    2014-08-08

最新评论