渗透测试之内核安全系列课程:Rootkit技术初探(六)

今天,我们来讲一下内核安全!

本文章仅提供学习,切勿将其用于不法手段!

目前,在渗透测试领域,主要分为了两个发展方向,分别为Web攻防领域和PWN(二进制安全)攻防领域。在PWN的二进制领域,免杀技术,一直是后渗透利用阶段的重要安全技术之一。

想要免杀,需要了解的安全技术知识包括软件加壳、代码混淆(例如,使用花指令)、隐匿技术(例如,Rootkit技术)、动态加密等内容。

接上一篇文章,我们来继续讲述下 Rootkit技术 的相关基础知识点内容!

我们来继续讲一些 实战类 的 技术干货 !

上篇文章的内容中,讲述了 在 Windows 环境下 进行 驱动开发 的 两大 工具类型 !

WDM Windows 驱动程序 模型 和 WDF Windows 驱动开发 框架 !

WDM Windows 驱动程序 模型 采用 面向过程 的 编程方法 进行 Windows 环境下的 驱动程序开发 !

WDF Windows 驱动程序 框架 采用 面向对象 的 编程方法 进行 Windows 环境下的 驱动程序开发 !

WDM Windows 驱动程序 模型 的 开发工具包 为 DDK Driver Developer Kit !

WDF Windows 驱动程序 模型 的 开发工具包 为 WDK Windows Driver Kit !

今天,我们来继续科普一些 驱动开发领域 的 基础知识 !

在进行驱动程序开发时,我们优先推荐使用 DDK( Driver Developer Kit )进行驱动程序开发工作!原因相对简单, DDK( Driver Developer Kit )如同 Windows API 一样,接近于底层空间!

Windows API ,在 用户态 的 软件程序 开发领域 中,是最接近于 操作系统底层 的 存在!

Windows API ,直接与 操作系统内核 进行 数据通信 !

大家可以理解为, Windows API 是 用户态软件程序 和 操作系统内核 进行 数据通信 的一座桥梁!相对于 MFC 类库 而言,Windows API 函数,在使用方面,更加的灵活 !MFC 类库,是按照面向对象的程序设计方法,对 Windows API 函数 的一次 封装 !

DDK( Driver Developer Kit ),直接与底层硬件通信,大家可以理解为,DDK 中的 函数方法 是最接近于硬件底层的 !DDK 如同 Windows API 一样,使用面向过程的程序设计方法,进行 驱动程序 的 开发工作 !

DDK( Driver Developer Kit ),接近于 硬件底层,DDK( Driver Developer Kit )在 驱动程序开发领域的功能实现方面,也是最为灵活的 ! 我们需要知道,DDK 在 驱动程序的功能开发实现方面 ,要比 WDK( Windows Driver Kit )更加 灵活 !

Windows 驱动程序,主要分为 两大类 ,分别为 NT 式 驱动程序 和 WDM 驱动程序 。

NT 式 驱动程序,是一类比较古老的、不支持 即插即用功能 的 驱动程序 !Windows 2000、Windows XP 系统 的 驱动程序,就是属于 NT 式 驱动程序 !NT 式 驱动程序的明显不足为

并不支持即插即用功能 !

WDM 驱动程序,是一类相对较新的、支持 即插即用功能 的 驱动程序 !目前 Windows 系列的 主流 操作系统 ,都是支持 WDM 类型 的 驱动程序 的 !

WDK( Windows Driver Kit ),属于 DDK( Driver Developer Kit )的升级版本,采用 面向对象的程序设计方法,进行驱动程序开发工作 !但是 !WDK( Windows Driver Kit )如同 MFC 一样,都是 采用面向对象的程序设计方法 对 底层函数 进行了 相应的封装 !不同的是,MFC 类库 封装的对象是 Windows API 函数 ,而 WDF( Windows Driver Kit )封装的对象 , 则是 DDK( Driver Developer Kit )!

现在,我们来介绍一下,在 Windows 驱动程序 的 开发 工作中,需要使用到的一些非常重要的数据结构 ! 学会它们,是进行 Windows 驱动程序 开发工作 的 知识基础 !

