【js逆向专题】3.hook技术

小节目标:

  1. 熟悉 hook技术作用
  2. 熟悉 常见的hook位置
  3. 熟悉 各个hook代码

一. 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方法

站点:aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tL2luZGV4Lmh0bWwj

我们知道在 JavaScriptJSON.stringify() 方法用于将 JavaScript 对象或值转换为 JSON 字符串,JSON.parse() 方法用于将一个 JSON 字符串转换为JavaScript 对象,某些站点在向 web 服务器传输用户名密码时,会用到这两个方法

(function() {
    var _parse = JSON.parse;
    JSON.parse = function(ps) {
        console.log("Hook JSON.parse ——> ", ps);
        debugger;
        return _parse(ps);  // 不改变原有的执行逻辑 
    }
})();

首先定义了一个变量 stringify 保留原始 JSON.stringify 方法,然后重写 JSON.stringify 方法,遇到 JSON.stringify 方法就会执行 debugger 语句,会立即断下,最后将接收到的参数返回给原始的 JSON.stringify 方法进行处理,确保数据正常传输

三. HOOK cookie操作

1. 认识方法

WEBAPI地址:aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvemgtQ04vZG9jcy9XZWIvQVBJ

Object.defineProperty 为对象的属性赋值,替换对象属性

基本语法:Object.defineProperty(obj, prop, descriptor),它的作用就是直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,接收的三个参数含义如下:

  • obj:需要定义属性的当前对象;

  • prop:当前需要定义的属性名;

user = {
    age: '123'
}
aa = user.age
Object.defineProperty(user, "age", {
    get: function () {
        return aa
    },

    set: function (newVal) {
        console.log("这个人来设置值了!!");
        aa = newVal
    }
})
console.log(user.age)
user.age = '23342'
console.log(user.age)
2. hook cookie 示例
  • 目标网址:aHR0cDovL3EuMTBqcWthLmNvbS5jbi8=

  • cookie 钩子用于定位 cookie 中关键参数生成位置,以下代码演示了当 cookie 中匹配到了 v, 则插入断点:

    (function () {
        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;
            },
        });
    })();
    
  • 注:正常hook cookie操作的时候需要清除下cookie

四. HOOK XHR请求

  • 案例地址:aHR0cHM6Ly93d3cucWltYWkuY24=
  • 案例网址: aHR0cHM6Ly93d3cueW5qempnY3guY29tL2RhdGFQdWIvZW50ZXJwcmlzZQ==
  • 定义了一个变量 open 保留原始 XMLHttpRequest.open 方法,然后重写 XMLHttpRequest.open 方法,判断如果 rnd 字符串值在 URL 里首次出现的位置不为 -1,即 URL 里包含 analysis字符串,则执行 debugger 语句,会立即断下。
// 如果是正数 表示存在里面
// 如果是-1 表示不在里面

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

  • 有点类似于xhr断点
  • 了解了拦截器之后再会头讲定位方式

五. XMLHttpRequest与拦截器

1. XMLHttpRequest
  • 文档地址: aHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvemgtQ04vZG9jcy9XZWIvQVBJL1hNTEh0dHBSZXF1ZXN0
  • XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequestAJAX 编程中被大量使用。
  • 可以理解为是ajax的底层操作

XMLHttpRequest.open()

方法初始化一个新创建的请求,或重新初始化一个请求。

xhrReq.open(method, url, async);

XMLHttpRequest.send()

发送请求。如果请求是异步的(默认),那么该方法将在请求发送后立即返回。

方法接受一个可选的参数,其作为请求主体;如果请求方法是 GET 或者 HEAD,则应将请求主体设置为 null。

xhrReq.send(body)

XMLHttpRequest.setRequestHeader()

设置 HTTP 请求头的值。必须在 open() 之后、send() 之前调用 setRequestHeader() 方法。

myReq.setRequestHeader(header, value);    // headers['key'] = value

XMLHttpRequest.onreadystatechange

readyState 属性发生变化时,调用的事件处理器。



// 请求参数
body = 'column=szse_gem_latest&pageNum=2&pageSize=30&sortName=&sortType=&clusterFlag=true'

