JS逆向实战——开发者工具检测

说明:仅供学习使用,请勿用于非法用途,若有侵权,请联系博主删除

作者:zhu6201976

一、背景

在JS逆向领域,Chrome开发者工具是核心,抓包、调试、看调用栈等都离不开它。可以说,逆向人员少了它,犹如失去左膀右臂,寸步难行。网站反爬人员自然深知该点。因此,必须想尽一切办法阻扰逆向人员使用开发者工具。或者需要付出一定的代价,如时间、精力成本。因此,针对开发者工具的检测和拦截,各种反调试应运而生。

二、常见检测和拦截方式

1.检测控制台输出

通过监测控制台输出可以检测到开发者工具的使用。下面的JavaScript代码会在控制台输出一些信息,网站可以通过检查这些信息来判断是否有人打开了开发者工具。

// 在控制台输出一些信息
console.log('Hello, developer!');

// 监听控制台输出
console.log = function(message) {
    if (message === 'Hello, developer!') {
        // 开发者工具被检测到,可以执行相应的处理
        alert('Developer tools detected!');
    }
};

 

2.检测页面元素变化

可以通过监测document对象的变化来检测开发者工具的打开。例如,监测document.documentElement的变化。

// 监听document元素变化
var lastElement = document.documentElement;
setInterval(function() {
    if (lastElement !== document.documentElement) {
        // 页面元素发生变化,可能是开发者工具被打开
        alert('Developer tools detected!');
    }
    lastElement = document.documentElement;
}, 1000); // 检查频率,可以根据需要调整

3.检测性能API

使用性能API可以检测页面加载性能,开发者工具的打开可能会导致性能数据的变化。

// 使用性能API
if (performance.mark) {
    performance.mark('start-detection');
    performance.measure('end-detection', 'start-detection');
    var entries = performance.getEntriesByName('end-detection');
    if (entries.length > 0) {
        // 开发者工具被检测到
        alert('Developer tools detected!');
    }
}

4.浏览器窗口尺寸变化

监听window对象的resize事件,检测浏览器窗口尺寸的变化。正常用户在使用浏览器时,窗口尺寸不太可能频繁变化。

window.addEventListener('resize', function() {
    // 窗口尺寸变化,可能是开发者工具被打开
    alert('Developer tools detected!');
});

5.按键F12的使用

监听keydown事件,检测是否按下了F12键。F12通常是打开浏览器开发者工具的快捷键。

document.addEventListener('keydown', function(event) {
    if (event.keyCode === 123) {
        // 按下了F12键,可能是开发者工具被打开
        alert('Developer tools detected!');
    }
});

6.鼠标右键的使用

监听contextmenu事件,检测是否右键菜单被触发。

document.addEventListener('contextmenu', function(event) {
    // 右键菜单被触发,可能是开发者工具被打开
    alert('Developer tools detected!');
    event.preventDefault(); // 阻止默认右键菜单
});

7.禁用复制黏贴快捷键

监听keydown事件,检测是否按下了复制(Ctrl+C、Command+C)或黏贴(Ctrl+V、Command+V)的快捷键。

document.addEventListener('keydown', function(event) {
    if ((event.ctrlKey || event.metaKey) && (event.keyCode === 67 || event.keyCode === 86)) {
        // 按下了复制或黏贴快捷键,可能是开发者工具被打开
        alert('Developer tools detected!');
    }
});

8.禁用控制台输出

禁用console.log等控制台方法,使得爬虫无法通过控制台输出数据。

// 禁用console.log
console.log = function() {
    alert('Console log is disabled!');
};

 

9.无限debugger的加入

在JavaScript代码中插入无限循环的debugger语句,这会导致页面在打开开发者工具时停止响应。

(function anonymous(
) {
    debugger
})

10.代码执行时间的判断

监测某段代码的执行时间,如果执行时间超过预定阈值,可能是爬虫工具在试图处理页面内容。

