当前位置:   article > 正文

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

渗透测试之内核安全系列课程: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技术初探(七)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/843600
推荐阅读
相关标签
  

闽ICP备14008679号