浅析windows对象管理

2023东华大学机试OJ进阶版1-81题 先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。 阅读详情
作者:Sysnap 

出处:http://hi.baidu.com/sysnap 
标题:Windows 对象管理


把以前的对象笔记帖上来...后面多加了俩个 函数..来加深理解...
一个是ZwQueryDirectoryObject来检测隐藏驱动
一个是让ZwQueryDirectoryObject检测不了的...代码比较简单..先看前面的理论再去理解后面的函数...应该可以编译出来的..否则那个

函数你可能埋怨说代码不完整...
1对象数据结构

在对象头的前面有几个可选结构... 可以是下面的组合

typedef struct _OBJECT_HEADER_QUOTA_INFO { 
ULONG PagedPoolCharge; 
ULONG NonPagedPoolCharge; 
ULONG SecurityDescriptorCharge; 
PEPROCESS ExclusiveProcess; // 拥有此对象的进程

#ifdef _WIN64 

ULONG64 Reserved; // Win64 requires these 
structures to be16 bytealigned. 
#endif 
} OBJECT_HEADER_QUOTA_INFO, 
*POBJECT_HEADER_QUOTA_INFO; 

typedef struct _OBJECT_HEADER_HANDLE_INFO { 
union{ 
POBJECT_HANDLE_COUNT_DATABASE 
HandleCountDataBase; 
OBJECT_HANDLE_COUNT_ENTRY SingleEntry; 

}; 
} OBJECT_HEADER_HANDLE_INFO, 
*POBJECT_HEADER_HANDLE_INFO; 

typedef struct _OBJECT_HEADER_NAME_INFO { 

POBJECT_DIRECTORY Directory; // 对象所属的路径
UNICODE_STRING Name;// 对象名
ULONG QueryReferences; 

#if DBG 
ULONG Reserved2; 
LONG DbgDereferenceCount; 

#ifdef _WIN64 

ULONG64 Reserved3; // Win64 requires these 
structures to be16 bytealigned. 
#endif 
#endif 
} OBJECT_HEADER_NAME_INFO, *POBJECT_HEADER_ 


NAME_INFO; 

typedef struct _OBJECT_HEADER_CREATOR_INFO { 

LIST_ENTRY TypeList; // 系统可以将所有同类型的对象串

起来
HANDLE CreatorUniqueProcess;// 对象父进程的ID 
USHORT CreatorBackTraceIndex; 
USHORT Reserved; 

} OBJECT_HEADER_CREATOR_INFO, 
*POBJECT_HEADER_CREATOR_INFO; 

对这些可选择的数据结构的总结: 

1_OBJECT_HEADER_QUOTA_INFO 中的PEPROCESS 
ExclusiveProcess 指示了拥有此对象的进程
2_OBJECT_HEADER_HANDLE_INFO 中存储着对象句柄相
关的信息
3_OBJECT_HEADER_NAME_INFO 有对象所属的路径和对
象的名字
4_OBJECT_HEADER_CREATOR_INFO, 系统用
LIST_ENTRY TypeList 将所有同类型的对象串起来

接着就是对象头

typedef struct _OBJECT_HEADER { 
LONG_PTR PointerCount; 
union{ 

LONG_PTR HandleCount; 

PVOID NextToFree;
};
POBJECT_TYPE Type;
UCHAR NameInfoOffset;
UCHAR HandleInfoOffset;
UCHAR QuotaInfoOffset;
UCHAR Flags;


union{ 

POBJECT_CREATE_INFORMATION 
ObjectCreateInfo; 
PVOID QuotaBlockCharged; 
}; 

PSECURITY_DESCRIPTOR SecurityDescriptor; 

QUAD Body; 
} OBJECT_HEADER, *POBJECT_HEADER; 

对象头结构的总结
0 PointerCount, 引用记数,它是计算内核模式组件引用对象地


址的次数
1 HandleCount, 打开句柄计数
2Type, 对象的类型
3 NameInfoOffset,_OBJECT_HEADER_NAME_INFO 的偏移
4 HandleInfoOffset,_OBJECT_HEADER_HANDLE_INFO 的
偏移
5 QuotaInfoOffset,_OBJECT_HEADER_QUOTA_INFO 的偏
移
6 SecurityDescriptor, 对象的安全描述符

