js hook 学习整理

2022-02-28  本文已影响0人  行走的佩奇

hook代码的目的是为了更方便的调试代码,找出函数入口
遇到好的方法的随时跟新

1.对象中属性hook公式----cookie

Object.defineProperty(document, 'cookie', {
    set: function(val){
        console.log('cookie',val)
        debugger;
    },
    get:function(val){
        console.log('cookie',val)   
    }
})

普通对象正常返回值--hook
(function() {
    'use strict';
    var v = 'value';
    var new_value = qq[v]
    Object.defineProperty(qq, v, {
        get: function() {
            // console.log('获取属性值',new_value);
            // debugger;
            return  new_value;
        },
        set: function(value) {
            console.log('设置属性值',value);
            debugger;
            new_value = qq[v]
            return value;
        },
    });

})();
//全局对象的属性都可以照这个例子
(function() {
    'use strict';
    var cookie_cache = document.cookie;
    Object.defineProperty(document, 'cookie', {
        get: function() {
            // console.log(cookie_cache);
            return cookie_cache;
        },
        set: function(val) {
            if (val.indexOf('gdxidpyhxdE') != -1){
                console.log('cookie',val)   
                debugger;
            }
            var cookie = val.split(";")[0];
            var ncookie = cookie.split("=");
            var flag = false;
            var cache = cookie_cache.split(";");
            cache = cache.map(function(a){
                if (a.split("=")[0] === ncookie[0]){
                    flag = true;
                    return cookie;
                }
                return a;
            })
            cookie_cache = cache.join(";");
            if (!flag){
                cookie_cache += cookie + ";";
            }
        },
    });

})();

2. 关于原型链 hook例子 ---- 字符串, 请求头

String.prototype.split_old = String.prototype.split;
String.prototype.split = function (val) {
    str = this.toString()
    console.log(str,val);
    debugger;
    return str.split_old
};
String.prototype.split.toString = function(){return'function split() { [native code] }'}
//最后一步防止检测
var header_old = window.XMLHttpRequest.prototype.setRequestHeader;
window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
    if (key=='k'){
        console.log(key, value)
        debugger;
    }
    if (key=='token'){
        console.log(key, value)
        debugger;
    }
    debugger;
    return header_old.apply(this, arguments);
}

3. 函数 hook例子

例子1
function a(x,y){return x+y} // 要hook的函数
//  先赋值
old_func = a;
//  改写a方法
a = function(){
    // todo
    console.log('result', arguments);
    return old_func.apply(this,arguments)
}
console.log(a(1,2))  //  调用

例子2
(function() {
    'use strict';
    let old_func = sessionStorage.setItem;
    sessionStorage.setItem = function () {
        // todo
        console.log('argument-----', arguments);
        return old_func.apply(this, arguments)
    };

    sessionStorage.setItem.toString = function () {
        return 'function split() { [native code] }'
    };

})();

上一篇 下一篇

猜你喜欢

热点阅读