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

news2025/1/30 10:05:06

在这里插入图片描述
安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳(unpacking)指的是去除应用程序中加固或保护措施的过程,使得可以访问应用程序的原始代码或者数据。脱壳的重要性:

  1. 分析恶意软件:很多恶意软件采用加壳技术来隐藏其真实行为。脱壳后,安全研究人员可以更容易地理解恶意代码的实现方式、传播途径及其攻击目标,帮助开发有效的防御策略。
  2. 漏洞分析:应用程序可能存在各种漏洞,比如远程代码执行、信息泄露等。通过脱壳,可以查看原始代码,分析潜在漏洞,进而发现可能的攻击面。
  3. 破解保护机制:很多安卓应用为了保护自己的知识产权或防止被修改,会采用加壳技术或其他防篡改机制。逆向工程和脱壳可以帮助研究者绕过这些保护,获取应用的原始功能或源代码。
  4. 提升安全性:通过脱壳并分析应用的源代码,可以发现其安全缺陷并加以修复。这对安卓开发者来说,能够提升自己的应用在面对恶意攻击时的安全性。
  5. 反作弊:一些游戏或者应用采用加壳和加密技术来防止被作弊或修改。脱壳能够帮助研究者或者开发者对抗这些作弊行为,确保应用的公平性和安全性。

脱壳技术一般涉及到一些技巧,比如使用动态调试工具(如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 插件化框架(例如 RePluginXposed)使用 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 类加载的步骤

  1. 查找类:当程序请求加载一个类时,ClassLoader 会首先查找其缓存中是否已有该类。如果存在,就直接返回该类。如果没有,它会进入加载过程。
  2. 委托给父类加载器:按照 委托机制(父类优先),如果当前 ClassLoader 没有加载该类,它会将加载请求委托给父加载器处理。父类加载器会继续递归地查找该类。
  3. 加载类:如果父加载器无法加载该类,当前加载器才会尝试从指定的路径(通常是 .dex 文件或 .jar 包)中加载类。
  4. 字节码解析:在 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 对象,表示当前类的加载器。通过判断其类型,可以知道是否为 PathClassLoaderDexClassLoader 或者 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 的默认加载流程

  1. loadClass():每个 ClassLoader 都会重写 loadClass() 方法。loadClass() 方法会首先检查类是否已经加载,如果已加载,则直接返回该类。如果没有加载,它会调用 findClass() 来查找并加载类。
  2. findClass()findClass()ClassLoader 类的一个抽象方法,我们可以在自定义的 ClassLoader 中实现该方法。findClass() 负责实际的类加载工作,它通过 byte[] 数据来创建 Class 对象。
  3. 委托机制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;
    }

    @Override
    protected 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 ClassFormatError
    
    
    • name:类的全名(包括包名)。
    • b:字节码数组。
    • off:字节码数组的起始偏移。
    • len:字节码的长度。

    defineClass() 会创建一个新的 Class 对象,并加载到 JVM 中,之后可以通过该类对象进行反射操作。

5. foundClass 在加载过程中的作用

foundClass 并不是 ClassLoader 中的标准方法,但它的概念通常用于描述在加载类的过程中,ClassLoader 查找到了目标类,并将其作为 Class 对象返回。

在自定义 ClassLoader 中,findClass() 方法返回的就是 “found class”。而在 loadClass() 方法中,如果父类 ClassLoader 能够找到并加载目标类,就直接返回该类,否则会委托给 findClass() 方法。

以下是一个简化的过程说明:

  1. 请求加载类:如果请求加载的类尚未加载,loadClass() 会调用 findClass()
  2. findClass() 查找类findClass() 会尝试根据类名找到该类的字节码数据。
  3. 返回找到的类(found class):如果成功找到并加载字节码,就通过 defineClass() 返回一个 Class 对象。这时,类被认为是“已找到”(found)并成功加载。

6. 验证 ClassLoader 类型及加载的 Dex 信息

验证当前类是由哪个 ClassLoader 加载,可以使用 getClassLoader() 方法。例如:

ClassLoader classLoader = MyClass.class.getClassLoader();
Log.d("ClassLoader", "ClassLoader: " + classLoader);

