JS常用HOOK调试技术

hook技术

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

Hook 技术之所以能够实现有两个条件:

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

**注意:**JS 变量是有作用域的,只有当被 hook 函数和 debugger 断点在同一个作用域的时候,才能 hook 成功。

Hook步骤:*
  • 1、寻找hook入口

  • 2、编写hook逻辑

  • 3、调试

:最常用的是hook cookie

hook 方法

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);}
})();
hook XHR请求

定义了一个变量 open 保留原始 XMLHttpRequest.open 方法,然后重写 XMLHttpRequest.open 方法

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

Interceptors-拦截器

  • 请求拦截器:在发送请求之前,可以借助一些函数来对请求的内容和参数做一些检测。若有问题可以直接取消请求。
  • 响应拦截器:当服务器返回响应数据时,响应拦截器会在我们拿到结果前预先处理响应数据。例如对响应数据做一些格式化处理,或者当响应失败时,可以做一些失败提醒和纪录。
// npm install axios
axios = require('axios')
//设置请求拦截器
axios.interceptors.request.use(function (config) {console.log('请求拦截器 成功')config.timeout = 2000; //修改请求configconfig.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))

XMLHttpRequest

XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest 在 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 属性发生变化时,调用的事件处理器。

var xhr= new XMLHttpRequest(),method = "GET",url = "https://developer.mozilla.org/";xhr.open(method, url, true);
xhr.onreadystatechange = function () {if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {console.log(xhr.responseText)}
}
xhr.send();
HOOK cookie操作

WEBAPI地址:https://developer.mozilla.org/zh-CN/docs/Web/API

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

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

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

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

Object.defineProperty(user,"age",{get:function(){console.log("这个人来获取值了!!");return count;},set:function(newVal){console.log("这个人来设置值了!!");count=newVal+1;}
})

cookie 示范

示范例子:http://q.10jqka.com.cn/

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

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

注:正常hook cookie操作的时候需要清除下cookie

通用反调试
(function() {var _constructor = unsafeWindow.Function.prototype.constructor;// Hook Function.prototype.constructorunsafeWindow.Function.prototype.constructor = function() {var fnContent = arguments[0];if (fnContent) {if (fnContent.includes('debugger')) { // An anti-debugger is attempting to stop debuggingvar caller = Function.prototype.constructor.caller; // Non-standard hack to get the function callervar callerContent = caller.toString();if (callerContent.includes(/\bdebugger\b/gi)) { // Eliminate all debugger statements from the caller, if anycallerContent = callerContent.replace(/\bdebugger\b/gi, ''); // Remove all debugger expressionseval('caller = ' + callerContent); // Replace the function}return (function () {});}}// Execute the normal function constructor if nothing unusual is going onreturn _constructor.apply(this, arguments);};
})();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全保障流程

需求定义 满足法规合规、业务需求、风险评估 信息系统保护轮廓ISPP-----标准化安全保障需求文档----从用户角度规范化、机构化 需要包括:系统描述、安全环境、保障目的、安全保障要求、应用注解、符合性声明7部分 规划设计 考虑业务功能和价值,哪些风险…

12.25广义分布外检测学习/代码复现

A model.getA().toarray() # b np.array(model.RHS) sense np.array(model.sense) f np.array(model.obj)Aineq np.vstack((-Ale, Age)) # 把所有的<和>组合在一起 bineq np.append(-ble, bge) # 这里用append使bineq为一个一维矩阵&#xff0c;而不是2行1列的二…

html动态加载script

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>动态添加JavaScript代码</title> </head> <body> <h1>Hello, World!</h1> <button onclick"add…

SpringBoot 3.2.0 基于Spring Security+JWT实现动态鉴权

依赖版本 JDK 17 Spring Boot 3.2.0 Spring Security 6.2.0 工程源码&#xff1a;Gitee 为了能够不需要额外配置就能启动项目&#xff0c;看到配置效果。用例采用模拟数据&#xff0c;可自行修改为对应的ORM操作 编写Spring Security基础配置 导入依赖 <properties>&l…

Pikachu靶场 字符型SQL注入

在Pikachu靶场里查询 xx or 11 # or 11 # union select username,password from users# 在 MySQL 的 bin 路径下打开 cmd &#xff0c;输入下面的命令&#xff0c;再输入 数据库的密码 mysql -u root -p 执行命令 show databases; use pikachu show tables; desc member; s…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(1)

前言中曾提到&#xff1a;本章主要说明PCI总线涉及的一些基本知识。 PCI总线作为处理器系统的本地总线&#xff0c;其主要目的是为了连接外部设备&#xff0c;而不是作为处理器的系统总线连接Cache和主存储器。但是PCI总线、系统总线和处理器体系结构之间依然存在着紧密的联系…

java练习之abstract (抽象) final(最终) static(静态) 练习

1&#xff1a;分析总结&#xff1a;写出private、abstract、static、final之间能否联动使用&#xff0c;并写出分析原因 private static final 之间可以任意结合 abstract 不可以与private static final 结合使用 2&#xff1a;关于三个修饰符描述不正确的是(AD) A. static …

Linux操作系统基础知识点

Linux是一种计算机操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年首次发布。Linux操作系统通常与GNU套件一起使用&#xff0c;因此也被称为GNU/Linux。它是一种类UNIX的操作系统&#xff0c;设计为多用户、多任务…

计算机组成原理综合6

补码表示&#xff1a; X&#xff1a;1111 1111 1111 1101 Y&#xff1a;1111 1111 1101 1111 Z&#xff1a;0111 1111 1111 1100 转原码表示&#xff1a;从右往左找第一个“1”&#xff0c;左边的所有数值位按位取反 X&#xff1a;1111 1111 1111 1101 1000 0000 00…

常用的快捷键

快捷键能大大提高使用计算机时的效率。以下是一些常用的快捷键&#xff0c;适用于多种操作系统和应用程序&#xff1a; 通用快捷键 复制: Ctrl C (Windows/Linux) | Cmd C (Mac) 粘贴: Ctrl V (Windows/Linux) | Cmd V (Mac) 剪切: Ctrl X (Windows/Linux) | Cmd X (Ma…

Fiber Node的数据结构,以及如何在Reconciliation阶段被使用。

首先&#xff0c;Fiber Node是React用来描述组件树的数据结构&#xff0c;每一个React组件都对应一个Fiber Node。下面是一个Fiber Node的基本结构&#xff1a; const fiber {// 标识这个Fiber Node的类型&#xff08;函数组件&#xff0c;类组件&#xff0c;DOM节点类型等&a…

OGG-MySQL无法正常同步数据问题分析

问题背景: 用户通过OGG从源端一个MySQL从库将数据同步到目标端的另一个MySQL数据库里面&#xff0c;后面由于源端的从库出现了长时间的同步延时&#xff0c;由于延时差距过大最后选择通过重建从库方式进行了修复 从库重建之后&#xff0c;源端的OGG出现了报错ERROR OGG-0014…

45.常用shell之 unset - 删除环境变量或函数 的用法及衍生用法

unset 是一个在类 Unix 系统的 shell 中常用的命令&#xff0c;用于删除环境变量或 shell 函数。这个命令可以帮助用户管理环境变量&#xff0c;防止不必要的变量干扰或占用资源。以下是 unset 命令的基本用法和一些衍生用法的示例&#xff1a; 基本用法 删除环境变量: unset …

java基础之Java的动态代理如何实现

Java实现动态代理的两种方式 JDK动态代理&#xff1a;Java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。Cglib动态代理&#xff1a;Cglib (Code Generation Library )是一个第三方代码生成类库&#xff0c;运行时在内存中动态生成一个子类对…

【Qt-QString】

Qt编程指南 ■ QString■ 编码方式■ 下划线■ 制表符■ arg■ arg 数值转字符串补齐长度■ QString 转换为 char■ QString 转换为 char *■ char * 转换为 QString■ char[] 转换为QString■ char[] 转换为QString■ QByteArray 转换为 QString ■ QByteArray■ QByteArray::…

关于Sneaky DogeRAT特洛伊木马病毒网络攻击的动态情报

一、基本内容 作为复杂恶意软件活动的一部分&#xff0c;一种名为DogeRAT的新开源远程访问特洛伊木马&#xff08;RAT&#xff09;主要针对位于印度的安卓用户发动了网络安全攻击。该恶意软件通过分享Opera Mini、OpenAI ChatGOT以及YouTube、Netfilx和Instagram的高级版本等合…

《PySpark大数据分析实战》-19.NumPy介绍ndarray介绍

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

饥荒Mod 开发(二三):显示物品栏详细信息

饥荒Mod 开发(二二)&#xff1a;显示物品信息 源码 前一篇介绍了如何获取 鼠标悬浮物品的信息&#xff0c;这一片介绍如何获取 物品栏的详细信息。 拦截 inventorybar 和 itemtile等设置字符串方法 在modmain.lua 文件中放入下面代码即可实现鼠标悬浮到 物品栏显示物品详细信…

适合引流源码声音鉴定神器网站源码,轻松吸引用户关注

源码介绍 声鉴卡HTML5网页源码&#xff0c;完整可运转&#xff0c;调用wx录音&#xff0c;自动判断声音属性&#xff0c;输出结果 安装教程 只需要把源码上传至主机空间就可以 支持上传二级目录访问&#xff01;提示一下&#xff1a;wxvx打开效果是最佳的源码里面生成二维码…

测试服务器带宽(ubuntu)

apt install python3 python3-pippip3 install speedtest-clispeestest-cli