var startTime = new Date().getTime();

// 一些需要监测的代码

var endTime = new Date().getTime();
var executionTime = endTime - startTime;

if (executionTime > 1000) { // 设置阈值,单位为毫秒
    // 代码执行时间过长,可能是爬虫
    alert('Developer tools detected!');
}

三、某网盘站点反调试

url:aHR0cHM6Ly9jaGlsbHgudG9wL3YvY3FPcm5xUGFyZ1dQLw==

在页面加载过程中,加载了一个名为devtools-detector.min.js的文件,从文件名看,大概率就是检测拦截开发者工具,它到底如何检测的呢?

在这2000多行代码中,检测方式是多种方法的综合应用,得到最终权重,如图所示:

可以看到,该方法每0.5秒执行一次,反复校验上述8个函数的返回结果,经调试得知,最终它通过性能差异检测出正在使用开发者工具的,类似本文中常见检测和拦截方式第3点:检测性能API。

一旦检测到使用了开发者工具,会执行以下代码,反复刷新页面:

devtoolsDetector.addListener(function(isOpen, detail) {
    if (isOpen) {
        location.reload(true);
    }
});
devtoolsDetector.launch();

此处只需要在devtoolsDetector.launch()执行之前,将launch()置空,即可过反调试。

devtoolsDetector.launch=function(){}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

blast安装及简单使用

一、安装blast 1.Ubuntu环境 # 下载blast wget https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/2.9.0/ncbi-blast-2.9.0-x64-linux.tar.gz # 解压blast压缩包 tar -xzvf ncbi-blast-2.9.0-x64-linux.tar.gz # 测试 ./bin/blastp -h 这里就代表安装成功了,…

Android 架构 - 组件化

