zoukankan      html  css  js  c++  java
  • js hook

    Hook技术又叫钩子函数,在系统没有调用该函数之前,钩子程序就捕获该消息,钩子函数先得到该函数的控制权,这时钩子函数既可以改变该函数的执行行为,还可以强制结束消息的传递,简单来说。就是把系统的程序拉出来,来变成我们自己执行的片段

    在js中,系统程序可以指浏览器api(比如浏览器指纹)也可以指代码中实现的一些方法

    分类:手动hook,自动hook

    Hook步骤:

    1。寻找hook的点

    2。编写hook逻辑

    3。调试

    最常用的是hook cookie和eval

    通用hook公式

    函数hook

    old_func=func

    func=function(argument){
      my task;//可以是一些打印的操作

      //返回函数调用

      return old_func.applay(argument)
    }

    //修改原生的方法,伪装没有被hook

    func.prototype....=...

    函数hook三部曲:赋值,重写,原型链

    对象中属性的hook方式

    old_attr=obj.attr

    Object.defineProperty(obj,'attr',{
      get:function(val){
        console.log (val)

        return old_attr
    },

      set:function(val){

         console.log(val)

          return .....

    }
    })

    为什么能实现hook?

    客户端拥有js的最高解释权,可以决定在任何的时候注入js服务器而无法左右,只能通过 检测和混淆手段令hook难度加大,但是却无法阻止hook

    hook的目的:找到函数入口以及一些参数的变化,便于分析js逻辑

    Hook演示实战

    找到设置cookie设置的函数入口

    下面的是一个最简单的获得设置cookie入口函数的hook代码Object.defineProperty(document, 'cookie', {

        get: function () {
    debugger;
    return;
    },
    set:function (val) {
    debugger;
    return;
    }
    })
    网站
    http://www.python-spider.com/challenge/2

    在hook之前,我们需要先打上script断点,断点完成之后刷新网页,再打开控制台输入代码,回车,

     

     现在我们把script断点放开

    点击右上角的三角形,让他继续运行

     有个无限debugger,我们右键nerver Pasuse here就可以了 ,继续点那个三角形

     点了之后会有个卡顿的时间,正常现象,最后出现这个界面

     我们看到现在已经正常进入到我们hook的部分了。现在对右边对callback里面对调用战进行点击,找到入口函数

    点开第二个就找到了,代码乱码的格式化一下(cookie都是document.cookie方法生成的)

      这就找到的cookie的设置入口

    Hook eval函数

    eval_bk=eval


    eval=function(val){
    debugger;
    return eval_bk(val)

    }

     //修改原生的方法,伪装没有被hook
    eval.toString=function(){

     

    return 'function eval() { [native code] }'

    }

     第二种就是正常情况下object.defineproty只能绑定一次,重复绑定的时候会报错,

    像这样

     官方文档说设置什么为true,就可以再次绑定,反正在暂时不会

    如果网站的逻辑全部用这个方法绑定,他定义在你hook之前,你直接hook就会报错,。如果在你hook之后,他定义的时候就会报错,但是网站不会给你抛出异常信息,而是给你个蜜罐。让你进入到蜜罐里,最后解析出错误的逻辑

    1 局部函数对hook

    function a() {
    function b(a) {
    return a
    }

    //hook b的argument a为5的时候大断点
    b_bk = b;
    b = function (val) {
    if (val === 5) {
    debugger;
    }
    return b_bk()

    }

    b(1);
    b(2);
    eval('b(' + 5 + ')')
    }



    2 全局变量的 hook
    实际上就是相当于window.xxx

    比方说全局变量a

    Object.defineProperty(window, 'a', {

        get: function () {
    debugger;
    return;
    },
    set:function (val) {
    debugger;
    return;
    }
    })
  • 相关阅读:
    如何测试复杂的逻辑
    Docker 安装nginx和tomcat
    提高英语
    2020年终总结
    在互联网上班是什么感觉?
    已经过去2周了,你感觉怎么样?
    如何使用玩弄 macOS 的「聚焦搜索」
    如何使用玩弄 macOS 的「聚焦搜索」
    [sdoi2015]排序(搜索+剪枝优化)
    [sdoi 2010][bzoj 1925]地精部落(神仙dp)
  • 原文地址:https://www.cnblogs.com/wuxianyu/p/14523905.html
Copyright © 2011-2022 走看看