Javascript 中的 debugger 拦截

news2024/11/29 22:43:20

debugger 指令,一般用于调试,在如浏览器调试执行环境中,可以在 JavaScript 代码中产生中断。

如果想要拦截 debugger,是不容易的,常用的函数替代、proxy 方法均对它无效,如:

 window.debugger = (function() {
     var origDebug = console.debugger;
     return function() {
     // do something before debugger statement execution
     origDebug.apply(console, arguments);
     // do something after debugger statement execution
     };
 })();

或者:

 var handler = {
   get: function(target, prop, receiver) {
     if (prop === 'debugger') {
       throw new Error("Debugger statement not allowed!");
     }
     return Reflect.get(target, prop, receiver);
   }
 };
 var obj = new Proxy({}, handler);

以上两方法,都无法对 debugger 生效。

而 debugger 有多种写法,如:

1、debugger;
2、Function("debugger").call();
3、eval("debugger");
4、setInterval(function(){debugger;},1000);
5、[].constructor.constructor('debugger')();

最原始的 debugger,想要拦截这一个单词,确实是似乎不可行,但它在现实中的使用频率是不高的,更多的是后面几种用法。

这是因为,debugger 更多的被人们用于反调试,比如用 JShaman 对 JavaScript 代码进行混淆加密后,就可以被加入多种不同的 debugger 指令用于反调试。

 

而上面展示的后 4 种用法,是可以在代码中进行拦截的。

Function("debugger").call()

拦截示例:

 Function_backup = Function;
 Function = function(a){
     if (a =='debugger'){
         console.log("拦截了debugger,中断不会发生1")
         return Function_backup("console.log()")
     }else{
         return Function_backup(a)
     }
 }
 Function("debugger").call();

运行效果:

eval("debugger")

拦截示例:

 eval_backup = eval;
 eval = function(a){
 if(a=='debugger'){
 console.log("拦截了debugger,中断不会发生0")
         return ''
     }else{
         return eval_backup(a)
     }
 }
 eval("debugger");

运行效果:

setInterval(function(){debugger;},1000)

拦截示例:

 var setInterval_backup = setInterval
 setInterval = function(a,b){
     if(a.toString().indexOf('debugger') != -1){
         console.log("拦截了debugger,中断不会发生2")
         return null;
     }
     setInterval_backup(a, b)
 }
 setInterval(function(){
     debugger;
 },1000);

 运行效果:

[].constructor.constructor('debugger')()

拦截示例:

 var constructor_backup = [].constructor.constructor;
 [].constructor.constructor = function(a){
     if(a=="debugger"){
         console.log("拦截了debugger,中断不会发生3");
     }else{
         constructor_backup(a);
     }
 }
 try {
     [].constructor.constructor('debugger')();
 } catch (error) {
     console.error("Anti debugger");
 }

运行效果

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

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

相关文章

chrono学习(一)

我想用chrono进行沙土的仿真,首先学习demo_GPU_ballCosim.cpp,这个例子仿真了一些沙土的沉降过程。 首先,运行编辑完成的文件demo_GPU_ballCosim: (base) eowyneowyn-MS-7D20:~/build_chrono/bin$ ./demo_GPU_ballCosim 运行完得…

Laravel 表单验证器的常用的2种使用方法