这会输出当前类加载器的类型(如 PathClassLoaderDexClassLoader 或自定义的 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,我们可以更灵活地控制类的加载过程,尤其是在插件化框架、动态代码注入和逆向分析等领域,这些技巧非常有用。

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

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

相关文章

马尔科夫模型和隐马尔科夫模型区别

我用一个天气预报和海藻湿度观测的比喻来解释&#xff0c;保证你秒懂&#xff01; 1. 马尔可夫模型&#xff08;Markov Model, MM&#xff09; 特点&#xff1a;状态直接可见 场景&#xff1a;天气预报&#xff08;晴天→雨天→阴天…&#xff09;核心假设&#xff1a; 下一个…

Python NumPy(7):连接数组、分割数组、数组元素的添加与删除

1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09; 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…

【LLM】deepseek多模态之Janus-Pro和JanusFlow框架

note 文章目录 note一、Janus-Pro&#xff1a;解耦视觉编码&#xff0c;实现多模态高效统一技术亮点模型细节 二、JanusFlow&#xff1a;融合生成流与语言模型&#xff0c;重新定义多模态技术亮点模型细节 Reference 一、Janus-Pro&#xff1a;解耦视觉编码&#xff0c;实现多模…

2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据

2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据.ziphttps://download.csdn.net/download/2401_84585615/89575931 https://download.csdn.net/download/2401_84585615/89575931 2000至2021年&#xff0c;全国各地级市的专利申请与获得情况呈现出显著…

51单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

240. 搜索二维矩阵||

参考题解&#xff1a;https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf 将矩阵旋转45度&#xff0c;可以看作一个二叉搜索树。 假设以左下角元素为根结点&#xff0c; 当target比root大的时候&#xff…

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

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…

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…

华为小米vivo向上,苹果荣耀OPPO向下

日前&#xff0c;Counterpoint发布的手机销量月度报告显示&#xff0c;中国智能手机销量在2024年第四季度同比下降3.2%&#xff0c;成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说&#xff0c;他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果&#xff0c;主要包括&#xff1a; 查找类&#xff1a;查找全部&#xff0c;筛选等待操作&#xff0c;可以把查找结果打印到输出窗口中&#xff1b; 程序类&#xff1a;在执行外部程序时(如&#xff1a;命令窗…

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

望获实时Linux系统:2024回顾与2025展望

2024年回顾 功能安全认证 2024年4月&#xff0c;望获操作系统V2获ISO26262:2018功能安全产品认证&#xff08;ASIL B等级&#xff09;&#xff0c;达到国际功能安全标准。 EtherCAT实时性增强 2024年5月&#xff0c;发布通信实时增强组件&#xff0c;EtherCAT总线通信抖…

2025_1_29 C语言学习中关于指针

1. 指针 指针就是存储的变量的地址&#xff0c;指针变量就是指针的变量。 1.1 空指针 当定义一个指针没有明确指向内容时&#xff0c;就可以将他设置为空指针 int* p NULL;这样对空指针的操作就会使程序崩溃而不会导致出现未定义行为&#xff0c;因为程序崩溃是宏观的&…

SQL注入漏洞之高阶手法 宽字节注入以及编码解释 以及堆叠注入原理说明

目录 宽字节注入 编码区分 原理 函数 转译符号解释 注意 绕过方式详解 堆叠【Stack】注入攻击 注入语句 宽字节注入 在说宽字节注入之前 我们需要知道编码相关的知识点&#xff0c;这个有助于搞定什么是宽字节注入 分清楚是ascii码是什么宽字节注入代码里面加入了adds…

ADC 精度 第一部分:精度与分辨率是否不同?

在与使用模数转换器&#xff08;ADC&#xff09;的系统设计师交谈时&#xff0c;我经常听到的一个最常见问题是&#xff1a; “你们的16位ADC也是16位准确的吗&#xff1f;” 这个问题的答案在于对分辨率和精度这两个概念的基本理解存在差异。尽管这是两个完全不同的概念&…

生成模型:扩散模型(DDPM, DDIM, 条件生成)

扩散模型的理论较为复杂&#xff0c;论文公式与开源代码都难以理解。现有的教程大多侧重推导公式。为此&#xff0c;本文通过精简代码&#xff08;约300行&#xff09;&#xff0c;更多以代码运行角度讲解扩散模型。 本代码包括扩散模型的主流技术复现&#xff1a; 1.DDPM (De…