接着就是对象体.. 不同类型的对象这里不一样... 比如驱动对象
_DRIVER_OBJECT 

lkd> DT _DRIVER_OBJECT 

nt!_DRIVER_OBJECT 
+0x000 Type : Int2B 
+0x002 Size : Int2B 
+0x004DeviceObject :Ptr32 _DEVICE_OBJECT 
+0x008 Flags : Uint4B 
+0x00cDriverStart :Ptr32Void 
+0x010DriverSize :Uint4B 
+0x014DriverSection :Ptr32Void 
+0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION 
+0x01c DriverName : _UNICODE_STRING 
+0x024 HardwareDatabase: Ptr32 _UNICODE_STRING 
+0x028FastIoDispatch :Ptr32 _FAST_IO_DISPATCH 
+0x02c DriverInit : Ptr32 long 
+0x030 DriverStartIo : Ptr32 void 
+0x034 DriverUnload : Ptr32 void 
+0x038 MajorFunction : [28] Ptr32 long 

一般对象指针就是指向对象的对象体,如果得到一个对象体,想
访问对象头的话. 可以使用宏
OBJECT_TO_OBJECT_HEADER() 

2一个例子

eg: 

lkd> !object /Driver/beep 

Object:84fd2448Type: (86243e70) Driver
ObjectHeader:84fd2430(oldversion)
HandleCount:0 PointerCount:3
Directory Object:e1864448Name: Beep


可以看到beep 的ObjectHeader 的地址84fd2430 

lkd> dtnt!_object_header 84fd2430 


nt!_OBJECT_HEADER 

+0x000PointerCount :3 

+0x004HandleCount :0 

+0x004NextToFree :(null) 

+0x008 Type : 0x86243e70 _OBJECT_TYPE 

+0x00c NameInfoOffset : 0x10 '' 

+0x00d HandleInfoOffset :0 '' 

+0x00e QuotaInfoOffset: 0 '' 

+0x00fFlags :0x32 '2' 

+0x010 ObjectCreateInfo : 0x00000001 _OBJECT_CREATE_INFORMATION 

+0x010 QuotaBlockCharged : 0x00000001 

+0x014 SecurityDescriptor: 0xe1871aa3 

+0x018 Body : _QUAD 

1 +0x000 PointerCount : 3 表示内核模式组件引用对象地址的次数为3 

ObfReferenceObject(),ObReferenceObjectByHandle(), ObReferenceObjectByName() 和
ObReferenceObjectByPointer() 增加的就是这个PointerCount, ObfDereferenceObject

() 
和ObDereferenceObject() 用来减少这个值。
删除对象跟这个值有关
如果一个对象是临时的,那当踏的引用记数为0的时候,该对象会被系统删除,一个驱动程序
可以把一个临时对象的引用记数减少到0, 这样就可以达到删除该对象的目的
如果一个对象是在创建时标上了OBJ_PERMANENT flag, 那它是一个永久的对象,如果要
删除一个永久性的对象,需要经过下列步骤: 
1调用ObDereferenceObject 把一个永久性的对象的引用记数减少到0 
2调用ZwOpenXxx orZwCreateXxx 来获得该永久性对象的一个句柄
3或得句柄后调用ZwMakeTemporaryObject 把一个永久性的对象转化成一个临时的对象
4用得到的句柄调用ZwClose 删除该对象
所以确定一个对象是临时的和永久的由InitializeObjectAttributes 宏的Attributes 决

定

2 +0x004 HandleCount : 0 表示打开句柄数是0 

3+0x008Type :0x86243e70 _OBJECT_TYPE 表示对象的类型
lkd> dt_OBJECT_TYPE 0x86243e70 
nt!_OBJECT_TYPE 

+0x000 Mutex : _ERESOURCE 

+0x038TypeList :_LIST_ENTRY[0x86243ea8 -0x86243ea8] 

+0x040 Name : _UNICODE_STRING "Driver" 

+0x048DefaultObject :0x80562e20 

+0x04cIndex :0x1a 

+0x050 TotalNumberOfObjects: 0x72 

+0x054 TotalNumberOfHandles : 0 

+0x058 HighWaterNumberOfObjects: 0x72 

+0x05c HighWaterNumberOfHandles :1 

+0x060 TypeInfo : _OBJECT_TYPE_INITIALIZER 

