HOOK技术简介

1. 什么是HOOK技术?

Hook 是一种钩子技术,在系统没有调用函数之前,钩子程序就先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,也可以强制结束消息的传递。简单来说,修改原有的 JS 代码就是 Hook

2. Hook 技术为什么能实现

  • 客户端拥有 JS的最高解释权,可以决定在任何时候注入 JS,而服务器无法阻止或干预。服务端只能通过检测和混淆的手段,另 Hook 难度加大,但是无法直接阻止。
  • 除了上面的必要条件之外,还有一个条件。就是 JS是一种弱类型语言,同一个变量可以多次定义、根据需要进行不同的赋值,而这种情况如果在其他强类型语言中则可能会报错,导致代码无法执行。JS的这种特性,为我们 Hook 代码提供了便利。
  • 注意:JS 变量是有作用域的,只有当被 hook 函数和 debugger 断点在同一个作用域的时候,才能 hook 成功。

3. 为什么要hook

  • 当我们找到接口,发现数据是加密的,那我们就要去找数据加密的位置, dom断点和 xhr断点,都是可以用来定位加密的位置,但是定位的距离可能会有远有近,我们需要跟很多的栈,相对是比较麻烦的
  • 那么hook技术同样是用来定位数据加密的位置,可以帮助我们可以更快的去找到加密位置

4. hook步骤

  1. 寻找需要hook(加密的数据)的点
  2. 编写hook逻辑
  3. 控制台注入hook代码
  4. 调试代码

HOOK 常用脚本

1.dom 操作

这两行代码用于动态修改网页中的 HTML 元素。

// 修改DOM元素的属性
document.getElementById('elementId').setAttribute('attrName', 'attrValue');
 
// 修改DOM元素的样式
document.getElementById('elementId').style.property = 'value';

2.事件监听 操作

通过监听网页上的事件,我们可以触发自定义事件的操作和行为。

// 监听按钮点击事件
document.getElementById('buttonId').addEventListener('click', function() {
// 自定义操作和行为
});

这段代码通过“劫持”(Hook)document.cookie 的读写操作,实现对 Cookie 的监控与拦截

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

4.Headers 操作

Header Hook 用于定位 Header 中关键参数生成位置,以下代码演示了当 Header 中包含 Authorization 关键字时,则插入断点:

(function () {
    var org = window.XMLHttpRequest.prototype.setRequestHeader;
    window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {
        if (key == 'Authorization') {
            debugger;
        }
        return org.apply(this, arguments);
    };
})();

5.XHR 操作

保留原始 XMLHttpRequest.open 方法,重写 XMLHttpRequest.open 方法,判断如果 URL 里包含 analysis字符串,则执行 debugger 语句,会立即断下。

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

6、JSON.stringify操作

JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串,在某些站点的加密过程中可能会遇到,以下代码演示了遇到 JSON.stringify() 时,则插入断点:

复制

(function() {
    var stringify = JSON.stringify;
    JSON.stringify = function(params) {
        console.log("Hook JSON.stringify ——> ", params);
        debugger;
        return stringify(params);
    }
})();

7.JSON.parse() 操作

JSON.parse() 方法用于将一个 JSON 字符串转换为对象,在某些站点的加密过程中可能会遇到,以下代码演示了遇到 JSON.parse() 时,则插入断点:

(function() {
    var parse = JSON.parse;
    JSON.parse = function(params) {
        console.log("Hook JSON.parse ——> ", params);
        debugger;
        return parse(params);
    }
})();