当前位置: 首页 > news >正文

JS常用HOOK脚本

Hook定义

Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权

这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递

简单来说,就是把系统的程序拉出来变成我们自己执行代码片段

在 js 中,系统程序可以指浏览器API,也可以指代码中实现的一些方法等

Hook 步骤

1、寻找 hook 点

2、编写 hook 逻辑

3、调试

:最常用的是hook cookie response open 表单

常见hook脚本

COOKIE

(function() {//严谨模式 检查所有错误'use strict';var cookieTemp = "";Object.defineProperty(document, 'cookie', {set: function(val) {console.log('Hook捕获到cookie设置->', val);cookieTemp = val;return val;},get: function(){return cookieTemp;}});
})();

 HEADER

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

URL / XHR

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

FETCH

(function () {let fetchCache = Object.getOwnPropertyDescriptor(window, "fetch");Object.defineProperty(window, "fetch", {value: function (url) {console.log("Hook fetch url => ", url);debugger;return fetchCache.value.apply(this, arguments);}});
})();

EVAL

(function() {var eval_ = eval;// 重写 evalvar myeval = function(src) {if(src.includes('debugger')){src = src.replace(/debugger\s*;?/g, '')}return eval_(src);}var myeval_ = myeval.bind(null);myeval_.toString = function(){return eval_.toString();};Object.defineProperty(window, 'eval', {value: myeval_});
})();var a=eval+""
var _eval=eval
eval=function(arg){
console.log(arg)return _eval(arg)
}
eval.toString=function(){return "function eval() { [native code] }"}
var _old=Function.prototype.toString.call
Function.prototype.toString.call=function(arg){if(arg==eval)return "function eval() { [native code] }"return _old(arg);}
console.log(Function.prototype.toString.call(eval))

JSON

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

无限 DEBUGGER 

(function () {let constructorCache = Function.prototype.constructor;Function.prototype.constructor = function (string) {if (string === "debugger") {console.log("Hook constructor debugger!");return function () {};}return constructorCache(string);};
})();Function.prototype.constructor_bk = Function.prototype.constructor
Function.prototype.constructor = function(){if (arguments[0]=="debugger"){return function () {};}else{return Function.prototype.constructor_bk.apply(this, arguments)}
}

WEBSOCKET


(function () {let sendCache = WebSocket.prototype.send;WebSocket.prototype.send = function (data) {console.info("Hook WebSocket send => ", data);return sendCache(data);};
})();

 CONSOLE

(function () {let consoleCache = console.log;console.log = function (msg) {consoleCache("Hook console.log =>", msg);if(msg === "value") {debugger;}consoleCache(msg);};
})();

CREATEELEMENT


(function () {let createElementCache = document.createElement;document.createElement = function (tagName) {console.info("Hook createElement tagName => ", tagName);if(tagName === "div") {debugger;}return createElementCache(tagName);};
})();

GETELEMENTBYID

(function () {let getElementByIdCache = document.getElementById;document.getElementById = function (id) {console.info("Hook getElementById id => ", id);if (id === "spiderapi") {debugger;}return getElementByIdCache(id);};
})();

 SETATTRIBUTE

(function () {let setAttributeCache = window.Element.prototype.setAttribute;window.Element.prototype.setAttribute = function (name, value) {console.info("Hook setAttribute name => %s, value => %s", name, value);if (name === "value") {debugger;}return setAttributeCache(name, value);};
})();

 SETINTERVAL / SETTIMEOUT


(function () {let setIntervalCache = setInterval;setInterval = function (func, delay) {console.log("Hook setInterval func => %s, delay => %s", func, delay);debugger;return setIntervalCache(func, delay);};
})();(function () {let setTimeoutCache = setTimeout;setTimeout = function (func, delay) {console.log("Hook setTimeout func => %s, delay => %s", func, delay);debugger;return setTimeoutCache(func, delay);};
})();

原型链

// 备份原函数,并添加至原型链
String.prototype.split_ = String.prototype.split;
// hook split 方法
String.prototype.split = function(val){str = this.toString();debugger;return str.split_(val);
};
// 过检测
String.prototype.split.toString = function (){return "function split() { [native code] }";
}
  • hook 正则 test 方法,使其总是返回 true
    RegExp.prototype.test_ = RegExp.prototype.test;
    RegExp.prototype.test = function (val) {return true;
    };
    RegExp.prototype.test.toString = function () {return "function test() { [native code] }"
    }

相关文章:

  • C++中的封装,继承和多态
  • Python实现base64加密/解密
  • Vue 路由传递参数 query、params
  • Uber 提升 Presto 集群稳定性的 GC 调优方法
  • 4 最简单的 C 程序设计—顺序程序设计-4.6 顺序结构程序设计举例
  • ROS rospy和roscpp
  • Flink 命令行提交、展示和取消作业
  • Diffusers代码学习-多个ControlNet组合
  • 110.网络游戏逆向分析与漏洞攻防-装备系统数据分析-装备与技能描述信息的处理
  • 统一电荷控制模型与异质结场效应晶体管中的亚阈值电流
  • 面试题:谈谈你对乐观锁和悲观锁的理解?
  • 用链表实现的C语言队列
  • 行为树 Behavoir Tree入门教程|讲的最清晰的教程(大概)
  • 【介绍下R-tree,什么是R-tree?】
  • linux Ubuntu安装samba服务器与SSH远程登录
  • [PHP内核探索]PHP中的哈希表
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ➹使用webpack配置多页面应用(MPA)
  • isset在php5.6-和php7.0+的一些差异
  • Objective-C 中关联引用的概念
  • Spring框架之我见(三)——IOC、AOP
  • vuex 笔记整理
  • windows下使用nginx调试简介
  • 技术胖1-4季视频复习— (看视频笔记)
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端相关框架总和
  • 如何胜任知名企业的商业数据分析师?
  • 使用putty远程连接linux
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序 setData 学问多
  • 携程小程序初体验
  • 优化 Vue 项目编译文件大小
  • Prometheus VS InfluxDB
  • 整理一些计算机基础知识!
  • ​zookeeper集群配置与启动
  • ​用户画像从0到100的构建思路
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #1014 : Trie树
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (28)oracle数据迁移(容器)-部署包资源
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (区间dp) (经典例题) 石子合并
  • (一)为什么要选择C++
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • ./configure,make,make install的作用(转)
  • .net core Redis 使用有序集合实现延迟队列
  • .NET Core 成都线下面基会拉开序幕
  • .NET 的静态构造函数是否线程安全?答案是肯定的!