+0x0acKey :0x76697244 

+0x0b0ObjectLocks :[4]_ERESOURCE 


+0x040Name :_UNICODE_STRING"Driver" 表示对象的类型是"Driver" 
lkd> DT _OBJECT_TYPE_INITIALIZER 0x86243e70+0X60 
nt!_OBJECT_TYPE_INITIALIZER 

+0x000 Length : 0x4c 

+0x002UseDefaultObject:0x1 '' 

+0x003 CaseInsensitive : 0x1 '' 

+0x004 InvalidAttributes :0x100 

+0x008 GenericMapping : _GENERIC_MAPPING 

+0x018 ValidAccessMask :0x1f01ff 

+0x01c SecurityRequired :0 '' 

+0x01d MaintainHandleCount :0 '' 

+0x01e MaintainTypeList : 0 '' 

+0x020PoolType :0(NonPagedPool) 

+0x024 DefaultPagedPoolCharge :0 

+0x028 DefaultNonPagedPoolCharge: 0xd8 

+0x02c DumpProcedure : (null) 

+0x030 OpenProcedure : (null) 

+0x034 CloseProcedure : (null) 

+0x038DeleteProcedure:0x805833a2 voidnt!IopDeleteDriver+0 

+0x03c ParseProcedure : (null) 

+0x040SecurityProcedure:0x805f79fe longnt!SeDefaultObjectMethod+0 

+0x044 QueryNameProcedure : (null) 

+0x048 OkayToCloseProcedu 

这个地方的东西比较有趣,分别对应着对象的删除、lookup 、获取名字等的例程,一般对

象
不是所有的routine 都有。这里有IopDeleteDriver 和SeDefaultObjectMethod 

4 +0x00c NameInfoOffset : 0x10 '' 表示_OBJECT_HEADER_NAME_INFO 的偏移是
0X10 
lkd> dtnt!_object_header_name_info 84fd2430-0x10 
nt!_OBJECT_HEADER_NAME_INFO 

+0x000 Directory : 0xe1864448 _OBJECT_DIRECTORY 

+0x004 Name : _UNICODE_STRING "Beep" 

+0x00c QueryReferences : 1 
我们看到了对象的名字"Beep" 和对象所属的路径
lkd>dt_OBJECT_DIRECTORY 0xe1864448 
nt!_OBJECT_DIRECTORY 

+0x000HashBuckets :[37]0xe185fb10 _OBJECT_DIRECTORY_ENTRY 

+0x094 Lock : _EX_PUSH_LOCK 

+0x098 DeviceMap : (null) 

+0x09c SessionId : 0xffffffff 

+0x0a0 Reserved : 0 

+0x0a2 SymbolicLinkUsageCount : 0 
关于对象目录慢点再讲


5 +0x00d HandleInfoOffset: 0 ''//0 表示没有该结构

+0x00e QuotaInfoOffset :0 ''//0 表示没有该结构

6 +0x014 SecurityDescriptor: 0xe1871aa3 它决定了谁能对该对象进行什么样的操作

lkd> dt_SECURITY_DESCRIPTOR 0xe1871aa3 

nt!_SECURITY_DESCRIPTOR
+0x000 Revision : 0x80 ''
+0x001 Sbz1 : 0x58 'X'
+0x002 Control : 0
+0x004 Owner : 0x00006800
+0x008 Group : (null)
+0x00cSacl :0x00001400 _ACL
+0x010 Dacl : 0x44000200 _ACL


7 +0x010 ObjectCreateInfo :0x00000001 _OBJECT_CREATE_INFORMATION 

对象标志中OB_FLAG_CREATE_INFO 被标识

3对象组织

目录对象

WINDOWS 中的各种类型的对象都独立地存在于系统地址空间中,怎么组织起来? 
系统利用目录对象将所有的这些对象组织起来,目录对象可以看成是存储对象的容器。它

是
一种特殊的对象,既然是对象,那就有个数据结构了,数据结构如下:
看一下"beep" 所在的对象目录
lkd> dt _OBJECT_DIRECTORY 0xe1864448 
nt!_OBJECT_DIRECTORY 

