windows驱动开发-内核编程技术汇总(五)
使用安全字符串函数
和应用层不一样的是,windows内核完全使用Unicode字符串,许多支持AsciiC的windowsAPI,是在应用层完成项Unicode的切换的。许多系统安全问题是由缓冲区处理不善和生成的缓冲区溢出引起的。 糟糕的缓冲区处理通常与字符串操作相关联。 C/C++ 语言运行时库 (strcat、 strcpy、 sprintf 等) 提供的标准字符串操作函数不会阻止写入缓冲区末尾。
两组新的字符串操作函数(称为安全字符串函数)提供额外的处理,以便在代码中正确处理缓冲区。 这些安全字符串函数在 Windows 驱动程序工具包 (WDK) 以及 Microsoft Windows XP SP1 及更高版本的驱动程序开发工具包 (DDK) 和 Windows SDK 中可用。 它们旨在替换其内置的 C/C++ 对应项和 Windows 提供的类似例程。
一组安全字符串函数用于内核模式代码。 这些函数在名为 Ntstrsafe.h 的头文件中原型。 WDK 中提供了此头文件和关联的库。
另一组安全字符串函数用于用户模式应用程序。 相应的头文件 Strsafe.h 包含这些函数的原型。 该文件和关联的库在 Windows SDK 中可用。
内核模式安全字符串函数集由以下两个子集组成:
- Unicode 和 ANSI 字符的安全字符串函数:其中每个函数在支持双字节 Unicode 字符的 W 后缀版本中可用,以及支持单字节 ANSI 字符的 A 后缀版本。 例如, RtlStringCbCatN 连接两个字符串并限制追加字符串的长度,可用作 RtlStringCbCatNW 和 RtlStringCbCatNA;
- 用于UNICODE_STRING结构的安全字符串函数:其中每个函数都接受 UNICODE_STRING 结构作为输入参数或输出参数,或同时接受这两者。 例如, RtlStringCbCopyUnicodeString 接受结构作为输入参数, RtlUnicodeStringCopyString 接受结构作为输出参数, RtlUnicodeStringCopy 接受结构作为输入和输出参数;
内核模式安全字符串函数提供以下功能:
- 每个安全字符串函数接收目标缓冲区的大小作为输入。 因此,函数可以确保它不会写入缓冲区的末尾;
- Unicode 和 ANSI 字符串函数使用 NULL 字符终止所有输出字符串,即使操作截断了预期结果;
- 所有安全字符串函数都返回 NTSTATUS 值, (STATUS_SUCCESS) 只有一个可能的成功代码;
- 大多数安全字符串函数在字节计数和字符计数版本中都可用。 例如, RtlStringCbCata 连接两个字节计数字符串, RtlStringCchCata 连接两个字符计数字符串;
大多数安全字符串函数在扩展的 Ex-suffixed 版本中提供,可提供其他功能。 例如, RtlStringCbCatExa 扩展 了 RtlStringCbCata 的功能。
使用安全整数函数
尽量减少安全问题的一种方法是防止整数溢出和下溢。 当算术运算的结果大于设置为接收它的数据类型的内存空间时,会发生整数溢出。 这会导致整数被截断,结果不正确。 当运算(通常为减法)给出不正确的结果时,将发生下溢。 由于截断了不适合新内存空间的结果,两种数据类型之间的强制转换也可能导致不正确的结果。
ntintsafe 库提供了一组 C 函数,这些函数通过边界检查执行安全整数算术运算,以防止内核模式代码中出现溢出和下溢。 这些函数对应于应用程序代码使用的 Windows IntSafe 函数。 使用这些函数来计算索引或缓冲区大小,或计算某种其他形式的边界检查。 函数针对速度进行优化。
安全整数函数具有以下优点:
- 始终向函数提供目标缓冲区的大小,以确保函数不会写入缓冲区末尾;
- 保证缓冲区以 null 结尾,即使操作截断了预期结果;
- 所有函数都返回 NTSTATUS,其中只有一个可能的成功代码 (STATUS_SUCCESS) , (STATUS_INTEGER_OVERFLOW) 一个可能的错误条件;
确定操作系统是否在安全模式下运行
下面除了介绍设备驱动程序如何确定其上运行的操作系统是否已在安全模式下启动,还介绍如何防止驱动程序在安全模式下运行。
Microsoft Windows 操作系统内核导出名为 InitSafeBootMode 的指针。 InitSafeBootMode 指向包含当前有效的安全模式设置的 ULONG 变量。 设备驱动程序可以检查这些设置,以确定操作系统是否在安全模式下运行。
InitSafeBootMode 变量对应的模式。
- 0:操作系统未处于安全模式。
- 1:SAFEBOOT_MINIMAL
- 2:SAFEBOOT_NETWORK
- 3:SAFEBOOT_DSREPAIR 注意:仅适用于 Windows 域控制器。
若要使用 InitSafeBootMode 变量,必须在驱动程序中声明它,如以下代码示例所示:
extern PULONG InitSafeBootMode;//声明 InitSafeBootMode 后,可以使用以下代码示例来确定操作系统是否在安全模式下运行
if (*InitSafeBootMode > 0)
{// The operating system is in Safe Mode.// Take appropriate action.//
}
若要防止驱动程序在安全模式下运行,请使用以下列表中与驱动程序类型匹配的技术:
1. 功能驱动程序:如果功能驱动程序的服务启动类型为 SERVICE_BOOT_START,请在功能驱动程序的 AddDevice 例程中检查 InitSafeBootMode 的值。 如果系统处于安全模式,则返回失败状态。注意 切勿从 DriverEntry 例程返回失败。
2. Filter驱动程序:如果Filter驱动程序在系统启动期间启动,请在Filter驱动程序的 AddDevice 例程中检查 InitSafeBootMode 的值。 如果操作系统处于安全模式,请执行以下操作:
不要将Filter设备对象附加到设备堆栈。
从Filter驱动程序的 AddDevice 例程返回成功。
3. 其他驱动程序:对于除功能或Filter驱动程序以外的驱动程序,在驱动程序的 DriverEntry 例程中检查 InitSafeBootMode 的值。 如果操作系统处于安全模式,则返回失败状态。
在 WDM 驱动程序中使用浮点数
使用浮点运算时,Windows 的内核模式 WDM 驱动程序必须遵循某些准则。 这些在 x86 和 x64 系统之间有所不同。 默认情况下,Windows 会关闭这两个系统的算术异常。
x86 系统
x86 系统的内核模式 WDM 驱动程序必须在调用 KeSaveExtendedProcessorState 和 KeRestoreExtendedProcessorState 之间包装浮点计算的使用。 浮点运算必须置于非内联子例程中,以确保在检查 KeSaveExtendedProcessorState 的返回值之前,不会执行浮点计算,因为编译器重新排序。
编译器使用 MMX/x87 也称为浮点单元, FPU)寄存器进行此类计算,用户模式应用程序可以同时使用这些计算。 在使用这些寄存器之前未能保存这些寄存器,或者在完成后无法还原它们,可能会导致应用程序中出现计算错误。
x86 系统的驱动程序可以调用 KeSaveExtendedProcessorState ,并在 IRQL <= DISPATCH_LEVEL 执行浮点计算。 x86 系统上 (的 ISR) 中断服务例程不支持浮点操作。
x64 系统
64 位编译器不对浮点运算使用 MMX/x87 寄存器。 而是使用 SSE 寄存器。 不允许 x64 内核模式代码访问 MMX/x87 寄存器。 编译器还负责正确保存和还原 SSE 状态,因此,不需要调用 KeSaveExtendedProcessorState 和 KeRestoreExtendedProcessorState ,并且可以在 ISR 中使用浮点操作。 使用其他扩展处理器功能(如 AVX)需要保存和还原扩展状态。 有关详细信息,请参阅 在 Windows 驱动程序中使用扩展处理器功能。
注意:通常,Arm64 与 AMD64 相似,无需先调用保存浮点状态。 但是,需要移植到内核上的 x86 的代码可能仍需要跨平台执行此操作。
示例代码
以下示例演示 WDM 驱动程序应如何包装其 FPU 访问:
__declspec(noinline)
VOID
DoFloatingPointCalculation(VOID)
{double Duration;LARGE_INTEGER Frequency;Duration = 1000000.0;DbgPrint("%I64x\n", *(LONGLONG*)&Duration);KeQueryPerformanceCounter(&Frequency);Duration /= (double)Frequency.QuadPart;DbgPrint("%I64x\n", *(LONGLONG*)&Duration);
}NTSTATUS
DriverEntry(_In_ PDRIVER_OBJECT DriverObject,_In_ PUNICODE_STRING RegistryPath)
{XSTATE_SAVE SaveState;NTSTATUS Status;Status = KeSaveExtendedProcessorState(XSTATE_MASK_LEGACY, &SaveState);if (!NT_SUCCESS(Status)) {goto exit;}__try {DoFloatingPointCalculation();}__finally {KeRestoreExtendedProcessorState(&SaveState);}exit:return Status;
}
在此示例中,对浮点变量的赋值发生在对 KeSaveExtendedProcessorState 和 KeRestoreExtendedProcessorState 的调用之间。 由于对浮点变量的任何赋值都使用 FPU,因此在初始化此类变量之前,驱动程序必须确保 KeSaveExtendedProcessorState 返回且没有错误。
上述调用在 x64 系统上是不必要的,在指定XSTATE_MASK_LEGACY标志时是无害的。 因此,在为 x64 系统编译驱动程序时,无需更改代码。
相关文章:
windows驱动开发-内核编程技术汇总(五)
使用安全字符串函数 和应用层不一样的是,windows内核完全使用Unicode字符串,许多支持AsciiC的windowsAPI,是在应用层完成项Unicode的切换的。许多系统安全问题是由缓冲区处理不善和生成的缓冲区溢出引起的。 糟糕的缓冲区处理通常与字符串操…...
Java中的optional类是啥和例子
Optional 是 Java 8 引入的一个容器对象,用于表示值存在或不存在。这是一个可以为 null 的容器对象,但使用 Optional 比直接使用 null 更安全,因为 Optional 类提供了许多有用的方法,以便更优雅地处理可能存在或不存在的值。 使用…...
AI大模型探索之路-训练篇16:大语言模型预训练-微调技术之LoRA
系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…...
mysql事务锁排查
-- mysql show full PROCESSLIST; -- 查看哪些表在锁。 show open tables where IN_use>0; -- 正在执行的事务: SELECT * FROM information_schema.INNODB_TRX;-- 8.0之前 查看正在锁的事务 select * from information_schema.innodb_locks;-- 查看等待锁的事务 …...
ChatGPT变懒原因:正在给自己放寒假!已被网友测出
ChatGPT近期偷懒严重,有了一种听起来很离谱的解释: 模仿人类,自己给自己放寒假了~ 有测试为证,网友Rob Lynch用GPT-4 turbo API设置了两个系统提示: 一个告诉它现在是5月,另一个告诉它现在是1…...
C#标签设计打印软件开发
1、新建自定义C#控件项目Custom using System; using System.Collections.Generic; using System.Text;namespace CustomControls {public class CommonSettings{/// <summary>/// 把像素换算成毫米/// </summary>/// <param name="Pixel">多少像素…...
Springboot+vue+小程序+基于微信小程序的在线学习平台
一、项目介绍 基于Spring BootVue小程序的在线学习平台从实际情况出发,结合当前年轻人的学习环境喜好来开发。基于Spring BootVue小程序的在线学习平台在语言上使用Java语言进行开发,在数据库存储方面使用的MySQL数据库,开发工具是IDEA。…...
正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-13-按键实验
前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...
ubuntu与redhat的不同之处
华子目录 什么是ubuntu概述 ubuntu版本简介桌面版服务器版 安装部署部署后的设置设置root密码关闭防火墙启用允许root进行ssh登录更改apt源安装所需软件 安装nginx安装apache网络配置Netplan概述配置详解配置文件DHCP静态IP设置设置 软件安装方法apt安装软件作用常用命令配置ap…...
三岁孩童被家养大型犬咬伤 额部撕脱伤达10公分
近期,一名被家养大型犬咬伤了面部的3岁小朋友,在被家人紧急送来西安国际医学中心医院,通过24小时急诊门诊简单救治后,转至整形外科,由主治医师李世龙为他实施了清创及缝合手术。 “患者额部撕脱伤面积约为10公分&…...
@click=“handleClick()“不会传递默认事件参数
当你使用click"handleClick()"这种形式绑定事件处理器时,Vue会将它视为一个函数调用,而不是一个事件监听器。在这种情况下,Vue不会自动传递原生事件对象作为默认参数。 如果你想让Vue自动传递原生事件对象作为默认参数,…...
KVM安装Ubuntu24.04简要坑点以及优点
本机环境是ubuntu22.04的环境,然后是8核16线程 ssd是500的 目前对于虚拟机的选择,感觉kvm确实会更加流畅,最重要的一点是简洁,然后实际安装效果也比较的好,如果对于速度方面希望快一点,并且流畅一点的话这…...
QT_day1
#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//修改窗口标题this->setWindowTitle("4.6.0");//修改窗口图标this->setWindowIcon(QIcon("C:\\Users\\zj\\Desktop\\yuanshen\\icon"));//修改窗口大小this…...
AWS宣布推出Amazon Q :针对商业数据和软件开发的生成性AI助手
亚马逊网络服务(AWS)近日宣布推出了一项名为“Amazon Q”的新服务,旨在帮助企业利用生成性人工智能(AI)技术,优化工作流程和提升业务效率。这一创新平台的推出,标志着企业工作方式的又一次重大变…...
C++:多继承虚继承
在C中,虚继承(Virtual Inheritance)是一种特殊的继承方式,用于解决菱形继承(Diamond Inheritance)问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类,从而导致了多个实例同一个…...
Linux进程间通信
每个进程的用户空间都是独立的,不能相互访问。 所有进程的内核空间(32位系统3G-4G)都是共享的 应用场景 作为缓冲区,处理速度不同的进程之间的数据传输资源共享:多个进程之间共享同样的资源,一个进程对共享数据的修改,…...
【二叉树算法题记录】222. 完全二叉树的节点个数
题目描述 给你一棵 完全二叉树 的根节点root ,求出该树的节点个数。 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位…...
每日新闻掌握【2024年5月6日 星期一】
2024年5月06日 星期一 农历三月廿八 大公司/大事件 多个品牌黄金优惠后价格重回600元/克以下 “五一”假期期间,记者走访调研黄金消费市场发现,受国际金价回落及“五一”假期促销等多重因素影响,终端黄金价格出现了较为明显的回落。包括周大…...
谈谈Tcpserver开启多线程并发处理遇到的问题!
最近在学习最基础的socket网络编程,在Tcpserver开启多线程并发处理时遇到了一些问题! 说明 在linux以及Windows的共享文件夹进行编写的,所以代码中有的部分使用 #ifdef WIN64 ... #else ... #endif 进入正题!!&…...
618好物节不知道买什么?快收下这份好物推荐指南!
随着618好物节的临近,你是否在为选择什么产品而犹豫不决?不用担忧,我精心准备了一份购物指南,旨在帮助你发现那些性价比高、口碑爆棚的商品。无论是科技新品还是生活小物件,这份指南都能帮你快速定位到那些值得投资的好…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
