如何建立内核级钩子控制操作系统实现程序隐身

恶意软件隐身与引爆:动态检测与扫描规避攻防实战 在网络安全领域,恶意软件与检测系统的对抗是核心议题。恶意软件通过代码混淆、环境感知、延迟触发等技术实现“隐身”(Cloak),旨在绕过静态扫描和动态分析。其核心原理在于制造信息差,利用沙箱检测、无文件攻击等手段规避监控。这类技术的价值在于揭示了传统特征码检测的局限性,推动了防御体系向行为分析演进。应用场景广泛涉及高级持续性威胁(APT)攻击、端点安全防护和网络流量监控。本文聚焦的“Agent Skill”恶意软件,正是这种对抗的典型代表,它具备环境感知和条件触发能力,其“引爆”(Detonate)阶段往往与 阅读详情

 我们知道,应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各种应用程序。本文将向您介绍如何建立内核级钩子来控制操作系统向上提供的各种低级功能。有了内核级钩子,我们不但能够控制、监视其他程序并过滤有关数据,还能用其实现Rootkit本身及其它程序的隐形。

本文首先回顾系统调用表和内存保护方面的知识,然后讲解如何实现内核钩子,最后对一些重要的内核函数进行了简要的说明。

一、系统调用表

系统调用表又称系统服务表或者服务描述符表,是Windows 内核在进行各种系统操作时所需的一个函数指针表。也就是说,这个表中存放的是提供系统服务的各种函数的地址。当然,该表所指向的都是系统自身的一些函数,但是,如果我们对它做了手脚后,就可以让它指向我们自己的函数。这正是本文要讲解的重点。

读者一定要注意,修改系统调用表及替换内核函数时,会对系统全局产生影响,稍有不慎就会导致系统崩溃。所以,下手之前,最好对表中的各个函数要有足够的认识,然后才好用我们自己的函数替换这些内核函数的方法。你对它们了解得越多越深,在实现内核钩子的时候就越顺手。但话又说回来,这个系统调用表中的表项实在是太多了,有的指向字符串操作,有的指向客户机/服务器操作,等等。所以要在短时间内了解所有表项是不可能的,所以下文中对它们只做有选择的、概括的介绍。

二、内存保护

现代的Windows操作系统通常将系统调用表所在内存页设为只读来提供保护。如果不能克服这个问题,实施内核钩子技术就是痴人说梦。因为试图向只读内存写入数据也即修改只读内存区时,立刻就会蓝屏。为此,先让我们来了解一下内存保护方面的有关知识。

内存描述符表是内存保护的一大关键,具体定义详见微软DDK中的ntddk.h头文件,我们这里仅做简要介绍:

typedef struct _MDL {
 struct _MDL *Next;
 CSHORT Size;
 CSHORT MdlFlags;
 struct _EPROCESS *Process;
 PVOID MappedSystemVa;
 PVOID StartVa;
 ULONG ByteCount;
 ULONG ByteOffset;
} MDL, *PMDL;

#define MDL_MAPPED_TO_SYSTEM_VA 0x0001
#define MDL_PAGES_LOCKED 0x0002
#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
#define MDL_ALLOCATED_FIXED_SIZE 0x0008
#define MDL_PARTIAL 0x0010
#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
#define MDL_IO_PAGE_READ 0x0040
#define MDL_WRITE_OPERATION 0x0080
#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
#define MDL_FREE_EXTRA_PTES 0x0200
#define MDL_IO_SPACE 0x0800
#define MDL_NETWORK_HEADER 0x1000
#define MDL_MAPPING_CAN_FAIL 0x2000
#define MDL_ALLOCATED_MUST_SUCCEED 0x4000


#define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | /
 MDL_PAGES_LOCKED | /
 MDL_SOURCE_IS_NONPAGED_POOL | /
 MDL_PARTIAL_HAS_BEEN_MAPPED | /
 MDL_PARENT_MAPPED_SYSTEM_VA | /
 MDL_SYSTEM_VA | /
 MDL_IO_SPACE )