+0x000HashBuckets :[37]0xe185fb10 _OBJECT_DIRECTORY_ENTRY
+0x094 Lock : _EX_PUSH_LOCK
+0x098 DeviceMap : (null)
+0x09c SessionId : 0xffffffff
+0x0a0 Reserved : 0
+0x0a2 SymbolicLinkUsageCount : 0


目录对象是一个有37 个数组元素组成的哈希树,数组元素的类型是
lkd> dt _OBJECT_DIRECTORY_ENTRY 0xe185fb10 
nt!_OBJECT_DIRECTORY_ENTRY 

+0x000 ChainLink : 0xe1872718 _OBJECT_DIRECTORY_ENTRY
+0x004Object :0x84fd2448


lkd> dt _OBJECT_DIRECTORY_ENTRY 0xe1872718 

nt!_OBJECT_DIRECTORY_ENTRY 
+0x000 ChainLink : 0xe1869278 _OBJECT_DIRECTORY_ENTRY 
+0x004Object :0x8621c600 

dt nt!_DRIVER_OBJECT 0x8621c600 知道


下一个驱动对象是/Driver/NDIS... 知道怎么连接了吧
系统将对象名称进行一定的算法得出一个HASH 值,系统将所有相同HASH 值的对象链接到
响应的数组项中

类型对象

系统中每种类型对象只有一个类型对象。每种类型的对象都在其对象体中存在一个指向其

类
型对象的指针,因为一种类型对象只有一个实体,所以每种类型对象的指针都是固定的,

这
样我们就可以通过对象体中的类型对象指针来判断和访问对象的类型了
各个类型对象的对象体内并没有链表结构使得它们相互链接起来。但是假如对象头部前面

有
OBJECT_CREATOR_INFO 结构,则相同类型的对象就可以通过它的成员ObjectList 相互链
接起来了。

每个对象头部前面有一个OBJECT_CREATOR_INFO 的可选结构。其结构如下:

lkd> dt _OBJECT_HEADER_CREATOR_INFO 

nt!_OBJECT_HEADER_CREATOR_INFO 
+0x000 TypeList : _LIST_ENTRY 
+0x008 CreatorUniqueProcess :Ptr32 Void 
+0x00c CreatorBackTraceIndex :Uint2B 
+0x00e Reserved : Uint2B 

+0x000 TypeList : _LIST_ENTRY 好东西......... 呵呵


4操作对象

可以用对象句柄来使用对象.怎么得到一个对象的句柄呢.ZwCreateXxx 和ZwOpenXxx 就可
以了,比如

NTSTATUS 

ZwOpenKey( 
OUT PHANDLE KeyHandle, 
IN ACCESS_MASK DesiredAccess, 
IN POBJECT_ATTRIBUTES ObjectAttributes 
); 

DesiredAccess, 指定对对象的权限操作,比如可读,可写

ObjectAttributes, 指向OBJECT_ATTRIBUTES 结构的一个指针, 先看下
OBJECT_ATTRIBUTES 的定义吧

typedef struct _OBJECT_ATTRIBUTES{ 
ULONG Length; 
HANDLE RootDirectory; 
PUNICODE_STRING ObjectName; 
ULONG Attributes; 
PSECURITY_DESCRIPTOR SecurityDescriptor; 
PSECURITY_QUALITY_OF_SERVICE SecurityQualityService; 

} 


我们重要的地方在
HANDLE RootDirectory;// 对象所在的对象目录
PUNICODE_STRING ObjectName;// 将被创建和打开的对象的名字
一般我们初始话OBJECT_ATTRIBUTES 用InitializeObjectAttributes 
VOID 
InitializeObjectAttributes( 

OUT POBJECT_ATTRIBUTES InitializedAttributes,
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN HANDLE RootDirectory,
IN PSECURITY_DESCRIPTOR SecurityDescriptor
);


一般把RootDirectory 设为NULL 就可以.ObjectName 给出全路劲
或者也可以用ZwCreateDirectoryObject 获得一个目录句柄
比如/DosDevices/C:/Directory/File. 
目录名可以是/DosDevices/C:/Directory/ 
文件名File 

看几个跟对象有关的函数: 

NTSTATUS 

ObReferenceObjectByHandle( 
IN HANDLE Handle, 
IN ACCESS_MASK DesiredAccess, 
IN POBJECT_TYPE ObjectType OPTIONAL, // 驱动程序一般设为NULL 就可以了
IN KPROCESSOR_MODE AccessMode, //KernelMode 
OUT PVOID *Object, 
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL //NULL 
); 

