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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/860352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python写出银行管理系统

1 问题 怎么利用已学的python知识简单写出一个银行管理系统,且编写出开户、查询、取款、存款、转账和管理员登录等功能。 2 方法 使用def定义函数、while循环函数、if函数和import函数并带上一些简单的逻辑思维便可以轻松解决这个看似困难实则简单的程序。 # 1.开…

BAT 利用BAT替换SQL文件中的参数成为可执行SQL文件

1. BAT文件 将下面的代码保存成“01_ExeSqlCre.bat”文件。 echo off SETLOCAL ENABLEDELAYEDEXPANSIONIF EXIST %~dp0\10_Program_Exec.sql (DEL /Q %~dp0\10_Program_Exec.sql )CHCP 65001 FOR /F "EOL. TOKENS* DELIMS" %%a IN (dir /a /b *.sql) DO (FOR /F &q…

ACIS中如何求点在FACE参数域内的坐标

1. 点在 FACE 上 如果点在FACE上,可以采用surface的直接接口:surface::param、surface::test_point和surface::test_point_tol。 virtual SPApar_pos surface::param ( const SPAposition & pos, const SPApar_pos & param_guess SpaAcis::…

【SQL Server数据库】数据的增删改操作

目录 一、用SQL语句完成下列功能。 1、新开设一门课程,名叫网络安全与防火墙,学时40,编号为“0118”,主要介绍网络的安全与主要的防火墙软件。 2、先建立monitor表,其结构与student表大致一样.…

华为仓颉编程语言观感

这里写自定义目录标题 相似点(主要与Swift进行对比)不同点亮点 花了半天时间,对华为新出的仓颉编程语言做了简单的了解,整体观感如下: 仓颉语言看起来是一门大而全的语言,吸纳了现存的很多中编程语言的范式…

图书管理系统(详解版 附源码)

目录 项目分析 实现页面 功能描述 页面预览 准备工作 数据准备 创建数据库 用户表 创建项目 导入前端页面 测试前端页面 后端代码实现 项目公共模块 实体类 公共层 统一结果返回 统一异常处理 业务实现 持久层 用户登录 用户注册 密码加密验证 添加图书…

Cesium默认bing地图数据,还支持哪些地图的数据源呢?

传统的前端开发增长乏力了,新兴的web3D方向前端开发需求旺盛,这一块在国外很成熟,在国内兴起不久, 甚至很多前端老铁都没听过,没见过,没有意识到,前端除了框架、vue、uniapp这些烂大街的&#x…

黑马苍穹外卖7 用户下单+订单支付(微信小程序支付流程图)

地址簿 数据库表设计 就是基本增删改查,与前面的类似。 用户下单 用户点餐业务流程: 购物车-订单提交-订单支付-下单成功 展示购物车数据,不需要提交到后端 数据库设计:两个表【订单表orders,订单明细表order_d…

cnpm run dev 报错 Error: Cannot find module ‘fs/promises’

主要原因是babel版本冲突 卸载以下依赖可以解决问题: 之后重新安装babel-loader依赖 可能会报以下错误: 接着安装babel-core依赖 项目顺利启动

【启明智显分享】低成本RISC-V工业级HMI方案推荐

伴随着工业4.0的迅猛发展,工业HMI以方便、快捷的特点逐渐成为工业的日常应用,成为备受追捧的全新多媒体交互设备。 什么是工业HMI?工业HMI是用于工业自动化系统中的人机交互界面,通常由触摸屏、按钮、指示灯、显示器等组成&#…

如何正确使用C#短信接口发送招生短信

群发短信对教育机构来讲虽然是个不错的招生工具,但怎么使用决定着生源转化效率,如果是为了单纯的发短信而发短信效率当然不好,那么如何正确使用招生群发短信呢?技巧才是关键! 教育短信发送较多的就是招生群发短信内容,而运营商对教育行业内容审核一般比较严格,需要短信公司特殊…

新媒体矩阵系统是什么?怎么搭建矩阵系统?

目录 前言: 一、新媒体矩阵分别是什么? 1、横向矩阵 2、 纵向矩阵 二、新媒体矩阵的作用? 1、多元化发展,吸引目标 2、多平台协同,放大宣传效果 3、多平台运营,分散风险 三、怎么做矩阵系统&…

【摄像头标定】双目摄像头标定及矫正-opencv(python)

双目摄像头标定及矫正 棋盘格标定板标定矫正 棋盘格标定板 本文使用棋盘格标定板,可以到这篇博客中下载:https://blog.csdn.net/qq_39330520/article/details/107864568 标定 要进行标定首先需要双目拍的棋盘格图片,20张左右,…

企业微信内嵌H5项目接入聊天功能

产品需求是,在列表中把符合条件的列表接入聊天功能,以下是详细步骤: 1.引入企业微信 <script src"https://res.wx.qq.com/wwopen/js/jsapi/jweixin-1.0.0.js"></script> 2.获取wx签名(必须要) /*** 获取wx签名**/ export function getWxJsApi(data) {r…

RKmedia进行vi-vo模块

一、简介 分析一下rkmedia的代码&#xff0c;给自己加深一下印象 二、代码 2.1 头文件以及定义 首先包含了必要的头文件&#xff0c;以及rkmedia底层的库 static bool quit 是定义了布尔类型的变量来表示这个程序的运行状态 false表示没停止 true表示停止 sigterm_handle…

pdf压缩,pdf压缩在线,pdf文件太大怎么变小

在数字化时代&#xff0c;PDF文档因其跨平台、保持原样、易于阅读和打印等特点&#xff0c;成为了我们日常工作和生活中不可或缺的一部分。然而&#xff0c;随着PDF文件的不断累积&#xff0c;存储空间逐渐变得紧张&#xff0c;特别是在处理大量大型PDF文件时&#xff0c;如何有…

【Python】在 VS Code 里面绘制动图不显示动画的解决办法

在 VS Code 中&#xff0c;可以通过以下步骤来确保动画正确显示&#xff1a; 配置 VS Code 使用适当的绘图后端&#xff1a; VS Code 中使用 matplotlib 的动画功能&#xff0c;需要配置适当的绘图后端。推荐使用 TkAgg 或者 Qt5Agg 后端。你可以在代码中显式指定&#xff1a;…

若依前后端分离项目整合shardingjdbc分表(详细,分片字段订单id)

文章目录 1. 引入Maven依赖2.引入配置文件3.兼容之前的数据库源,使用现在的sharding数据库源&#xff08;shardingjdbc默认的数据源&#xff09;&#xff0c;但是配置好文件之后是没有生效的&#xff0c;需要加配置文件覆盖4. 检测是否成功5. 如何使用&#xff0c;在需要使用的…

qt开发-14_QListwidget 仿qq好友列表制作

QListWidget 继承 QListView。QListWidget 类提供了一个基于项的列表小部件。QListWidg et 是一个便捷的类&#xff0c;它提供了一个类似于 QListView&#xff08;下一小节将讲到&#xff09;提供的列表视图&#xff0c;但 是提供了一个用于添加和删除项目的基于项目的经典接口…

第10章 启动过程组 (启动过程组的重点工作)

第10章 启动过程组 10.3启动过程组的重点工作&#xff0c;在第三版教材第362~364页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;项目启动会议 1、作用 标志着对项目经理责权的定义结果的正式公布&#xff0c;通常由项目经理负责组织和召开。2、目的 使项目各…