JS Hook 与 过 debugger

JS 变量是有作用域的,只有当被 hook 函数和 debugger 断点在同一个作用域的时候,才能 hook 成功。

  1. 过各种debugger断点(控制台反调试)
  2. 拦截请求
  3. 注入ws
  4. 主动debugger,用户请求参数加密(用的最多)
  5. 函数替换,函数置空,函数覆盖(过debugger有时候用)

JSON.parse()

(function () {
  var parse_ = JSON.parse;
  JSON.parse = function (arg) {
    console.log(arg);
    debugger;
    return parse_(arg);
  };
})();

XMLHttpRequest(请求的参数

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

XMLHttpRequest(header)

(function () {
  var _setRequestHeader = window.XMLHttpRequest.prototype.setRequestHeader;
  window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
    if (key == "header 的参数 key") {
      debugger;
    }
    return open.apply(this, arguments);
  };
})();

Cookie

(function() {
  var cookieTemp = '';
  Object.defineProperty(document, 'cookie', {
    set: function (val) {
      if (val.indexOf('cookie 关键字') != -1) {
        debugger;
      }
      console.log(val);
      cookieTemp = val;
      return val;
    },
    get: function() {
      return cookieTemp;
    },
  });
})();

eval

(function() {
  var _eval = eval;
  eval = function(val) {
    if (val.indexof('debugger') === -1) {
      _eval_cache(obj);
    }
  }
})();

方法置空(过 debugger)

// 原理
function main() {
  debugger;
}

main = function() {}; // 置空

无限 debugger

原理:debugger 关键字。
常常利用 javascript 构造出 debugger 使用 Function.constructor / setInterval / eval 。
一般相关代码会被混淆。

eval
// 通常以下代码是加密构造出来的, eval 执行的是一个字符串变量。
eval("debugger;")
eval("(function() {var a = new Date(); debugger; return new Date() - a > 100;}())")

1.使用字符串 replace("debugger;","        ") 方法,进行替换 debugger ,为防止对字符串进行长度
  检测,常常使用等长的空格替换
2.Hook
  (function() {
    var _eval = eval;
    eval = function(val) {
      if (val.indexof('debugger') === -1) {
        _eval_cache(obj);
      }
    }
  })();
3.置空
  eval = function() {};
定时器
// 对于定时器
setInterval(function () { debugger; }, 500);


1. 方法置空
  setInterval = function() {};
Function
// 常见形式
Function('debugger')()
(function(){return false;})['constructor']('debugger')['call']();
xxx.constructor("debugger").call("action")

1. Hook
Function.prototype.__constructor_back = Function.prototype.constructor;
Function.prototype.constructor = function() {
  if(arguments && typeof arguments[0]==='string'){
    //alert("new function: "+ arguments[0]);
    if("debugger" === arguments[0]){
      //arguments[0]="console.log(\"anti debugger\");";
      //arguments[0]=";";
      return;
    }
  }
 return Function.prototype.__constructor_back.apply(this,arguments);
}
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

初原挽风

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

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

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

打赏作者

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

抵扣说明:

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

余额充值