一、概念 组件化是对单个功能进行开发,使得功能可以复用。将多个功能组合起来就是一个业务模块,因此去除了模块间的耦合,使得按业务划分的模块成了可单独运行的业务组件。(一定程度上的独立,还是依附于整个项目中&…

如何免费搭建私人电影网站(三)

接上一篇文章: 网站模版上传到空间后就进行安装网站了操作如下图: 打开链接地址: 输入前面设置好的FTP密码 进入安装界面 点同意后下一步 需要填入数据库的账号和密码 返回虚拟主机界面进行设置 如下图点初始化 修改数据库的密码 然后…

Android Canvas状态save与restore,Kotlin

Android Canvas状态save与restore,Kotlin private fun f1() {val bitmap BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val canvas Canvas(bitmap)val paint Paint(Paint.ANTI_ALIAS_FLAG)paint.color Color.RED…

hyper-v ubuntu2204指定静态ip地址

虚拟机静态IP设置 虚拟机每次重新启动,都会动态分配IP,这导致我们无法使用一个固定的ip连接到虚拟机内部。解决该问题的最直接有效的办法就是给虚拟机绑定2张网卡,一张用于连接外网、一张用于连接内网。 init 0 关机,也可以从管…

C语言—每日选择题—Day57

指针相关博客 打响指针的第一枪:指针家族-CSDN博客 深入理解:指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 下面程序段() char *str[] {"ABC", "DEF", "GHI"}; puts(str[1]); A:A…

day49_代码生成器EasyCode

IDEA安装插件 easycode插件 使用 修改模板 因为默认模板有些不适用自己项目,所以需要修改,以下是我的模板json文件 生成了Controller,Service,Dao,Entity没有前后端交互的R,需要自己导入 在磁盘新建一个EasyCodeConfig.json,将以下代码赋值粘贴进去, 然后在idea的easycode插…

中央空调冷却塔循环水全自动加药装置PH电导率设备工作原理动画

一:全自动加药装置【概述】 随着在给水、排水处理过程中,常常投加各类化学药剂作为阻垢、杀菌灭藻、混凝、絮凝用,以达到净化水的目的。这些药剂有固体颗粒、液体,在投加过程中必须溶解、稀释及按配比定量投加方能取得最佳效果&am…

【SpringBoot快速入门】(2)SpringBoot的配置文件与配置方式详细讲解

之前我们已经学习的Spring、SpringMVC、Mabatis、Maven,详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例,上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动,从这一节开始,我们开始学习SpringBoot…

Leetcode 45 跳跃游戏 II

题意理解: 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。 还是从初始坐标i0的位置到达最后一个元素,但是问题不是能不能跳到,而是最少几步能跳到最后一个元素。 目标&…

鼠标响应突然不灵敏的检查方法

鼠标突然响应缓慢或者失灵,如下检测步骤: 1、首先排查电源问题,更换电池或者充电; 2、观察光标移动响应、鼠标左键响应、鼠标右键响应、鼠标滚轮等操作,哪些正常,哪些异常。 2、把鼠标接到别的机器上实验…

对Ubuntu20.04.2 mate 桌面 Brisk menu 组件的配置

Brisk Menu 让菜单在 mate 桌面上灵活布局, 那个会跳动的精灵还是挺不错的,适当处理后就得到了下面干净利索的桌面。 Ubuntu 安装时,在控制中心留有 plank reference 设置功能,让屏幕中底部的这些组件在不同位置摆放。当进行配置时…

算法分析与设计课后练习29

给定集合S{3, 7, 5, 9}, C 20, 近似参数 ε0.2, 写出 近似算法求解子集和问题的过程。

(备战2024)三天吃透Java面试八股文,面试通过率高达90%

什么样的求职者能够获得面试官的青睐?求职者需要准备哪些内容来面对形形色色的面试官?这两份资料是我在几十场面试中被面试官问到的问题,比其他复制粘贴的面试题强一百倍,堪称全网最强(我不太喜欢“全网最强”这样的字…

回顾丨2023 SpeechHome 第三届语音技术研讨会

下面是整体会议的内容回顾: 18日线上直播回顾 18日上午9:30,AISHELL & SpeechHome CEO卜辉宣布研讨会开始,并简要介绍本次研讨会的筹备情况以及报告内容。随后,CCF语音对话与听觉专委会副主任、清华大学教授郑方&#xff0c…

《PySpark大数据分析实战》-16.云服务模式Databricks介绍运行案例

📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…

node.js mongoose aggregate

目录 官方文档 简述 Aggregate的原型方法 aggregate进行操作 官方文档 Mongoose v8.0.3: Aggregate 简述 在 Mongoose 中,Aggregate 是用于执行 MongoDB 聚合操作的类。MongoDB 聚合操作是一种强大的数据处理工具,可以用于对集合中的文档进行变换和…

0基础学java-day21(网络编程)

一、网络的相关概念 1 网络通信 2 网络 3 ip 地址 4.ipv4 地址分类 5.域名 6 网络通信协议 7.网络通信协议 8.TCP 和 UDP 二、InetAddress 类 &Socket 1 相关方法 package com.hspedu.api;import java.net.InetAddress; import java.net.UnknownHostException;/*** …

系列二十八、如何在Oracle官网下载JDK的api文档

一、官网下载JDK的api文档 1.1、官网地址 https://www.oracle.com/java/technologies/javase-jdk21-doc-downloads.html 1.2、我分享的api.chm 链接:https://pan.baidu.com/s/1Bf55Fz-eMTErmQDtZZcewQ?pwdyyds 提取码:yyds 1.3、参考 https://ww…

STM32Fxx HAL库开发UART中断回调函数理解-中断回调函数流程-自己理解的

STM32HAL库中断服务函数调用过程有2种 第1种:可以直接在中断源对应的中断服务函数中编写我们想要的功能 具体是在void USART1_IRQHandler(void)函数写要执行的任务 正点原子是重新宏定义函数名,写法如下: 暂时忽略,…