1、使用控制器的 validate 方法进行参数验证 场景一:前后端未分离 /*** 保存一篇新的博客文章。** param Request $request* return Response*/ public function store(Request $request) {$this->validate($request, [title > required|unique:posts|max:2…

plumelog介绍与应用-一个简单易用的java分布式日志系统

官方文档:http://www.plumelog.com/zh-cn/docs/FASTSTART.html 简介 无代码入侵的分布式日志系统,基于log4j、log4j2、logback搜集日志,设置链路ID,方便查询关联日志基于elasticsearch作为查询引擎高吞吐,查询效率高全…

YOLOv5 如何计算并打印 FPS

文章用于学习记录 YOLO v5 FPS计算方法修改对应自己数据集的 yaml 文件以及训练好的 pt 文件以及batch-size1, FPS 1000ms/(0.311.91.0)pre-process:图像预处理时间,包括图像保持长宽比缩放和padding填充,通道变换(HWC->CHW&a…

vr健康管理服务情景化教学弥补现代医学教学中的诸多不足之处

高职高专临床医学院校以培养岗位胜任力为目的,该专业是一门专业性、实践性较强的医学学科,要求培养出来的学生具有较强的临床实践能力,医学生所学的全部知识,都应与实践相结合,解决临床的实际问题,为患者解…

sql server 备份到网络共享

场景:sql server服务器A将数据库备份文件备份到服务器B 1)服务器B创建共享目录 这里我将 D:\ProDbBak 共享,并且Everyone完全控制 2)sql server服务器A能够访问服务器B共享目录,并且能完全控制 3)修改服务…

GPT-3在化学中进行低数据发现是否足够?

今天介绍一份洛桑联邦理工学院进行的工作,这份工作被发表在化学期刊预印本网站上。 对于这份工作,有兴趣的朋友可以通过我们的国内ChatGPT镜像站进行测试使用,我们的站点并没有针对特定任务进行建设,是通用性质的。 化学领域进行…

QTday1(实现图形化界面、QT工程项目各文件初始程序的介绍)

1.实现图形化界面 #include "widget.h" #include "ui_widget.h" #include <QDebug> //输出函数对应的头文件 #include <QIcon>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(…

Ansible学习笔记11

Command和Shell模块&#xff1a; 两个模块都是用于执行Linux命令的&#xff0c;这个对于命令熟悉的工程师来说&#xff0c;用起来非常high。 Shell模块跟Command模块差不多&#xff08;Command模块不能执行一类$HOME、> 、<、| 等符号&#xff0c;但是Shell是可以的。&…

MySQL函数和约束

MySQL常见函数 字符串常见函数 # concat : 字符串拼接 select concat(Hello , MySQL); # lower : 全部转小写 SELECT LOWER(Hello); # upper : 全部转大写 SELECT UPPER(hello); # lpad : 左填充 SELECT LPAD(hello,10,0); # rpad : 右填充 SELECT RPAD(hello,10,0); # trim…

K8S容器OOM killed排查

背景 数据服务平台南海容器k8s设置的内存上限2GB&#xff0c;多次容器被OOM killed。 启动命令 java -XX:MaxRAMPercentage70.0 -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/apps/logs/ ***.jar排查过程 1 当收到实例内存超过95%告警时&#xff0c;把jvm进程堆dump下…

kotlin 转 Java

今天突然想研究下有些kotlin文件转为Java到底长什么样&#xff0c;好方便优化kotlin代码&#xff0c;搞了半天发现一个非常简单的Android Studio或者Intellij idea官方插件Kotlin&#xff0c;Kotlin是插件的名字&#xff0c;真是醉了&#xff1b; 这里以AS为例&#xff0c;使用…

git在windows上安装

介绍git工具在windows上如何安装 git官网下载地址 1.1、下载 https://github.com/git-for-windows/git/releases/download/v2.36.0.windows.1/Git-2.36.0-64-bit.exe自行选择版本&#xff0c;这里我选择的是 Git-2.36.0-64-bit这个版本 1.2、安装 安装路径选择英文且不带空格…

九、适配器模式

一、什么是适配器模式 适配器模式&#xff08;Adapter&#xff09;的定义如下&#xff1a;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 适配器模式&#xff08;Adapter&#xff09;包含以下主要角色&…

OpenVPN服务器

目录 一、OpenVPN是什么&#xff1f; 二、OpenVPN连接建立的过程 三、数据包远程传输处理过程&#xff08;自我理解&#xff09; 四、OpenVPN实验案例 4.1生成OpenVPN所需证书文件 4.2配置OpenVPN服务器 4.3配置OpenVPN客户端 4.4在远程客户端windows 10上进行测试 一、OpenVPN…

HTML5之drawImage函数

参数说明&#xff1a; drawImage(image, x, y) //按原图片大小绘制。 drawImage(image, x, y, width, height) //按指定大小绘制。 drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) //常用于图片裁剪。 其中&#xff1a…

实战:基于卷积的MNIST手写体分类

前面实现了基于多层感知机的MNIST手写体识别&#xff0c;本章将实现以卷积神经网络完成的MNIST手写体识别。 1. 数据的准备 在本例中&#xff0c;依旧使用MNIST数据集&#xff0c;对这个数据集的数据和标签介绍&#xff0c;前面的章节已详细说明过了&#xff0c;相对于前面章…

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…

C++笔记之临时变量与临时对象与匿名对象

C笔记之临时变量与临时对象与匿名对象 code review! 文章目录 C笔记之临时变量与临时对象与匿名对象1.C中的临时变量指的是什么&#xff1f;2.C中的临时对象指的是什么&#xff1f;3.C中临时对象的作用是什么&#xff1f;什么时候要用到临时对象?4.给我列举具体的例子说明临…

idm下载视频

idm下载视频 安装后 地址为&#xff1a; 链接&#xff1a;下载地址 提取码&#xff1a;fgzv 安装后 设置浏览器插件 完成 参考文章