赞
踩
今天,我们来讲一下内核安全!
本文章仅提供学习,切勿将其用于不法手段!
目前,在渗透测试领域,主要分为了两个发展方向,分别为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技术初探(七)
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。