安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳(unpacking)指的是去除应用程序中加固或保护措施的过程,使得可以访问应用程序的原始代码或者数据。脱壳的重要性:
- 分析恶意软件:很多恶意软件采用加壳技术来隐藏其真实行为。脱壳后,安全研究人员可以更容易地理解恶意代码的实现方式、传播途径及其攻击目标,帮助开发有效的防御策略。
- 漏洞分析:应用程序可能存在各种漏洞,比如远程代码执行、信息泄露等。通过脱壳,可以查看原始代码,分析潜在漏洞,进而发现可能的攻击面。
- 破解保护机制:很多安卓应用为了保护自己的知识产权或防止被修改,会采用加壳技术或其他防篡改机制。逆向工程和脱壳可以帮助研究者绕过这些保护,获取应用的原始功能或源代码。
- 提升安全性:通过脱壳并分析应用的源代码,可以发现其安全缺陷并加以修复。这对安卓开发者来说,能够提升自己的应用在面对恶意攻击时的安全性。
- 反作弊:一些游戏或者应用采用加壳和加密技术来防止被作弊或修改。脱壳能够帮助研究者或者开发者对抗这些作弊行为,确保应用的公平性和安全性。
脱壳技术一般涉及到一些技巧,比如使用动态调试工具(如Frida, Xposed等)、静态分析工具(如IDA Pro, Ghidra等)以及一些专用的脱壳工具(如UnpackMe, Apktool等)。掌握这些工具和技巧对安卓逆向工程师来说非常重要。
1.讲述Android开发中dex文件加载的class loader机制,特别是pass class loader在加载未加壳类中的作用
在 Android 开发中,Dex(Dalvik Executable)文件是应用程序的核心,它包含了字节码,供 Android 的虚拟机(Dalvik VM 或 ART)执行。Android 系统中的 ClassLoader 是加载这些字节码并将其转换为 Java 类的关键组件。理解 ClassLoader 的工作机制,尤其是 Pass ClassLoader,对于深入理解 Android 逆向与脱壳过程具有重要意义。
1. Android 的 ClassLoader 机制概述
Android 使用多种 ClassLoader 来加载不同类型的类。默认情况下,Android 使用的是 PathClassLoader 来加载应用程序的 dex 文件。它通过以下几个步骤工作:
- 系统 ClassLoader (
BootClassLoader):它负责加载 Android 系统核心库(如android.*和java.*等)。 - 应用 ClassLoader (
PathClassLoader):负责加载应用程序的主dex文件。 - 用户 ClassLoader (
DexClassLoader):在一些高级应用中,允许动态加载外部的dex文件(例如插件化框架)。
每个 ClassLoader 都有自己的类加载路径,它们通过层层委托的方式来加载类。委托模式意味着一个 ClassLoader 会请求父 ClassLoader 加载类,直到找到该类为止。如果父 ClassLoader 不能加载该类,它才会尝试自行加载。
2. Pass ClassLoader 的作用
Pass ClassLoader 是一个特殊的类加载器,它主要用于 加载未经过加壳或加密保护的类,特别是在进行逆向分析或破解时。为了更好地理解 Pass ClassLoader,我们需要先了解一些加壳和加密的基本概念。
在一些保护措施中,开发者可能会对应用程序的 dex 文件进行加壳或加密。加壳后,dex 文件中的字节码被封装在某种保护的形式中,需要特定的脱壳工具或机制才能提取和加载原始的类。
Pass ClassLoader 的作用:
- 绕过壳层:对于加壳的
dex文件,Pass ClassLoader 可以直接加载那些未经过加密保护的类,避免常规的ClassLoader在加载时受壳层的干扰。 - 绕过保护:在一些反调试、反篡改或者加密的情况下,Pass ClassLoader 可以让逆向人员加载未加密的类代码,帮助分析原始逻辑。
- 实现代码注入:在 Android 逆向过程中,有时会通过 Pass ClassLoader 动态地注入新的类或修改已有类,尤其是做插件化开发时。它能够动态加载外部的
dex文件,支持模块化的加载机制。
3. Pass ClassLoader 在脱壳过程中的作用
在一些典型的脱壳和逆向过程中,Pass ClassLoader 是必不可少的工具。具体来说,它在脱壳中的作用体现在以下几个方面:
- 动态加载未加壳类:在很多情况下,应用的某些类(尤其是加壳的
dex文件)会被包装或加密,不能直接用常规的ClassLoader加载。这时,使用Pass ClassLoader就能绕过加密保护,直接加载未加壳的类。 - 绕过防篡改机制:有些应用在加载过程中会使用复杂的防篡改机制,比如校验
dex文件的完整性或签名。Pass ClassLoader 通过绕过这些机制,能够加载原始类,供分析和修改。 - 支持动态调试与注入:逆向分析人员可以利用
Pass ClassLoader动态注入自己的类或修改已有类,实现代码修改和调试。这对于破解和动态分析非常有用。
4. 实际应用中的 Pass ClassLoader
在实际的 Android 逆向过程中,Pass ClassLoader 主要应用于以下场景:
- 加壳应用的逆向分析:对于通过加壳或加密保护的应用,通过脱壳可以恢复其原始的
dex文件。而在一些加壳的应用中,Pass ClassLoader用于加载脱壳后的类,使得它们可以被执行和分析。 - 恶意软件分析:恶意软件分析时,攻击者常通过加壳技术隐藏真实的攻击代码。研究人员使用
Pass ClassLoader绕过壳层,将恶意代码加载到内存中,以便分析其行为。 - 插件化框架的实现:一些 Android 插件化框架(例如
RePlugin,Xposed)使用Pass ClassLoader来动态加载外部dex文件和插件,支持运行时动态扩展和模块化。
5. 小结
在 Android 开发与逆向过程中,ClassLoader 是管理 dex 文件加载的核心组件,而 Pass ClassLoader 则是绕过加壳和加密保护、加载原始类的重要工具。在逆向分析、恶意软件分析、漏洞挖掘等场景中,理解并灵活应用 Pass ClassLoader,可以帮助研究人员突破保护措施,更加高效地进行代码审计和漏洞分析。
相关学习链接:
https://segmentfault.com/a/1190000008491597
https://blog.csdn.net/u014634338/article/details/81434327
https://segmentfault.com/a/1190000013469223
2.class loader的加载流程、脱壳点及pass list对象的重要性,展示了如何验证class loader类型及获取其加载的dex文件信息
1. ClassLoader 的加载流程
在 Android 中,ClassLoader 主要负责将字节码(即 .dex 文件中的内容)转换成类,并将其加载到 JVM 或 ART 中。类加载器的加载过程遵循以下的流程:
1.1 类加载的步骤
- 查找类:当程序请求加载一个类时,
ClassLoader会首先查找其缓存中是否已有该类。如果存在,就直接返回该类。如果没有,它会进入加载过程。 - 委托给父类加载器:按照 委托机制(父类优先),如果当前
ClassLoader没有加载该类,它会将加载请求委托给父加载器处理。父类加载器会继续递归地查找该类。 - 加载类:如果父加载器无法加载该类,当前加载器才会尝试从指定的路径(通常是
.dex文件或.jar包)中加载类。 - 字节码解析:在
ClassLoader找到类的字节码之后,它会将字节码解析为Class对象,放到内存中。此时类加载完成,可以通过反射等方式进行访问。
1.2 ClassLoader的层次结构
Android 中的类加载器是按照父子关系来进行层次化管理的:
- 系统 ClassLoader(BootClassLoader):负责加载 Java 核心类库(如
java.lang.*和android.*等)。 - 应用 ClassLoader(PathClassLoader):负责加载应用程序的主
.dex文件。 - 插件类加载器(DexClassLoader):在一些动态加载的场景下(如插件化框架),会用
DexClassLoader来加载外部的dex文件。
2. 脱壳点与 Pass ClassLoader 的重要性
2.1 脱壳点
在 Android 应用的逆向工程过程中,很多开发者会使用一些加壳工具(如 ProGuard、DexGuard、AndResGuard 等)来对 .dex 文件进行加密或加壳,防止代码被轻易反编译或篡改。脱壳的目的是恢复加密或加壳后的真实 .dex 文件,以便进一步分析。
脱壳的常见手段:
- 静态脱壳:使用反编译工具(如 IDA、Ghidra)静态地分析壳层和加密算法,直接恢复
dex文件。 - 动态脱壳:通过动态调试工具(如 Frida、Xposed)分析程序的运行时行为,提取真实的
dex文件。
脱壳点:
- 解密算法:很多加密的
dex文件会包含一段加密或解密的逻辑。脱壳点一般会在该解密算法的关键步骤或函数中。 - 类加载器修改:一些加壳工具通过修改类加载器的行为来保护
dex文件,逆向人员需要在加载类的过程中发现解密或还原dex文件的点。
2.2 Pass ClassLoader 的作用
Pass ClassLoader 是一个特殊的类加载器,用于在加载未加壳类时绕过一些防护机制。它的作用在于:
- 绕过加壳保护:当
dex文件经过加壳加密时,Pass ClassLoader可以帮助绕过壳层,直接加载未加壳的类。 - 动态分析:通过
Pass ClassLoader可以帮助分析应用的实际行为,尤其是用于绕过反篡改机制,进行恶意软件分析。
3. 如何验证 ClassLoader 类型及获取加载的 Dex 文件信息
在 Android 逆向工程过程中,验证 ClassLoader 类型并获取其加载的 .dex 文件信息是一个关键步骤。以下是一些实用的技巧和方法。
3.1 验证 ClassLoader 类型
要验证当前类是通过哪个 ClassLoader 加载的,通常可以利用 Java 的反射机制来获取当前类的加载器。
ClassLoader classLoader = MyClass.class.getClassLoader();
Log.d("ClassLoader", "ClassLoader: " + classLoader);
这将返回一个 ClassLoader 对象,表示当前类的加载器。通过判断其类型,可以知道是否为 PathClassLoader、DexClassLoader 或者 BaseDexClassLoader(Android 中的父类)。
3.2 获取加载的 Dex 文件信息
要获取当前 ClassLoader 加载的 .dex 文件信息,可以通过以下步骤:
- PathClassLoader:对于应用的主
dex文件,可以通过反射或直接访问PathClassLoader的构造函数来获取它的加载路径。
PathClassLoader pathClassLoader = (PathClassLoader) MyClass.class.getClassLoader();
Field pathListField = PathClassLoader.class.getDeclaredField("pathList");
pathListField.setAccessible(true);
Object pathList = pathListField.get(pathClassLoader);Field dexElementsField = pathList.getClass().getDeclaredField("dexElements");
dexElementsField.setAccessible(true);
Object[] dexElements = (Object[]) dexElementsField.get(pathList);for (Object dexElement : dexElements) {Field dexFileField = dexElement.getClass().getDeclaredField("dexFile");dexFileField.setAccessible(true);Object dexFile = dexFileField.get(dexElement);Log.d("DexFile", "Loaded dex: " + dexFile);
}
这段代码会获取并打印出通过 PathClassLoader 加载的 .dex 文件的信息。
- DexClassLoader:如果是使用
DexClassLoader加载的dex文件,可以直接获取其dex路径信息。一般来说,DexClassLoader加载的dex文件路径会通过构造函数传入。
DexClassLoader dexClassLoader = (DexClassLoader) MyClass.class.getClassLoader();
String dexPath = dexClassLoader.getDexPath();
Log.d("DexClassLoader", "Dex path: " + dexPath);
这将打印出 DexClassLoader 加载的 .dex 文件的路径。
3.3 动态加载 Dex 文件
在一些动态分析的场景下,可以利用 DexClassLoader 动态加载一个外部的 dex 文件:
DexClassLoader dexClassLoader = new DexClassLoader(dexPath, optimizedDirectory, null, context.getClassLoader());
Class<?> loadedClass = dexClassLoader.loadClass("com.example.DynamicClass");
通过这种方式,加载一个外部 dex 文件,可以动态地加载并执行其中的类。
4. 总结
- ClassLoader 流程:类加载器通过查找和委托机制加载类,分为系统加载器、应用加载器、插件加载器等。
- 脱壳点和 Pass ClassLoader:在加壳应用中,Pass ClassLoader 用于绕过加壳保护,直接加载未加壳类,尤其在动态调试与恶意软件分析中非常重要。
- 验证 ClassLoader 和加载的 Dex 信息:通过反射和直接访问类加载器内部字段,能够验证当前类加载器的类型并获取加载的
dex文件信息。
这些方法对于 Android 逆向工程、漏洞分析以及动态调试和脱壳过程非常有帮助。
3.提及自定义class loader和found class在加载过程中的作用,深入具体实现细节
1. 自定义 ClassLoader
在 Android 或 Java 中,我们可以创建自定义的 ClassLoader 来修改或扩展默认的类加载行为。自定义 ClassLoader 通常用于以下几种场景:
- 动态加载外部
.dex文件:用于插件化框架或动态加载模块。 - 绕过安全性措施:比如绕过加壳保护、篡改默认的类加载机制等。
- 动态代码注入与修改:通过修改
ClassLoader的行为,注入自己的类或者修改已有类。
自定义 ClassLoader 的关键在于重写 findClass() 和 loadClass() 方法。这里是 Java 中 ClassLoader 加载类的基本原理和我们如何自定义加载过程。
2. ClassLoader 的默认加载流程
loadClass():每个ClassLoader都会重写loadClass()方法。loadClass()方法会首先检查类是否已经加载,如果已加载,则直接返回该类。如果没有加载,它会调用findClass()来查找并加载类。findClass():findClass()是ClassLoader类的一个抽象方法,我们可以在自定义的ClassLoader中实现该方法。findClass()负责实际的类加载工作,它通过byte[]数据来创建Class对象。- 委托机制:
ClassLoader是基于父类委托的机制来加载类的。也就是说,当一个ClassLoader请求加载类时,它会首先委托给父ClassLoader来加载类。如果父ClassLoader无法加载类,它才会自行加载。
3. 自定义 ClassLoader 的实现
下面是一个简单的自定义 ClassLoader 的例子,用于加载外部 dex 文件中的类:
public class MyClassLoader extends ClassLoader {private String dexPath;public MyClassLoader(String dexPath, ClassLoader parent) {super(parent); // 使用系统的默认类加载器作为父加载器this.dexPath = dexPath;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {// 获取 dex 文件中的字节码数据byte[] classData = loadClassData(name);if (classData == null) {throw new ClassNotFoundException("Class " + name + " not found in dex file.");}// 将字节码数据转换成 Class 对象return defineClass(name, classData, 0, classData.length);}private byte[] loadClassData(String className) {// 将类名转换为对应的文件路径String filePath = dexPath + "/" + className.replace('.', '/') + ".dex";try (InputStream inputStream = new FileInputStream(filePath)) {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();int data;while ((data = inputStream.read()) != -1) {byteArrayOutputStream.write(data);}return byteArrayOutputStream.toByteArray();} catch (IOException e) {e.printStackTrace();return null;}}
}
在这个例子中,我们重写了 findClass() 方法来加载指定路径下的 .dex 文件中的类,并通过 defineClass() 方法将字节码转换成 Class 对象。
4. findClass() 和 defineClass()
-
findClass():该方法是自定义ClassLoader中最重要的部分,它负责查找并加载字节码。它的输入是类名,通过特定的逻辑获取字节码后,调用defineClass()来完成类的加载。 -
defineClass():该方法将字节码(byte[])转换为Class对象。它的签名如下:protected Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatErrorname:类的全名(包括包名)。b:字节码数组。off:字节码数组的起始偏移。len:字节码的长度。
defineClass()会创建一个新的Class对象,并加载到 JVM 中,之后可以通过该类对象进行反射操作。
5. foundClass 在加载过程中的作用
foundClass 并不是 ClassLoader 中的标准方法,但它的概念通常用于描述在加载类的过程中,ClassLoader 查找到了目标类,并将其作为 Class 对象返回。
在自定义 ClassLoader 中,findClass() 方法返回的就是 “found class”。而在 loadClass() 方法中,如果父类 ClassLoader 能够找到并加载目标类,就直接返回该类,否则会委托给 findClass() 方法。
以下是一个简化的过程说明:
- 请求加载类:如果请求加载的类尚未加载,
loadClass()会调用findClass()。 findClass()查找类:findClass()会尝试根据类名找到该类的字节码数据。- 返回找到的类(found class):如果成功找到并加载字节码,就通过
defineClass()返回一个Class对象。这时,类被认为是“已找到”(found)并成功加载。
6. 验证 ClassLoader 类型及加载的 Dex 信息
验证当前类是由哪个 ClassLoader 加载,可以使用 getClassLoader() 方法。例如:
ClassLoader classLoader = MyClass.class.getClassLoader();
Log.d("ClassLoader", "ClassLoader: " + classLoader);
这会输出当前类加载器的类型(如 PathClassLoader、DexClassLoader 或自定义的 ClassLoader)。如果你想进一步分析加载的 .dex 文件或验证具体的路径,可以使用反射来获取更详细的信息,如:
Field pathListField = PathClassLoader.class.getDeclaredField("pathList");
pathListField.setAccessible(true);
Object pathList = pathListField.get(classLoader);Field dexElementsField = pathList.getClass().getDeclaredField("dexElements");
dexElementsField.setAccessible(true);
Object[] dexElements = (Object[]) dexElementsField.get(pathList);for (Object dexElement : dexElements) {Field dexFileField = dexElement.getClass().getDeclaredField("dexFile");dexFileField.setAccessible(true);Object dexFile = dexFileField.get(dexElement);Log.d("DexFile", "Loaded dex: " + dexFile);
}
7. 总结
- 自定义
ClassLoader:通过重写findClass()和loadClass()方法,我们可以控制类加载的具体过程,包括加载外部dex文件,或修改加载机制。 findClass()的角色:findClass()是自定义ClassLoader中查找类并返回字节码的关键方法,它将字节码数据转换为Class对象。foundClass:指的是ClassLoader成功加载并返回的类。在加载过程中,类可能会经过多次查找,直到找到并返回给请求者。- 验证类加载器类型和加载的
dex文件:可以通过反射获取当前ClassLoader和它加载的dex文件路径,帮助进行调试和分析。
通过自定义 ClassLoader,我们可以更灵活地控制类的加载过程,尤其是在插件化框架、动态代码注入和逆向分析等领域,这些技巧非常有用。
相关文章:
安卓逆向之脱壳-认识一下动态加载 双亲委派(一)
安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳(unpacking)指的是去除应用程序中加固或保护措施的过程,使得可以访问应用程序的原始代码或者数据。脱壳的重要性: 分析恶意软件:很多恶意软件…...
64位的谷歌浏览器Chrome/Google Chrome
64位的谷歌浏览器Chrome/Google Chrome 在百度搜索关键字:chrome,即可下载官方的“谷歌浏览器Chrome/Google Chrome”,但它可能是32位的(切记注意网址:https://www.google.cn/...., 即:google.cnÿ…...
马尔科夫模型和隐马尔科夫模型区别
我用一个天气预报和海藻湿度观测的比喻来解释,保证你秒懂! 1. 马尔可夫模型(Markov Model, MM) 特点:状态直接可见 场景:天气预报(晴天→雨天→阴天…)核心假设: 下一个…...
Python NumPy(7):连接数组、分割数组、数组元素的添加与删除
1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组(列方向)vstack竖直堆叠序列中的数组(行方向) 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…...
【LLM】deepseek多模态之Janus-Pro和JanusFlow框架
note 文章目录 note一、Janus-Pro:解耦视觉编码,实现多模态高效统一技术亮点模型细节 二、JanusFlow:融合生成流与语言模型,重新定义多模态技术亮点模型细节 Reference 一、Janus-Pro:解耦视觉编码,实现多模…...
2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据
2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据.ziphttps://download.csdn.net/download/2401_84585615/89575931 https://download.csdn.net/download/2401_84585615/89575931 2000至2021年,全国各地级市的专利申请与获得情况呈现出显著…...
51单片机(STC89C52)开发:点亮一个小灯
软件安装: 安装开发板CH340驱动。 安装KEILC51开发软件:C51V901.exe。 下载软件:PZ-ISP.exe 创建项目: 新建main.c 将main.c加入至项目中: main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…...
数仓ETL测试
提取,转换和加载有助于组织使数据在不同的数据系统中可访问,有意义且可用。ETL工具是用于提取,转换和加载数据的软件。在当今数据驱动的世界中,无论大小如何,都会从各种组织,机器和小工具中生成大量数据。 …...
240. 搜索二维矩阵||
参考题解:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf 将矩阵旋转45度,可以看作一个二叉搜索树。 假设以左下角元素为根结点, 当target比root大的时候ÿ…...
反向代理模块b
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
Kafka的内部通信协议
引言 kafka内部用到的常见协议和优缺点可以看看原文 Kafka用到的协议 本文奖详细探究kafka核心通信协议和高性能的关键 网络层通信的实现 基于 Java NIO:Kafka 的网络通信层主要基于 Java NIO 来实现,这使得它能够高效地处理大量的连接和数据传输。…...
Excel - Binary和Text两种Compare方法
Option Compare statement VBA里可以定义默认使用的compare方法: Set the string comparison method to Binary. Option Compare Binary That is, "AAA" is less than "aaa". Set the string comparison method to Text. Option Compare Tex…...
【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章
欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创…...
EasyExcel使用详解
文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…...
LeetCode 2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版
【LetMeFly】2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版 文章目录 【LetMeFly】2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚…...
前端-Rollup
Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...
ubuntu黑屏问题解决
重启Ubuntu后,系统自动进入tty1,无法进入桌面。想到前几天安装了一些主题之类的,然后今天才重启,可能是这些主题造成冲突或者问题了把。 这里直接重新安装ubuntu-desktop解决: 更新源: sudo apt-get upd…...
MV结构下设置Qt表格的代理
目录 预备知识 模型 关联 刷新 示例 代理 模型 界面 结果 完整资料见: 所谓MV结构,是“model-view”(模型-视图)的简称。也就是说,表格的数据保存在model中,而视图由view实现。在我前面的很多博客…...
vue3相关知识点
title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…...
Lustre v6 语法 - 时序表达式
概述 Lustre v6 语法中,与时序表达式有关的运算,包括 ->(followed by), pre(previous), fby, current, when, merge。其中,除 merge 运算是 Lustre v6 中新引入的外,其余在 Lustre Core 语法中已有定义。 与时序表达式有关的…...
vs2013 使用 eigen 库编译时报 C2059 错的解决方法
(个人感觉)vs2013 就不能使用版本大于等于 3.4 的 eigen,使用 3.3.9 就可以了,再不行就用 3.3.8 另一个博主也遇到过用 vs2013 的时候不能编译 3.4 的 eigen 的问题,不过我用的是 win11,所以感觉跟操作系统…...
Kafka 消费端反复 Rebalance: `Attempt to heartbeat failed since group is rebalancing`
文章目录 Kafka 消费端反复 Rebalance: Attempt to heartbeat failed since group is rebalancing1. Rebalance 过程概述2. 错误原因分析2.1 消费者组频繁加入或退出2.1.1 消费者故障导致频繁重启2.1.2. 消费者加入和退出导致的 Rebalance2.1.3 消费者心跳超时导致的 Rebalance…...
【第九天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-六种常见的图论算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的图论算法2. 图论算法3.详细的图论算法1)深度优先搜索(DFS)2…...
微服务网关鉴权之sa-token
目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…...
shell脚本批量修改文件名之方法(The Method of Batch Modifying File Names in Shell Scripts)
shell脚本批量修改文件名方法 我们可以使用Shell脚本来实现这个功能。Shell脚本是一种用于自动化任务的编程语言,它可以在Unix/Linux操作系统上运行。在这个脚本中,我们将使用一个for循环来遍历目标目录下的所有文件,并使用mv命令将每个文件…...
华为小米vivo向上,苹果荣耀OPPO向下
日前,Counterpoint发布的手机销量月度报告显示,中国智能手机销量在2024年第四季度同比下降3.2%,成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说,他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…...
国产编辑器EverEdit - 输出窗口
1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果,主要包括: 查找类:查找全部,筛选等待操作,可以把查找结果打印到输出窗口中; 程序类:在执行外部程序时(如:命令窗…...
获取snmp oid的小方法1(随手记)
snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值,找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…...
DeepSeek模型:开启人工智能的新篇章
DeepSeek模型:开启人工智能的新篇章 在当今快速发展的技术浪潮中,人工智能(AI)已经成为了推动社会进步和创新的核心力量之一。而DeepSeek模型,作为AI领域的一颗璀璨明珠,正以其强大的功能和灵活的用法&…...
望获实时Linux系统:2024回顾与2025展望
2024年回顾 功能安全认证 2024年4月,望获操作系统V2获ISO26262:2018功能安全产品认证(ASIL B等级),达到国际功能安全标准。 EtherCAT实时性增强 2024年5月,发布通信实时增强组件,EtherCAT总线通信抖…...
