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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值