内存描述符表(MDL)的作用是将虚拟内存映射成物理页。如果将系统调用表所在内存页的MDL的MDLFlags成员设为MDL_MAPPED_TO_SYSTEM_VA 并且该页面被锁定的话,那么就可以使用内核钩子技术了。以下代码将可以达此目的:

 

#pragma pack(1)
typedef struct ServiceDescriptorEntry
{
 unsigned int *ServiceTableBase;
 unsigned int *ServiceCounterTableBase;
 unsigned int NumberOfServices;
 unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

PVOID* NewSystemCallTable;
PMDL pMyMDL = MmCreateMdl( NULL,
 KeServiceDescriptorTable.ServiceTableBase,
 KeServiceDescriptorTable.NumberOfServices * 4 );
MmBuildMdlForNonPagedPool( pMyMDL );
pMyMDL->MdlFlags = pMyMDL->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
NewSystemCallTable = MmMapLockedPages( pMyMDL, KernelMode );

好了,我们现在可以通过NewSystemCallTable来新建系统调用表了。系统调用表如下图所示。

图1  系统调用表示意图

进行挂钩时,可以使用以下宏:

#define HOOK_INDEX(function2hook) *(PULONG)((PUCHAR)function2hook+1)

#define HOOK(functionName, newPointer2Function, oldPointer2Function )  /
 oldPointer2Function = (PVOID) InterlockedExchange( (PLONG)
&NewSystemCallTable[HOOK_INDEX(functionName)], (LONG) newPointer2Function)

#define UNHOOK(functionName, oldPointer2Function)  /
 InterlockedExchange( (PLONG) &NewSystemCallTable[HOOK_INDEX(functionName)]
 , (LONG)
oldPointer2Function)

使这些宏后,钩子技术会变得更简单,也更安全。因为InterlockedExchange 是原子函数,不会要求中止中断,所以交换指针的方式是安全的;另外,它也不需要用一个宏挂钩之后用另一个宏卸载钩子,所以也更方便。下图向我们展示了拦截系统调用表的过程。

图2  系统调用表拦截技术示意图

系统调用表数据结构KeServiceDescriptorTable不仅含有ntdll.dll 的全部函数指针,还存有系统调用表的基地址和表的大小,当建立我们自己的内存描述符表的时候,这些信息是不可或缺的。利用MDL_MAPPED_TO_SYSTEM_VA 标志,我们可以建立一个不可页出(即不会被换到内存之外)的MDL ,这样我们就可以将其锁定,并把返回的地址用于我们自己的系统调用表,重要的是,这个系统调用表是可写的。

三、定义钩子函数

 

内核钩子主要有三部分组成:要钩取的函数(在下文中称为目标函数)、替代要钩取的函数的函数(在下文中成为钩子函数)和系统调用表。前面部分介绍了系统调用表的问题,下面开始介绍钩子函数。一般说来,当定义自己的钩子函数时,可以先到DDK 的头文件中找到所想要的函数的原型,然后,稍加修改就能把目标函数变成钩子函数了。

例如,ZwMapViewOfSection 是一个内核函数,允许应用程序把从动态链接库导出的函数映射至内存。如果我们想要钩住这个内核函数,那么可以到ntddk.h头文件中查看其函数原型,如下所示:

NTSYSAPI
NTSTATUS
NTAPI
ZwMapViewOfSection(
 IN HANDLE SectionHandle,
 IN HANDLE ProcessHandle,
 IN OUT PVOID *BaseAddress,
 IN ULONG ZeroBits,
 IN ULONG CommitSize,
 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
 IN OUT PSIZE_T ViewSize,
 IN SECTION_INHERIT InheritDisposition,
 IN ULONG AllocationType,
 IN ULONG Protect );

有了函数原型,我们就可以确定指向目标函数的指针了,如下所示:

typedef NTSTATUS (*ZWMAPVIEWOFSECTION)(
 IN HANDLE SectionHandle,
 IN HANDLE ProcessHandle,
 IN OUT PVOID *BaseAddress,
 IN ULONG ZeroBits,
 IN ULONG CommitSize,
 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
 IN OUT PSIZE_T ViewSize,
 IN SECTION_INHERIT InheritDisposition,
 IN ULONG AllocationType,
 IN ULONG Protect );

ZWMAPVIEWOFSECTION OldZwMapViewOfSection;

钩子函数如下所示:

NTSTATUS NewZwMapViewOfSection(
 IN HANDLE SectionHandle,
 IN HANDLE ProcessHandle,
 IN OUT PVOID *BaseAddress,
 IN ULONG ZeroBits,
 IN ULONG CommitSize,
 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
 IN OUT PSIZE_T ViewSize,
 IN SECTION_INHERIT InheritDisposition,
 IN ULONG AllocationType,
 IN ULONG Protect )
{
 NTSTATUS status;

 DbgPrint("comint32: NewZwMapViewOfSection called.");
 //我们可以对输入为所欲为,既可以马上返回,也可以继续执行原函数

 status = OldZwMapViewOfSection(SectionHandle,
  ProcessHandle,
  BaseAddress,
  ZeroBits,
  CommitSize,
  SectionOffset OPTIONAL,
  ViewSize,
  InheritDisposition,
  AllocationType,
  Protect );

 // 我们可以在此对输出为所欲为,想返回什么,就返回什么
 return status;
}

好了,钩子技术的三大件已经准备好了。现在,我们就可以像下面这样使用它们:

HOOK( ZwMapViewOfSection, NewZwMapViewOfSection, OldZwMapViewOfSection );

如果你打算使用DriverUnload ()的话,可千万不要忘了卸载钩子。

四、内核函数系列

 

经过上面的介绍,我们已经了解了系统调用表有关知识,也已知道如何拦截系统调用表中的函数,下面,我们再来了解一下我们要钩取的函数:目标函数。这方面,如果我们不仅了解系统调用表中有哪些函数,还知道这些函数的工作机制就最好了。但实际上,ntdll.dll 中的导出函数有好几百个,别说一个一个的探究,就是把它们都列出来,看着看着头都大了。幸运的是,我们不必了解每个函数,只要了解其所在的系列就行了。为什么这么说?因为微软已经按照函数的功能对Ntdll.dll的导出函数进行了分组,并冠以意义明确的前缀,所以根据函数系列的前缀就能明白它们的大体功能了。下面对这些函数系列进行简单的介绍:

1.KiEtw系列:本系列内核函数用于系统内核,这些函数只能从内核的内部进行调用,常用的有:KiUserCallbackDispatcher、KiRaiseUserExceptionDispatcher、KiUserApcDispatcher、KiUserExceptionDispatcher等。

2.Csr系列:此系列函数用于客户机和服务器运行时,如果您想拦截客户机/服务器方面的操作,那么就需要对Csr系列内核函数做进一步的了解。常见的有:CsrClientCallServer、CsrCaptureMessageBuffer、CsrConnectClientToServer和CrsNewThread等。

3.Ldr系列:本系列内核函数用于加载程序管理器,如果你打算拦截加载程序的话,那么请进一步考察这组以Ldr为前缀的函数,常用的有:LdrInitializeThunk、LdrLockLoaderLock、LdrUnlockLoaderLock、LdrGetDllHandle、LdrGetProcedureAddress等。

4.Dbg系列:本系列内核函数用于调试管理,如果打算拦截调试操作的话,那么请进一步考察这组以Dbg为前缀的函数,常用的函数包括:、DbgBreakPoint、DbgUserBreakPoint、DbgPrint和DbgUiConnectToDbg等。

5.Etw系列:本系列内核函数用于追踪窗口事件,如果你打算拦截追踪之类的操作的话,那么请进一步考察这组以Etw为前缀的函数。常用的函数包括:EtwTraceEvent、EtwEnableTrace、EtwGetTraceEnableLevel和EtwGetTraceEnableFlags等。

6.Rtl系列:本系列内核函数用于运行时库,以Rtl为前缀的函数可以完成多种操作,例如字符串、线程、资源、临界区、安全对象的初始化和使用,内存、进程异常和数据类型的处理,还用于完成定时器、堆、IPv4和IPv6方面的操作,以及压缩和解压缩等。

7.Pfx系列:本系列内核函数用于ANSI字符串操作,如果你打算拦截ASNI串表方面的操作的话,就需要进一步了解这些函数。常用的包括:PfxInitialize、PfxRemovePrefix、PfxInsertPrefix、PfxFindPrefix等。

8.Zw系列:本系列内核函数用于文件和注册表方面的操作,比如文件操作、注册表操作、访问进程、事件操作、令牌操作、进程操作和端口操作等。

这里介绍的只是内核函数中的一部分,限于篇幅其他部分在此不作介绍。

六、结束语

本文深入介绍了系统调用表和内存保护方面的知识,并介绍了实现钩子函数的方法,最后对一些重要的内核函数进行了简要的说明。有了内核级钩子,我们不但能够控制、监视其他程序并过滤有关数据,还能达到隐藏Rootkit本身及其它程序的目的。需要说明的是,尽管可以通过内核钩子技术来实现rootkit所需的一些功能,但是,现实中的rootkit通常组合使用多种其它技术,如进程注射、分层驱动过滤等。更多的技术,将在后文中分别加以介绍。

从固件到内核:深度解析Bootkit与Rootkit的攻防实战 系统安全的核心在于理解底层执行环境。计算机启动过程遵循严格的信任链,从固件到引导加载器,再到操作系统内核,每一层都拥有不同的权限级别。固件作为硬件与软件间的桥梁,运行在最高特权模式,一旦被攻破,攻击者便能在操作系统加载前植入恶意代码,实现深度持久化。这种技术被称为Bootkit,它通过篡改UEFI启动流程或植入恶意驱动程序,为后续攻击奠定基础。在此基础上,攻击者进一步向内核层渗透,通过加载隐蔽的内核模块、挂钩系统调用或直接操作内核数据结构,实现对系统资源的完全控制,这就是Rootkit的核心原理。这些技术不 阅读详情

相关推荐

绕过PatchGuard的ETW HOOK实战:InfinityHook原理与逆向分析

本文深入剖析了利用ETW机制绕过Windows内核PatchGuard保护的InfinityHook技术原理。通过逆向分析ZwTraceControl等关键函数,定位并Hook ETW内部用于获取上下文的函数指针,实现对系统调用等核心事件的稳定监控,为内核安全研究提供了高级对抗思路。

weixin_29196613的博客 897

内核级Rootkit攻击链剖析:从驱动漏洞到FudModule隐身技术

Rootkit是一种能够深度隐藏自身存在和活动的恶意软件,它通过挂钩系统内核函数或直接修改内核数据结构来实现隐身。其技术原理通常涉及系统服务描述符表(SSDT)挂钩、内核回调劫持或直接内核对象操作(DKOM),从而拦截和篡改系统调用返回的信息。这种技术的核心价值在于为攻击者提供持久、隐蔽的后门访问能力,常被用于高级持续性威胁(APT)攻击中,以实现长期潜伏和数据窃取。在应用场景上,Rootkit常与供应链漏洞利用结合,例如攻击者利用戴尔驱动程序漏洞(CVE-2021-21551)进行权限提升后,部署FudM

weixin_33875839的博客 395

通过ETW补丁绕过EDR监控:原理、实现与实战

事件追踪(ETW)是Windows操作系统内置的高性能内核级诊断框架,它通过提供者、控制器、消费者和会话的发布-订阅模型,为系统监控和安全分析提供底层数据源。其核心原理在于,内核与关键系统组件会主动将进程创建、文件操作、网络活动等事件写入ETW会话,供安全产品实时消费分析。这项技术的核心价值在于为终端检测与响应(EDR)等安全方案提供了至关重要的行为可见性,广泛应用于威胁检测、取证分析和性能监控等场景。然而,通过动态修补ETW内部的关键函数指针,可以干扰或阻断特定安全事件的上报流程,从而实现针对EDR的隐蔽

weixin_34133829的博客 313

Ring3与Ring0通信方法若干

本人在[(原创)应用程序与驱动通信的若干方式]文章中阐述了,上下层通信的技术实现部分,但没有结合应用,下面的文章就具体应用给大家展示了使用方法,希望能够大家一些启发。               Ring3与Ring0同步是很有用的手段,在此做一个简要的整理,希望对开发这方面程序的朋友有帮助,好了,开始吧。          1 同步的策略          初写驱动的朋友都知道,通过Dev

2220

个人自制杀毒软件在对抗测试中为何能超越商业软件?

杀毒软件的核心原理通常基于特征码扫描、启发式分析和行为监控等技术,通过比对已知病毒特征或监控程序行为来识别威胁。其技术价值在于构建自动化防御体系,保护系统免受恶意软件侵害,广泛应用于个人电脑、企业服务器等场景。在特定高强度对抗环境下,如病毒采用进程守护、驱动隐藏等免杀技术时,商业杀软可能因兼顾稳定性与误报率而出现漏报。相比之下,针对性强的自制工具通过深度系统调用和激进清除策略,在对抗顽固样本时展现出优势。本次测试聚焦于安全软件的动态对抗能力,揭示了在特定场景下,垂直、底层的技术方案可能更有效。

weixin_33670713的博客 617

HOOK学习笔记与心得

一、  Hook介绍 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。  我们知道Windows系统API函数都是被封装到DLL中,在某个应用程序要调用一个API函数的时候,如果这个函数所在的D

码莎拉蒂 4883

HOOK编程

<br />注明:该文转自sch0120的技术博客<br /> <br />一、什么是HOOK?<br />  "hook"这个单词的意思是“钩子”,"Windows Hook"是Windows消息处理机制的一个重要扩展,程序员可以通过它来钩住(截获)感兴趣的消息,并用事先编好的一个函数(钩子过程)来处理这些消息!当然,这个处理是在消息到达目标窗口之前进行的。<br />  钩子过程(hook procedure)实际上是一个用来处理消息的函数,通过系统调用,程序员可以把它挂入系统或进程的钩子链中,让它成为

清风盛开 3025

Hook技术实现的进程隐藏与保护项目

Hook技术涉及的范围广泛,包括API Hooking、Inline Hooking、Import Address Table (IAT) Hooking等方法。它允许开发者或安全研究人员在目标函数执行前后插入自己的代码,从而监控或修改函数的行为。内核级Hook是一种用于操作系统内核级别的钩子技术。它允许开发者或者恶意软件拦截系统调用、API函数、驱动函数等内核功能,进行修改或增强其行为。内核级Hook可以应用于广泛的领域,包括安全监控、系统性能优化、以及恶意软件实施控制等。

weixin_33814090的博客 554

windows内核驱动-------内核模式与用户模式内存映射

例程将 MDL 描述的物理页面映射到虚拟地址,并使调用方能够指定用于创建映射的缓存属性。应用程序打开设备后框架调用的EVT_WDF_DEVICE_FILE_CREATE 回调函数中调用。例程分配内存描述符列表 (MDL) 足以映射缓冲区。例程接收指定非分页虚拟内存缓冲区的 MDL,并更新它以描述基础物理页。返回映射页面的起始地址。获得映射页面起始地址,由此完成映射。,给定缓冲区的起始地址和长度,,映射为用户模式虚拟地址。

qq_42383894的博客 1118

Linux系统rootkit检测工具chkrootkit实战详解

chkrootkit是一款开源的Linux系统本地rootkit检测工具,最早由Narciso Fragoso于2003年发布,旨在帮助系统管理员识别已知rootkit的存在。其设计基于特征匹配与行为比对机制,通过扫描关键系统文件、校验命令完整性及分析异常系统状态,实现对隐蔽恶意程序的快速发现。严格意义上,rootkit并非传统意义上的病毒或蠕虫,而是一类旨在隐藏自身或其他恶意实体存在的特权提升与持久化驻留工具集。

weixin_42575505的博客 1592

电流模架构Bandgap设计与仿真

带隙基准作为集成电路中一个重要模块,被广泛应用在低压差线性稳压(LDO)、充电电池保护芯片和通信电路、射频收发器、flash存储器等多种模拟及数模混合集成电路中,并且是片上集成系统(SOC)芯片中不可或缺的部分,为整个芯片提供精确的电压参考点............

qq_50968231的博客 5万+

如何建立内核级钩子控制操作系统实现程序隐身(转)

我们知道,应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各种应用程序。本文将向您介绍如何建立内核级钩子来控制操作系统向上提供的各种低级功能。有了内核级钩子,我们不但能够控制、监视其他程序并过滤有关数据,还能用...

weixin_30662539的博客 84

使用 Python 和可视化编程控制树莓派机械臂myCobot

这些模块包括逻辑、循环、数学、文本、列表、颜色、变量、函数以及控制机械臂的函数等等,所以用户可以轻松入门编程,只需单击右上角的运行就可以启动程序,做一些有趣的应用。可以搭配任意摄像头进行图像识别,具有4个 USB 端口,可以通过 Raspberry Pi 的微型 HDMI 端口连接到显示器. 最后,40 个GPIO 接头可以进行更多扩展应用,机械臂每个接口都有清晰的标记,面板上还有一个电源开关和一个直流电源插孔。您现在可以将机器人放在地板或桌子上,并用力拧紧吸盘,以确保机械臂的底座在操作过程中不会移动。

m0_62456998的博客 3966

内核钩子学习

如何建立内核级钩子控制操作系统实现程序隐身 我们知道,应用程序总是离不开系统内核所提供的服务,比如它要使用内存的时候,只要跟操作系统申请就行了,而不用自己操心哪里有空闲的内存空间等问题,实际上,这些问题是由操作系统的内核来代劳的。站在黑客的角度讲,如果能够控制内核,实际上就是控制了内核之上的各种应用程序。本文将向您介绍如何建立内核级钩子来控制操作系统向上提供的各种低级功能。有了内核级钩子,我们不但能够控制、监视其他程序并过滤有关数据,还能用其实现Rootkit本身及其它程序的隐形。 本文首先回顾系统调用

bcbobo21cn的专栏 1040

f2fs学习笔记 - 3. F2FS文件系统布局

目录1.前言2.F2FS布局说明2.1. super block(block 0x0 ~ block 0x1ff)2.2 CP(block 0x200 ~ block 0x5ff)cp page1nat journalsit journaldata summarycurrent hot node summarycurrent warm node summarycurrent cold node summarycp page22nd checkpoint2.3 SIT(block 0x600 ~ block

HZero 4645

如何玩转腾讯云轻量级服务器(新手向)

如何玩转腾讯云轻量级服务器(新手向) ​ 相信不少同学都想将自己的服务器部署到云服务器,让别人通过自己的域名就可以访问到自己的项目,而腾讯云轻量级服务器作为一个小型的应用,支持域名解析和可视化运维等。比较适合新手入门 ​ 本文服务器操作系统为Centos7 一. 购买以及基本配置 1.购买方式 ​ 本文主要面向新手,毕竟一般只有新手才会购买轻量级服务器。所以可以选择购买一年的来学习,以后再根据需要换,前提提示(轻量级服务器没有安全组的,开放端口直接开启防火墙里的即可) ​ 购买连接 购买完成后点击控制

qq_46160687的博客 1万+

pell:1.38kB 零依赖的 WYSIWYG 富文本编辑器,10 分钟给网页加上编辑能力

pell 是一个纯 JavaScript、零依赖的 WYSIWYG 富文本编辑器,min+gzip 后仅 1.38kB,通过 `contenteditable` 和 `document.execCommand` 就能让网页获得加粗、列表、引用等所见即所得编辑能力。它解决的是"想给页面加个轻富文本区,又不想为 CKEditor 这类重型编辑器付出体积和集成成本"的问题,适合做评论区、后台编辑、轻量写

gitblog_00487的博客 978

从零到一:手把手教你用Python+LangChain搭建企业级RAG知识库(附避坑指南)

本文为开发者提供了一份详尽的实战指南,手把手教你使用Python和LangChain框架从零构建企业级RAG知识库。内容涵盖环境搭建、文档处理、向量化检索、提示工程及生产部署等核心环节,并重点分享了文档分割、检索优化等关键避坑经验,旨在帮助读者打造稳定、高效且易于维护的智能知识中枢。

weixin_29058331的博客 398

完整tablecn shadcn数据表格组件指南:实现服务端排序筛选分页与实时协作

tablecn 是一套基于 shadcn/ui 构建的数据表格(data table)与数据网格(data grid)组件库,原生支持服务端排序、筛选、分页、无限滚动和实时协作。本指南将带你从本地跑起来,到逐个拆解它的核心能力,再到深入两个关键实现,让你能更快速地在自己的项目里落地一套企业级数据表格方案,无需再为表格的排序筛选逻辑重复造轮子。 ## 从真实痛点说起:为什么你需要一个更强的表格

gitblog_01193的博客 261

【NodeRed】node-red-contrib-opcua实现PLC读写

在之前的博文【Node-RED】node-red-contrib-opcua-server模块使用(1)中,我们介绍了用node-red-contrib-opcua-server模块实现OPCUA服务端的,以及二次开发的内容。本节博文中我们采用官方社区自带的node-red-contrib-opcua组件开展对OPCUA客户端的介绍,详细阐述用该组件中OpcUa-Client节点实现客户端对PLC的读写,以及实现过程中遇到的问题。由于官方社区中并没有找到该组件的介绍实例,这也是本博文编写的第1个原因。

weixin_48618536的博客 958

PCL 读取和保存点云

PCL (Point Cloud Library) 是一个用于处理 3D 点云数据的开源库。在处理点云数据时,常见的任务包括点云的读写和可视化。PCL 提供了强大的 IO 模块来读取和写入各种格式的点云文件,并且提供了可视化模块来对点云进行渲染和显示。点云的读写与显示是很多 3D 数据处理任务的基础步骤,通过这些步骤,可以对点云进行预处理、分析和操作。

纵马踏花向自由 1737

探索隐藏在深处的技术神器:Rootkit - 一个隐身术般的系统工具

探索隐藏在深处的技术神器:Rootkit - 一个隐身术般的系统工具 去发现同类优质开源项目:https://gitcode.com/ 简介 在深入探讨之前,让我们先介绍一下项目: 是一个开源的、跨平台的系统工具,用于创建和管理“rootkits”——一种高级的系统隐蔽技术。通过利用内核级别的访问权限,Rootkit 可以让特定的程序或服务在系统中隐形,以实现安全研究、渗透测试或者恶意软件分析的目...

gitblog_00029的博客 892

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

深度剖析Sainbox RAT与PurpleFox Rootkit复合攻击链

Rootkit是一种能够深度隐藏自身及关联恶意活动的恶意软件,其核心原理在于通过修改操作系统内核数据结构或劫持系统调用,实现进程、文件、网络连接等对象的隐身。这项技术的工程价值在于为恶意软件提供了极强的持久化与隐蔽能力,使其能长期潜伏于系统中而不被常规安全工具发现。在应用场景上,Rootkit常与远程访问木马(RAT)等恶意载荷结合,构成高级持续性威胁(APT)攻击链的关键一环,用于窃密、监控或建立长期后门。本文聚焦的“Ghost”攻击,正是Sainbox RAT与PurpleFox内核级Rootkit深度

weixin_30345577的博客 403

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

恶意代码研究实战指南:Rootkit样本库的深度探索与应用

在网络安全研究领域,理解高级威胁技术是构建有效防御体系的关键。Rootkit作为最具隐蔽性和持久性的恶意代码类型,其技术原理和实现方式对安全研究人员至关重要。本文将引导您深入探索Rootkit技术的核心奥秘,并通过实战演练掌握恶意代码分析的关键技能。 ## 🔬 技术深度解析:Rootkit的隐蔽机制与实现原理 Rootkit之所以成为高级威胁的代表,关键在于其**系统级隐蔽能力**。与传统恶

gitblog_00457的博客 1069

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 进程基本结构说明
下一篇: sysenter系统调用
tomorrowsprogress
博客等级 码龄20年 16粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值