由对象的句柄获得对象体,当然,有了对象体,你可以得到其对象头

NTKERNELAPI 

NTSTATUS 

ObReferenceObjectByName( 
__inPUNICODE_STRING ObjectName, 
__inULONG Attributes, 
__in_opt PACCESS_STATEAccessState, 
__in_optACCESS_MASK DesiredAccess, 
__inPOBJECT_TYPE ObjectType, 
__inKPROCESSOR_MODE AccessMode, 
__inout_opt PVOID ParseContext, 
__out PVOID *Object 
); 

对象名字得到对象体

到此为止应该可以完了...... 当然还有很多内容... 但对象的总体应该有个概况
下面是用来检测隐藏驱动的...VOID  Scan_Object_Directory()
{
    UNICODE_STRING ObjectName;
    OBJECT_ATTRIBUTES oa ;
    HANDLE OpenObject;
    NTSTATUS status, ntStatus;
    ULONG count=0;
    
    PDIRECTORY_BASIC_INFORMATION  pBuffer2, pBuffer=NULL;
    ULONG                uLength = 0x800;
    ULONG                uContext = 0;
    ULONG                uResult = 0;
    WCHAR ObjName[256]=L"//Driver//";
    
    RtlInitUnicodeString(&ObjectName, L"//Driver");
    InitializeObjectAttributes(&oa,&ObjectName, OBJ_CASE_INSENSITIVE, 

NULL, NULL);
    status=    ZwOpenDirectoryObject(&OpenObject,DIRECTORY_QUERY,&oa);
    if(!NT_SUCCESS(status))
    {
        DbgPrint("failed/n");
        return;
    }
    
    do
    {
        if (pBuffer)
        ExFreePool(pBuffer);
    
        uLength *= 2;
        pBuffer=(PDIRECTORY_BASIC_INFORMATION)ExAllocatePool(NonPagedPool 

,uLength);
        ntStatus = ZwQueryDirectoryObject(OpenObject, pBuffer, 

uLength, FALSE, TRUE, &uContext, &uResult);
    } while(ntStatus == STATUS_MORE_ENTRIES || ntStatus == 

STATUS_BUFFER_TOO_SMALL);
    
    if (ntStatus==STATUS_SUCCESS)
    {
        pBuffer2=pBuffer;
        while (pBuffer2->ObjectName.Length!=0&&pBuffer2-

>ObjectTypeName.Length!=0)
        {
            wcscat(ObjName,pBuffer2->ObjectName.Buffer);
            
            GetDriverObjByName(ObjName);  //自己实现吧..到这里有ObjName就够了
            
            pBuffer2++;
            count++;
            RtlZeroMemory(ObjName,256);
            wcscpy(ObjName,L"//Driver//");
        }
    }

    DbgPrint("-----%d/n",count);
    ExFreePool(pBuffer);

}


下面是断链的..

