hook

在JavaScript中,hook是一种能够拦截和修改函数或方法行为的技术。通过使用hook,开发者可以在现有的函数执行前、执行后或者替换函数的实现逻辑。hook目的是找到函数入口以及一些参数变化,便于分析js逻辑。

作用

  1. 增强代码的可扩展性:Hook技术允许开发者在不修改原始代码的情况下,增加或修改功能,使得代码更加灵活和可扩展。

  2. 减少代码的侵入性:使用hook可以在不改变原始代码的前提下增加新功能,这减少了对原始代码的侵入,使得添加的功能更容易被管理和维护。

  3. 便于调试和问题定位:利用hook技术可以在函数执行前后插入调试信息,帮助开发者更好地理解程序执行流程和定位问题源头。

基本使用

1. 函数的 hook

  • 定义函数

// 定义函数
function add(a, b) {
    console.log("add方法正在执行");
    return a + b;
}
  • 保存原函数,目的是为了不修改原函数内部的实现

  • 对add函数进行hook(进行相关的日志输出)

    • hook的位置必须是加载完需要hook的函数(原函数)后

  • 调用函数

2. 对象属性的 hook

如果对象没有/不存在的属性可以被hook吗?

案例 - 浏览器环境下atob函数的hook

atob函数是浏览器环境自带的用来对base64数据进行解编码。接下来,使用对atob函数进行hook。

编写hook代码:

hook时机:在浏览器页面加载出来之前进行hook

  1. 在一个空白页面打开浏览器开发者工具

  2. 开启js的事件监听器

  3. 访问百度页面,会有断点停留

  4. 在Sources中的Snippets代码段中新增hook代码片段,打上断点,然后运行

  5. 查看hook运行,监控atob函数的执行

  6. 取消事件监听器中的Script,因为此时已经成功对atob函数进行了hook(不可刷新页面)

编写hook代码:

hook 检测与破解检测

一些网站会严格检测该网站中的先关函数或者属性是否被一些别有用心的人进行hook。那么检测方式是什么呢?我们又该如何破解该种检测呢?

toString() 检测法

  • atob原函数的toString() 结果为:

  • atob被hook后的toString() 结果为:

  • 结果:两个atob的toString返回的结果是不一样的。

什么是native?

在js中,一些内置函数如toString或者atob等函数的函数实现会被显示为[native code], 而不是显示实现的具体代码。这样的操作对于提高代码的安全性和封装性有一定的作用。

toString() 检测法的破解

在hook中重写atob函数的toStirng方法:

原型链上的toString()检测法

原型链上的toString()检测法的破解

在hook中重写原型链上的toString()方法:

Last updated