【JS逆向】爬虫必备hook脚本

news/2025/1/6 11:50:39/文章来源:https://www.cnblogs.com/o-O-oO/p/18651997

特别声明:本公众号文章只作为学术研究,不用于其它不法用途;如有侵权请联系作者删除。

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

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

1、客户端拥有JS的最高解释权,可以决定在任何时候注入JS,而服务器无法阻止或干预。服务端只能通过检测和混淆的手段,另 Hook 难度加大,但是无法直接阻止。

2、除了上面的必要条件之外,还有一个条件。就是 JS 是一种弱类型语言,同一个变量可以多次定义、根据需要进行不同的赋值,而这种情况如果在其他强类型语言中则可能会报错,导致代码无法执行。js 的这种特性,为我们 Hook 代码提供了便利。

Hook步骤:

1、寻找hook的点

2、编写hook逻辑

3、调试

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

Hook Request Header

(function () {let headerCache = window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {console.log("Hook set header %s => %s", key, value);if (key === "value") {debugger;}return headerCache.apply(this, arguments);};
})();

Hook XHR

(function () {let openCache = window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open = function (method, url) {console.log("Hook xhr method => %s, url => %s", method, url);if (url.indexOf("value") !== -1) {debugger;}return openCache.apply(this, arguments);};
})();

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

Hook JSON.stringify

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

Hook JSON.parse

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

Hook 无限 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 () {let setIntervalCache = setInterval;setInterval = function (func, delay) {if (func.toString().indexOf("debugger") !== -1) {console.log("Hook setInterval debugger!");return function () {};}return setIntervalCache(func, delay);};
})();(function () {let setTimeoutCache = setTimeout;setTimeout = function (func, delay) {if (func.toString().indexOf("debugger") !== -1) {console.log("Hook setTimeout debugger!");return function () {};}return setTimeoutCache(func, delay);};
})();(function () {let evalCache = window.eval;window.eval = function (string) {if (string.includes("debugger")) {console.log("Hook eval debugger!");}return evalCache(string.replace(/debugger\s*;?/g, ""));};window.eval.toString = function () {return evalCache.toString();};
})();

Hook WebSocket


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

Hook console

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

Hook eval

(function () {let evalCache = window.eval;window.eval = function (string) {console.log("Hook eval =>", string);debugger;return evalCache(string);};window.eval.toString = function () {return evalCache.toString();};
})();

Hook onbeforeunload

提示

onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发。Hook 此事件可阻断跳转,使其留在当前页面,通常用来应对网站打开 F12 就跳转页面的情况。

(function () {window.onbeforeunload = function () {console.log("Hook window.onbeforeunload.");debugger;return false;};
})();

Hook Canvas

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

Hook createElement

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

Hook getElementById

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

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

Hook setInterval

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

Hook setTimeout

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

原创 Dang Python爬虫大数据可视化

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

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

相关文章

OpenEuler安装MongoDB并配置访问密码.241127

1. 下载MongoDB、安装 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.18.tgz tar zxvf mongodb-linux-x86_64-rhel80-4.4.18.tgz移动到/home路径下 mv mongodb-linux-x86_64-rhel80-4.4.18 /home cd /home mv mongodb-linux-x86_64-rhel80-4.4.…

集成规范CICD.241127

集成方式说明a.用户向Gitlab提交代码,代码中包含 Dockerfile, JenkinsFile文件。 b.Jenkins监听Gitlab代码库的推送和变更事件 c.Jenkins调用maven插件对源码进行编译打包 d.Jenkins调用docker工具根据Dockerfile文件生成镜像,并推送镜像到Docker Registry仓库(Habor) e.Je…

比较文学的学科特色

学科历史和理论建构部分,小心名词解释一、比较文学的研究对象是什么? 比较文学的研究对象是跨民族、跨语言、跨文化界限和跨学科的各种文学关系。各种文学关系的具体内涵:事实联系中西进:《源氏物语》与白乐天 田中隆昭:《源氏物语》与《长恨歌传》等唐代传奇的表现方法--从…

ENVI魔术棒Magic wand

(1)工具栏中打开ROI Tool,按住Ctrl+鼠标左键,在水域地方点击鼠标。 (2)打开魔术棒Magic Wand工具栏,同时也在图像上选择了一部分区域。 注:按住Ctrl键可以同时识别多个地方。

HomeAssistant安装教程(docker篇)

HomeAssistant安装教程(docker篇)23年流感突然想起当年的一篇文章(下) 部署homeassitant下载docker镜像javascriptdocker pull homeassistant/home-assistantsJavaScript Copy 创建并运行容器javascriptdocker run -d --name="hass" -e "TZ=Asia/Shanghai&q…

周选择器 vxe-date-picker 自定义一周开始日

周选择器 vxe-date-picker 自定义一周开始日 官网:https://vxeui.com 周一开始<template><div><vxe-date-picker v-model="val1" placeholder="周选择,周一开始" type="week" :start-day="1"></vxe-date-picker…

vue 周选择器 vxe-date-picker 自定义左侧快捷选择模板

vue 周选择器 vxe-date-picker 自定义左侧快捷选择插槽模板 官网:https://vxeui.com<template><div><vxe-date-picker ref="datePickerRef" v-model="val1" type="week"><template #left><vxe-button-group vertica…

TLS协议原理一

1. TLS协议概述 TLS协议包含多个子协议:应用数据协议(Application Data Protocol): 用于密文传输 告警协议(Alert Protocol):在TLS连接中,如果发生了错误或异常情况,TLS协议会使用Alert Protocol发送警报信息,以通知对方发生了什么问题。 握手协议(Handshake Protocol):用…

把微软bing的背景图自动更换为群晖DSM7.X登录界面

把微软bing的背景图自动更换为群晖DSM7.X登录界面 1、打开控制面板,找到“登录门户”,在DSM标签点编辑:2、在背景处打勾,保存;3、点控制面板,任务计划,新增,计划的任务,用户定义的脚本;4、任务名称写BingWallpaper,用户账号要改成root,然后在“已启动处打勾;5、在…

C++ 算法库(一)

1. OSQP‌OSQP(Operator Splitting Quadratic Programming)是一个用于求解凸二次规划(Convex Quadratic Programming)问题的求解器‌。它基于“算子分裂”的优化方法,将二次规划问题分解为一系列小的子问题,并通过迭代的方式逐步求解。osqp-eigen是对OSQP库的Eigen接口封…

BUGAWAY算法小抄-差分数组

BUGAWAY算法小抄-差分数组 什么是差分数组? 差分数组的思想是通过对原始数组进行处理,得到一个新的数组(差分数组),利用该数组来高效地进行区间更新操作。具体来说,差分数组记录的是相邻元素之间的差值,而不是原始数组的元素本身。 差分数组的原理 1. 差分数组的构造: …

emby美化后续折腾

GitHub - Nolovenodie/emby-crx: Emby 增强/美化 插件 (适用于 Chrome 内核浏览器 / EmbyServer)emby美化尝试皮蛋熊 2023-10-18/1 评论/2 点赞/6151 阅读/8117 字10/18温馨提示: 本文最后更新于 2023-10-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到…