void ObDeleteObjectFromObjectDirectory(POBJECT_DIRECTORY pObjDir) //父节点 pObjDir
{
    POBJECT_DIRECTORY_ENTRY pDirectoryEntry,pEntryPrev = NULL;
    POBJECT_HEADER pObjectHeader;
    PVOID Object;
    int i;
    PUNICODE_STRING unipObjectTypeName,uniHideDriveName;
    POBJECT_DIRECTORY tmpObjDir,pDirectory;
    
    pDirectory = pObjDir;
    
    for(i = 0; i < 36; i ++)  //DIR对象的对象体(BODY)是37个元素的数组。
    {
        pDirectoryEntry = pDirectory->HashTable;  //子根目录
        // DbgPrint("---0x%x/n", pDirectoryEntry);
        while(pDirectoryEntry)
        {
            __try{
                if(pDirectoryEntry)
                {
                    Object = pDirectoryEntry->pObject ; //根目录对象
                   pObjectHeader = OBJECT_TO_OBJECT_HEADER( Object ); //根目录对象头
                   unipObjectTypeName = (PUNICODE_STRING)((*(ULONG*)((ULONG)pObjectHeader+8)+0x40));
                    //这里可以输出很多类型的对象,但我们关心的是Driver
                   //DbgPrint("--%ws  0x%x/n",unipObjectTypeName->Buffer,Object);

    ///////////////////////////////////////////////////////////////////////////////////////////////////////    
                    // DKOM判断
                    if(wcscmp(unipObjectTypeName->Buffer,L"Driver")==0)
                    {
                        uniHideDriveName = (PUNICODE_STRING)((ULONG)Object+0x1c);
                        if(wcscmp(uniHideDriveName->Buffer,L"//Driver//NDIS")==0)  //想隐藏的驱动对象
                        {
                            //也可以用wcschr..因为我实验的结果是有时候会出现 /Driver/Beep?? 之类的名字..
                            if (pEntryPrev)  //前继有了
                                pEntryPrev->NextEntry = pDirectoryEntry->NextEntry; //匹配就开始断练了
                        }
                        pEntryPrev = pDirectoryEntry; 
                        
                        //    DbgPrint(" %ws/n",uniHideDriveName->Buffer);

                    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////                
                    if(wcscmp(unipObjectTypeName->Buffer,L"Directory")==0)
                    {
                        tmpObjDir = Object;
                       ObDeleteObjectFromObjectDirectory( tmpObjDir);  //如果对象的类型是"Directory" 递归处理之
                    }
                }
            }__except(EXCEPTION_EXECUTE_HANDLER)
            {
             ;
            }
         
         pDirectoryEntry = pDirectoryEntry->NextEntry;
     }
  }

}
手把手教你学Simulink——基于Simulink的模糊自适应PI调节FOC电流环 本文提出基于模糊自适应PI控制的FOC电流环优化方案,针对传统PI控制参数固化、抗扰性差等问题,通过模糊逻辑在线调整PI参数。方案采用双输入(电流误差及变化率)和三输出(ΔKp/ΔKi/PI调节)结构,实现动态响应时间<30μs(提升38%)、超调<5%(降低71%)、参数摄动下误差<±0.4A(精度提升73%)。详细介绍了Simulink建模步骤,包括模糊规则设计(7语言变量、49条规则)、隶属度函数配置及自适应PI实现逻辑,并提供实机部署建议。仿真结果表明,该方法显著提升系统鲁棒性,特 阅读详情

相关推荐

5分钟搞定阿里云千问大模型API申请:手把手教你获取API Key

本文提供了一份高效的阿里云通义千问大模型API Key获取实战指南。通过清晰的步骤,帮助开发者在五分钟内完成从账号准备、精准导航控制台到创建并验证API Key的全过程,并强调了密钥安全管理和基础调用测试的重要性,助力快速集成AI能力。

ol789012345的博客 1344

使用Native API查询Windows硬盘分区系统设备名称

#include #include #include #include // 定义函数返回值 typedef ULONG NTSTATUS; // 宽字节字符串结构定义 typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *P

奋斗中拥有 4219

ECB oracle——attack

基于ECB oracle的攻击方案前言什么是ECB方案步骤1.确定块大小和明文大小2.暴力破解求明文脚本代码 前言 参考文章:Breaking ECB by prepending your own message. 环境地址:ECB oracle 什么是ECB 分组密码中AES的一种模式(其他还有:CBC、ECB、CTR、OCF、CFB)如图每一块加密是分开的。 方案步骤 1.确定块大小和明文大小 先用一个字符"a"去encrypt返回32个字节的数据(64位16进制)依次用"aa",“aaa”…去en

weixin_44617902的博客 1311

遍历系统中加载的驱动程序以及通过设备对象指针获取设备对象名称

遍历系统中加载的驱动以及通过设备对象指针获取设备对象名称

Masimaro的专栏 2702

富士SC2022,C325,C328打印机扫描到网络详细教程

富士打印机SC2022,C328,C325等型号扫描到电脑教程

weixin_41926602的博客 1万+

Qwen3.6-27B本地部署实战:LM Studio配置、硬件门槛与避坑指南

大语言模型本地部署是当前AI工程落地的核心能力之一,其本质是将高参数量模型(如27B级)在受限硬件环境下实现低延迟、高稳定推理。关键技术原理涵盖量化压缩(如GGUF格式与q4_k_m精度权衡)、GPU显存分配策略(KV Cache管理与Offloading机制)、以及运行时环境兼容性(CUDA驱动、llama.cpp后端版本)。该能力直接决定私有化AI应用的技术可行性与成本边界,广泛应用于企业知识库构建、代码辅助、长文档分析等对数据主权和响应确定性要求高的场景。本文聚焦Qwen3.6-27B这一典型27B模

weixin_33272631的博客 467

对A盾原理的小小总结,膜拜A神

A盾的原理是在驱动加载时重载os内核,获取原始ssdt表的地址。 应用层点击查询的代码在文件A-ProtectView.cpp中,每种点击操作调用相应的 query查询函数,在query函数里ReadFile。读操作的Handle是A盾自定义的操作码, 类似DeviceIoControl的控制码,比如handle为LIST_SSDT,LIST_INLINEHOOK等。 驱动加载...

weixin_33704591的博客 347

2015年全国大学生电子设计大赛综合测评题

2015年全国大学生电子设计大赛综合测评题 题目如下: 一、555产生可调方波 555定时器是一种集成电路芯片,常被用于定时器、脉冲产生器和振荡电路。555可被作为电路中的延时器件、触发器或起振元件。 555定时器可组成单稳态电路、多稳态电路和无稳态电路。产生方波其实就是制造一个无稳态电路。 555定时器的引脚功能: 其中: DIS引脚与OUT脚电平一致 TRIG: 当此引脚电压降至1/3VCC(或由控制端决定的阈值电压)时输出端给出高电平。 THR:当此引脚电压升至2/3VCC(或由控制端决定的阈值电压

m0_47066484的博客 3万+

完全反截屏

把一些高手的语录总结一下:   控制所有截屏软件肯定是不可能的。但可以用相当小的代价来禁止尽可能多的截屏。 分析截屏软件的行为,可得出截屏基本有两种方式。 1. 通过剪贴板 2. 直接截取屏幕中的某一部分保存成图像文件 针对以上两种可做如下的防护: 1. 监控剪贴板变化 (SetClipboardViewer) ,发现剪贴板发生变化后,看剪贴板中是否有图片,如果有,清空它。 2

flyingleo1981的专栏 1万+

【算能】TPU(张量处理单元)的深度解析

算能(SOPHGO)作为国产AI芯片领域的核心企业,其TPU(张量处理单元)以高能效比与全场景覆盖能力为核心竞争力,专注于边缘计算与行业垂直领域的AI推理加速。

浩瀚之水的专栏 1545

Flow Match 原理 及应用

Flow Matching(流匹配)是生成模型的范式革命——用确定性ODE替代随机扩散过程,在自动驾驶轨迹预测中实现10倍采样加速和更高生成质量。更快的采样速度:通常只需 10-50 步就能生成高质量样本更稳定的训练:避免了传统扩散模型中复杂的噪声调度理论基础:基于连续正规化流(Continuous Normalizing Flows)核心思想:Flow Matching 通过学习一个 向量场(vector field) 来直接建模从噪声分布到目标分布的连续变换路径。

@bangbang的博客 98

符号链接枚举

//--------------------------------------------------------------------------// Copyright (C), 2004-2010, Zhengzz, All Rights Reserved//// FileName: EnumSymbolink.cpp//// Author: zhen

dhbzzz的专栏 3472

Allegro172版本多人协同在线设计操作指导

首先用户需要在同一个局域网下,并且Allegro172的版本必须一致,比如都是S082的版本。另外一个用户同样打开相同版本的172,选择Symphony Team design。Allegro升级到172版本,可以支持多人协同设计,并且实时同步,具体操作如下。协同模式下,不能直接保存文件,需要另存版本,注意时常保存文件,以免丢失数据。第一个用户打开PCB,选择Symphony Team design。等待一会出现如下窗口,表示已经共享成功了,并且记下IP地址。出现一个窗口,输出开共享用户的IP地址。

weixin_54787054的博客 4952

Windows日志浅析

从这篇文章开始本人开始结合Windows产品日志分析大神(RANDY FRANKLINSMITH)的电子书,以及自己的实验对Windows操作系统的日志开始分析。也是对自己的一种激励,至少希望自己能坚持下去这个分析。并且希望自己可以通过这个过程对于安全事件管理有更多的认识和理解,好了,废话不多说了,回归正题。     Windows日志从Windows2000版本后共包括9种审计策略,Windo

过河卒子 4万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Windows Mobile SDK例子浅析

<br />Windows Mobile SDK例子浅析SDK目录下提供了丰富的例子,开发中各方面的内容都有涉及,是开发者可充分利用的宝库。以Windows Mobile 5.0 Pocket PC SDK和Windows Mobile 5.0 Smarphone SDK为例,简单介绍一下其提供的例子。需要说明的是,两者中有部分例子是相同的。<br /><br />        AXSample<br />示例演示创建一个ActiveX控件以及如何在web页中访问该控件。<br /><br />    

Yao.GUET 1597

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

浅析windows安全策略

理论:本篇我们将通过一个例子,来大致了解下windows的安全策略。实现windows安全性的安全组件和数据库有:1。安全引用监视器Security reference monitor (简称SRM)   如图,这是位于核心态windows执行体中的一个组件。它负责: 1)定义访问令牌数据结构来表示一个安全环境。2)执行对象的安全访问检查3)管理特权(用户权限)4) 生成所有的结果安全审计消息。