// 构造请求
let e = {
    'url':"http://www.cninfo.com.cn/new/disclosure",
    'method':'POST',
    "data": body
}
var h  = new  XMLHttpRequest(); 
// 初始化链接
h.open(e.method,e.url,true);
// 设置头部
h.setRequestHeader('accept','application/json;charset=UTF-8');
// 接收响应
    h.onreadystatechange = function (){
        if (h.status===200){
            console.log(JSON.parse(h.response))
        }
    }
// 发请求  
h.send(e.data)
2. 拦截器
  • 请求拦截器:在发送请求之前,可以借助一些函数来对请求的内容和参数做一些检测。若有问题可以直接取消请求。
  • 响应拦截器:当服务器返回响应数据时,响应拦截器会在我们拿到结果前预先处理响应数据。例如对响应数据做一些格式化处理,或者当响应失败时,可以做一些失败提醒和纪录。
// npm install axios
axios = require('axios')
//设置请求拦截器
axios.interceptors.request.use(function (config) {
    console.log('请求拦截器 成功')
    config.headers['sign'] = 'lili'
    return config;
}, function (error) {
    console.log('请求拦截器 失败')
    return Promise.reject(error);
});

//设置响应拦截器
axios.interceptors.response.use(function (response) {
    console.log('响应拦截器 成功')
    console.log('调解密函数进行解密数据')
    //return response;
    return response.data; //修改响应数据
}, function (error) {
    console.log('响应拦截器 失败')
    return Promise.reject(error);
});

//发送请求
axios.get('http://httpbin.org/get').then(res=>console.log(res))
  • 注意:不是所有的网站都会写拦截器
  • 加载执行方式
加载html --> 加载js代码  --> 触发请求接口(ajax)  --> 构造请求对象  --> 请求拦截器 --> 请求服务器 -->  返回数据 --> 响应拦截器 

通知

由于安全审核原因,此节以后内容涉及到的所有链接均采用浏览器的btoa函数进行base64处理,还原调用atob即可。

结语

以上就是关于js逆向技术中的hook技术全部内容了,欢迎同学在评论区讨论交流,有任何js逆向、数据采集相关需求也可以后台或V加regentwan与我联系哟~

### 回答1: 在 Python 中,keyboard.hook() 函数用于在按下或释放指定按键时执行回调函数。该函数需要传入一个回调函数作为参数,回调函数将在按键事件发生时被调用。例如,如果要在按下键盘上的 "a" 键时执行某个函数 foo(),可以这样调用:keyboard.hook(foo, 'a')。 在这里,'abc' 作为参数传递给 keyboard.hook() 函数,表示要捕捉键盘上的 'abc' 按键事件,并执行相应的回调函数。具体的回调函数实现需要根据具体的需求来编写。 ### 回答2: keyboard.hook(abc)是一个键盘钩子函数,用于在程序运行中监视键盘输入事件,并对其作出相应的处理。 所谓键盘钩子,是一段程序代码,用于截获并处理键盘输入事件。在这里,keyboard.hook()是一个函数,它接受一个参数abc,表示注册一个钩子来监视键盘输入事件abc。 键盘输入事件也可以称为键盘按键事件,即当用户在键盘上按下或释放某个按键时,就会触发相应的事件。通过使用keyboard.hook()函数,我们可以在程序运行过程中截获这些事件,并对它们进行处理。 通过注册一个abc的钩子,我们可以定义一个回调函数,当用户按下或释放键盘上的指定按键abc时,这个回调函数就会被调用。在回调函数中,我们可以自定义处理逻辑,比如记录按键信息、执行特定操作、触发其他事件等等。 总之,keyboard.hook(abc)用于在程序运行中截获特定按键事件,并在这些事件发生时执行相应的处理逻辑。这是一个非常常用的技术,可以广泛应用于各种需要响应键盘输入的程序中,比如游戏、输入检测、热键设置等等。 ### 回答3: keyboard.hook(abc)是一个函数调用,意思是将abc作为参数传递给keyboard.hook函数。 keyboard.hook函数是一个键盘钩子函数,可以用来监视键盘事件。当有键盘事件发生时,该函数将被触发并执行相应的操作。 参数abc是一个键盘事件处理函数,用来处理具体的键盘事件。可以自定义abc函数来实现不同的键盘操作。当键盘事件发生时,abc函数将被调用并执行相应的代码逻辑。 通过调用keyboard.hook函数并传递abc参数,可以实现对键盘事件的监视和处理。具体的实现方式和逻辑需要根据具体的需求和业务场景来设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Regent Wan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值