首先,我们要认识到,每一个驱动程序,都会存在对应的 驱动对象( DRIVER_OBJECT ),DRIVER_OBJECT 是一种 数据结构 !在驱动程序被加载时,操作系统内核 中的 对象管理程序 利用 DRIVER_OBJECT 数据结构 去创建 实例化 的 驱动程序对象 !驱动程序对象 的 数据结构 是使用 DRIVER_OBJECT 进行表示的 !因此,熟悉 DRIVER_OBJECT 的 数据结构 定义 ,是非常重要的 !下面,介绍一下,驱动程序对象 DRIVER_OBJECT 的 数据结构 定义 !

typedef struct _DRIVER_OBJECT {

CSHORT Type ; //结构体类型( 始终为 DRIVER_OBJECT_TYPE )

CSHORT Size ; //结构体大小( 以 Bypte 字节 为单位 )

PDEVICE_OBJECT DeviceObject ; //DEVICE_OBJECT结构指针(设备对象指针)

ULONG Flags ; //32位掩码(驱动程序属性)

PVOID DriverStart ; //驱动程序代码入口点(DriverEntry函数在内存空间中的线性地址)

ULONG DriverSzie ; //驱动程序代码长度(驱动程序代码占用的内存空间大小(字节))

PVOID DriverSection ; //内存区对象(节)指针(指向驱动程序的配置信息的内存描述表)

PDRIVER_EXTENSION DriverExtension ; //指向驱动扩展的指针(允许添加额外功能)

UNICODE_STRING DriverName ; //驱动程序名称

PUNICODE_STRING HardwareDatabase ; //指向注册表中的硬件信息路径(特定的配置参数)

PFAST_IO_DISPATCH FastIoDispatch ; //指向FAST_IO_DISPATCH结构体的指针

PDRIVER_INITIALIZE DriverInit ; //指向特定驱动程序的入口点函数的指针(初始化)

PDRIVER_STARTIO DriverStartIo ; //指向特定驱动程序的入口点函数的指针(启动I/O操作)

PDRIVER_UNLOAD DriverUnload ; //指向特定驱动程序的入口点函数的指针(卸载驱动)

PDRIVER_DISPATCH MajorFunction [ IRP_MJ_MAXIMUM_FUNCTION + 1 ] ; //一个函数指针数组,包含了驱动程序能够处理的各种主要I/O请求的函数指针。

} DRIVER_OBJECT ;

typedef struct _DRIVER_OBJECT * PDRIVER_OBJECT ;

注意,typedef 关键字,用于 自定义数据类型 ,C语言 中 有相关的 用途说明 介绍 !

注意,struct 关键字,用于 创建 结构体 结构 ,C语言 中 有相关的 用途说明 介绍 !

PDRIVER_OBJECT 数据类型 是 DRIVER_OBJECT 对象 指针 类型 !

下面,我们来重点地讲解一下, DRIVER_OBJECT 对象 的 相关字段 用途 !

1、Type:此字段标识该结构体的类型,通常设置为DRIVER_OBJECT_TYPE,用于表明这是一个驱动对象结构体。

2、Size:此字段表示该结构体的大小,以字节为单位,帮助内核和驱动程序识别结构体的内存布局。

3、DeviceObject:这是一个指针,指向驱动程序所创建的设备对象链表的头部。每个设备对象代表着一个设备或者驱动程序创建的一种虚拟设备。驱动程序通过IoCreateDevice等函数创建设备对象,并通过此字段与内核交互。

4、DriverStart:这是一个指针,指向驱动程序代码的入口点,即DriverEntry函数。当驱动程序被加载时,DriverEntry函数会被调用,用于初始化驱动对象和其他资源。

5、DriverSize:表示驱动程序的大小,用于内核管理驱动程序映像的内存占用情况。

6、DriverSection:指向驱动程序映像的内存区对象,用于内核管理驱动程序在内存中的布局和访问权限。

7、DriverExtension:指向驱动扩展的指针,允许驱动程序添加额外的信息或功能到驱动对象中。

8、DriverName:一个UNICODE_STRING类型,表示驱动程序的名称。这有助于系统日志、调试工具和其他组件识别驱动程序。

9、HardwareDatabase:指向注册表中的硬件信息路径,为驱动程序提供设备特定的配置和参数( 在Windows内核模式驱动程序中,硬件数据库用于存储有关系统中所有设备实例的信息,如设备的设备路径、设备对象指针等 )。