深之JohnChen的专栏 7311

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Windows 消息机制浅析

1. Windows 的历史中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状。所以,我的介绍性开场白通常会以一段历史开始。不过,我不会以精确到年月日的那种方式详细讲述,而是选取几个对我们的编程生涯有重要影响的关键点。Windows 是真正的图形化界面操作系统的普及者,无论任何人,争夺什么第一个实现的 GUI、第一个商业化的 G...

珠穆朗玛 8957

Windows权限维持技术攻击手法与深度防御浅析

本文深入分析了Windows系统中常见的权限维持技术,包括WMI事件订阅、屏幕保护程序后门、BITS服务滥用、打印后台程序漏洞和Netsh助手DLL等攻击手法。文章提供了详细的技术原理说明、攻击实施代码示例以及对应的检测防御方法,如通过PowerShell命令审计WMI事件、检查屏幕保护程序注册表项、监控BITS任务等。防御建议包括启用相关日志监控、限制服务权限、定期系统审计等,旨在帮助安全人员全面了解攻击者的权限维持技术并建立有效防御体系。

Bruce_xiaowei的博客 1463

浅析Java中对象的创建与对象的数据类型转换

这篇文章主要介绍了Java中对象的创建与对象的数据类型转换,是Java入门学习中的基础知识,需要的朋友可以参考下 Java:对象创建和初始化过程 1.Java中的数据类型 Java中有3个数据类型:基本数据类型(在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型)、引用类型和null类型。其中,引用类型包括类类型(含数组)、接口类型。 下列语句声明了一些变量: 1 2 3 4 ...

