• 常用js逆向hook方法


    1.hook eval

    (function() { 
    'use strict';
    //过debuger 
    var eval_ = window.eval;
    window.eval = function(x){
        eval_(x.replace("debugger;","  ; "));
    };
    //防debuger检测
    window.eval.toString = eval_.toString;
    })();
    

    2.hook debugger

    //方式1
    Function.prototype.constructor=function(){};
    Function.prototype.constructor_bc=Function.prototype.constructor;
    Function.prototype.constructor=function(){
        if (arguments==="debugger"){return}
        else{return Function.prototype.constructor_bc.apply(this,arguments)}
    };
    //方式2
    n_eval = eval
    eval = function () {
        if (argument.indexOf("debugger") === 0) {
            return
        }
        return n_eval.apply(argument)
    }
    //方式3
    n_eval = eval
    eval = function () {
        reg = RegExp(/debugger/)
        if (reg.exec(argument)) {
            return
        }
        return n_eval.apply(argument)
    }
    //方式4
    n_Function = Function
    Function = function () {
        if (argument.indexOf("debugger") === 0) {
            return
        }
        return n_Function.apply(argument)
    }
    //方式5
    n_Function = Function
    Function = function () {
        reg = RegExp(/debugger/)
        if (reg.exec(argument)) {
            return
        }
        return n_Function.apply(argument)
    }
    
    //当前版本hook工具只支持Content-Type为html的自动hook
    (function () {
        'use strict';
        var cookie_cache = document.cookie;
        Object.defineProperty(document, 'cookie', {
            get: function () {
                console.log(cookie_cache);
                return cookie_cache;
            },
            set: function (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 + ";";
                }
            },
        });
    })();
    

    4.hook ajax

    !function (t) {
        function n(e) {
            if (r[e]) return r[e].exports;
            var i = r[e] = {
                exports: {},
                id: e,
                loaded: !1
            };
            return t[e].call(i.exports, i, i.exports, n),
                i.loaded = !0,
                i.exports
        }
    
        var r = {};
        return n.m = t,
            n.c = r,
            n.p = "",
            n(0)
    }([function (t, n, r) {
        r(1)(window)
    },
        function (t, n) {
            t.exports = function (t) {
                var n = "RealXMLHttpRequest";
                t.hookAjax = function (t) {
                    function r(n) {
                        return function () {
                            var r = this.hasOwnProperty(n + "_") ? this[n + "_"] : this.xhr[n],
                                e = (t[n] || {}).getter;
                            return e && e(r, this) || r
                        }
                    }
    
                    function e(n) {
                        return function (r) {
                            var e = this.xhr,
                                i = this,
                                o = t[n];
                            if ("function" == typeof o) e[n] = function () {
                                t[n](i) || r.apply(e, arguments)
                            };
                            else {
                                var u = (o || {}).setter;
                                r = u && u(r, i) || r;
                                try {
                                    e[n] = r
                                } catch (t) {
                                    this[n + "_"] = r
                                }
                            }
                        }
                    }
    
                    function i(n) {
                        return function () {
                            var r = [].slice.call(arguments);
                            if (!t[n] || !t[n].call(this, r, this.xhr)) return this.xhr[n].apply(this.xhr, r)
                        }
                    }
    
                    return window[n] = window[n] || XMLHttpRequest,
                        XMLHttpRequest = function () {
                            var t = new window[n];
                            for (var o in t) {
                                var u = "";
                                try {
                                    u = typeof t[o]
                                } catch (t) {
                                }
                                "function" === u ? this[o] = i(o) : Object.defineProperty(this, o, {
                                    get: r(o),
                                    set: e(o),
                                    enumerable: !0
                                })
                            }
                            this.xhr = t
                        },
                        window[n]
                },
                    t.unHookAjax = function () {
                        window[n] && (XMLHttpRequest = window[n]),
                            window[n] = void 0
                    },
                    t.default = t
            }
        }]);
    hookAjax(
        // hook functions and callbacks of XMLHttpRequest object
        {
            onreadystatechange: function (xhr) {
                //console.log("onreadystatechange called: %O", xhr)
    
            },
            onload: function (xhr) {
                //console.log("onload called: %O", xhr)
                xhr.responseText = "hook" + xhr.responseText;
    
            },
            open: function (arg, xhr) {
                console.log("open called: method:%s,url:%s,async:%s", arg[0], arg[1], arg[2], xhr);
                // arg[1] += "?hook_tag=1";
                //统一添加请求头
            },
            send: function (arg, xhr) {
                console.log("send called: %O", arg[0]);
                xhr.setRequestHeader("_custom_header_", "ajaxhook")
            },
            setRequestHeader: function (arg, xhr) {
                console.log("setRequestHeader called!", arg)
            },
            // hook attributes of XMLHttpRequest object
            timeout: {
                setter: function (v, xhr) {
                    //timeout shouldn't exceed 10s
                    return Math.max(v, 1000);
                }
            }
        }
    );
    

    5.防止hook检测

    // 这段代码防止反hook的检测
    orig = window.eval;
    window.eval=function(str){debugger;orig(str);}
    window.eval.toString = function (){return orig.toString();}
    

    6.防原型链检测

    //如hook了split方法
    String.prototype.split_bk=String.prototype.split;
    String.prototype.split = function(val){
    str = this.toString()
    debugger;
    return str.spilt_bk(val)
    }
    //伪装原型链
    String.prototype.split.toString=function(){
    return 'function split() { [native code] }'
    }
    
  • 相关阅读:
    范仁义js课程---54、匿名函数在框架中的应用
    js中的匿名函数
    【转】使用VisualSVN Server搭建SVN服务器
    浅析Java中CountDownLatch用法
    【转】Android平台下利用zxing实现二维码开发
    【转】Android应用开发性能优化完全分析
    Android自由行之走进zxing,轻松实现二维码扫描
    【转】Java Thread.join()详解
    【转】Spring websocket 使用
    spring4使用websocket
  • 原文地址:https://www.cnblogs.com/angelyan/p/15636539.html
Copyright © 2020-2023  润新知