10、FastIoDispatch:一个指向FAST_IO_DISPATCH结构体的指针。FAST_IO_DISPATCH结构体包含了一组回调例程,这些例程允许文件系统驱动程序或文件系统筛选器驱动程序(旧)提供快速I/O处理。通过这组回调例程,驱动程序能够直接处理某些常见的I/O操作,从而提高性能并减少内核模式的转换次数。

11、DriverInit:这些字段是指向特定驱动程序的入口点函数的指针,用于执行初始化任务。

12、DriverStartIo:这些字段是指向特定驱动程序的入口点函数的指针,用于执行启动I/O操作任务。

13、DriverUnload:这些字段是指向特定驱动程序的入口点函数的指针,用于执行卸载驱动任务。

14、MajorFunction:一个函数指针数组,包含了驱动程序能够处理的各种主要I/O请求的函数指针。每个数组元素对应一种I/O请求类型,当系统需要处理这种请求时,会调用相应的函数。

注意,以大小字母 P 开头的 数据类型 一般 是 指针数据 类型 ,这是命名定义上的 习惯性 约定 !

DRIVER_OBJECT是 驱动程序 的存在形式,它是一个 结构体 。在Windows内核中,每个设备驱动程序都需要一个DRIVER_OBJECT对象,DRIVER_OBJECT对象 由系统创建并传递给驱动程序的 DriverEntry函数 或 AddDevice函数 的 参数 。

驱动程序使用此对象来注册与设备对象和其他系统对象的交互,并在操作系统需要与驱动程序进行交互时使用此对象。DRIVER_OBJECT对象还包含了与驱动程序所管理的设备对象相关联的设备扩展结构,以及用于处理I/O请求的函数指针等信息。它是驱动程序与操作系统内核之间的桥梁,用于协调设备的操作和管理 。

具体来说,DRIVER_OBJECT结构体包含了一系列字段,用于描述驱动程序的特定属性。例如,它包含驱动类型、驱动大小、驱动对象、驱动标志、驱动的起始位置、驱动的大小、指向驱动程序映像的内存区对象、驱动的扩展空间、驱动名字等。

请注意,DRIVER_OBJECT在驱动开发中是一个核心概念,其细节和具体实现可能因不同的Windows版本和硬件平台而有所不同。

扩展知识:

NDIS 中间层 驱动程序,处于 网络协议 驱动程序 和 网络硬件 驱动程序 中间。NDIS 中间层 驱动 程序 非常强大 !NDIS中间层驱动程序 可以看到 操作系统 中的全部 网络通信 的 数据流量信息 ! 网络协议 驱动程序,仅能发现 接收到 的 网络数据包。中间层驱动程序,被通常用于 数据包过滤 和 防火墙软件开发 ,但是 NDIS 中间层 驱动程序 也可以被用于 网络通信数据流量 隐藏 !

Rootkit 类型 的 远控程序 ,想要 隐藏自身 并 监听 、修改 、发送 网络协议层 的 通信数据 ,就 势必 会 进行 NDIS 层面 的 驱动程序开发 !因此,当我们想要 检测 与 取证 NDIS 层面 的 Rootkit 远控程序 的 软件行为,就必须要对 NDIS 相关的基础知识,有所了解 !

下一章内容中,将重点介绍 WDM 驱动开发工作中 , 会使用到的 另一个非常重要的 数据结构 DEVICE_OBJECT 设备对象 !

请关注下一篇,渗透测试之内核安全系列课程:Rootkit技术初探(七)

相关推荐
Daniel 大东1 小时前
BugJson因为json格式问题OOM怎么办
java·安全
梓仁沐白4 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
EasyNVR5 小时前
NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案
安全·音视频·监控·视频监控
九鼎科技-Leo8 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
搬砖的小码农_Sky8 小时前
C语言:数组
c语言·数据结构
黑客Ash8 小时前
【D01】网络安全概论
网络·安全·web安全·php
阿龟在奔跑10 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
.Ayang10 小时前
SSRF漏洞利用
网络·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
.Ayang10 小时前
SSRF 漏洞全解析(概述、攻击流程、危害、挖掘与相关函数)
安全·web安全·网络安全·系统安全·网络攻击模型·安全威胁分析·安全架构