gb4215287的博客 600

浅析Windows2000服务与后门技术

浅析Windows2000服务与后门技术 一> 序言 Windows下的服务程序都遵循服务控制管理器(SCM)的接口标准,它们会在登录系统时自动运行,甚至在没有用户登录系统的情况下也会正常执行,类似与UNIX系统中的守护进程(daemon)。它们大多是控制台程序,不过也有少数的GUI程序。本文所涉及到的服务程序仅限于Windows2000/XP系统中的一般服务程序,不包含Windows9X...

weixin_30753873的博客 278

浅析Windows2000/XP服务与后门技术

作者:TOo2y下载本文示例源代码 一、序言Windows下的服务程序都遵循服务控制管理器(SCM)的接口标准,它们会在登录系统时自动运行,甚至在没有用户登录系统的情况下也会正常执行,类似与UNIX系统中的守护进程(daemon)。它们大多是控制台程序,不过也有少数的GUI程序。本文所涉及到的服务程序仅限于Windows2000/XP系统中的一般服务程序,不包含Windows9X。 二、W

1403

Windows日志浅析(一)

http://blog.sina.com.cn/s/blog_6fe99b2f0100n7f4.html       从这篇文章开始本人开始结合Windows产品日志分析大神(RANDY FRANKLIN SMITH)的电子书,以及自己的实验对Windows操作系统的日志开始分析。也是对自己的一种激励,至少希望自己能坚持下去这个分析。并且希望自己可以通过这个过程对于安全事件管理有更多的认识和理

黑鹰 1428
上一篇: Uninformed Journal Release Announcement: Volume 10
下一篇: 绕过卡巴斯基主动防御系统方法的讨论
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值