js一些hook 记录

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;
        },
    });

})();
//全局对象的属性都可以照这个例子

严格模式 正常返回cookie的值

(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 + ";";
            }
        },
    });

})();

关于原型链 hook例子 ---- 字符串, 请求头
String自带函数例子 Number Array Object 可用同方法`

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] }'}
//最后一步防止检测

请求头hook

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);
}

函数 hook例子

function a(x,y){return x+y} // 要hook的函数
//  先赋值 
old_func = a;
//  改写a方法    
a = function(argument){
    // todo
    console.log(argument)
    return old_func.apply(argument)
}   

console.log(a(1,2))  //  调用 

Hook http请求
http请求包括 ajax、src、href、表单等

// 代码来源:https://www.cnblogs.com/amiezhang/p/9984690.html

function hookAJAX() {
    XMLHttpRequest.prototype.nativeOpen = XMLHttpRequest.prototype.open;
    var customizeOpen = function (method, url, async, user, password) {
      // do something
      this.nativeOpen(method, url, async, user, password);
    };

    XMLHttpRequest.prototype.open = customizeOpen;
  }

  /**
   *全局拦截Image的图片请求添加token
   *
   */
  function hookImg() {
    const property = Object.getOwnPropertyDescriptor(Image.prototype, 'src');
    const nativeSet = property.set;

    function customiseSrcSet(url) {
      // do something
      nativeSet.call(this, url);
    }
    Object.defineProperty(Image.prototype, 'src', {
      set: customiseSrcSet,
    });
  }

  /**
   * 拦截全局open的url添加token
   *
   */
  function hookOpen() {
    const nativeOpen = window.open;
    window.open = function (url) {
      // do something
      nativeOpen.call(this, url);
    };
  }

  function hookFetch() {
    var fet = Object.getOwnPropertyDescriptor(window, 'fetch')
    Object.defineProperty(window, 'fetch', {
      value: function (a, b, c) {
        // do something
        return fet.value.apply(this, args)
      }
    })
  }
// 代码来源:https://www.cnblogs.com/amiezhang/p/9984690.html

cookie钩子:用于定位cookie中关键参数生成位置
当cookie中匹配到了 目标cookie字符串, 则插入断点。

(function () {
  'use strict';
  var cookieTemp = '';
  Object.defineProperty(document, 'cookie', {
    set: function (val) {
      if (val.indexOf('目标cookie字符串') != -1) {
        debugger;
      }
      console.log('Hook捕获到cookie设置->', val);
      cookieTemp = val;
      return val;
    },
    get: function () {
      return cookieTemp;
    },
  });
})();

请求钩子
用于定位请求中关键参数生成位置。

(function () {
  'use strict';
  var cookieTemp = '';
  Object.defineProperty(document, 'cookie', {
    set: function (val) {
      if (val.indexOf('关键参数') != -1) {
        debugger;
      }
      console.log('Hook捕获到关键参数设置->', val);
      cookieTemp = val;
      return val;
    },
    get: function () {
      return cookieTemp;
    },
  });
})();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨鱼在沙漠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值