当前位置: 首页 > news >正文

内蒙古建设住房与城乡厅官方网站百度一下你就知道了

内蒙古建设住房与城乡厅官方网站,百度一下你就知道了,万网官网域名注册多少钱,软件开发文档的重要性使用安全字符串函数 和应用层不一样的是,windows内核完全使用Unicode字符串,许多支持AsciiC的windowsAPI,是在应用层完成项Unicode的切换的。许多系统安全问题是由缓冲区处理不善和生成的缓冲区溢出引起的。 糟糕的缓冲区处理通常与字符串操…
使用安全字符串函数

和应用层不一样的是,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 系统编译驱动程序时,无需更改代码。

http://www.hkea.cn/news/272216/

相关文章:

  • 毕业设计餐饮网站建设国内前10电商代运营公司
  • 日本b2b网站市场调研的步骤
  • 强企网做网站网店推广有哪些
  • 博物馆网站建设策划书公司如何在百度宣传
  • 做cpa广告网站教程百度sem推广具体做什么
  • 免费网站建站WWW222国际军事最新消息今天
  • 做网站软件miscrosoft云服务器
  • 如何做盗版小说网站最经典的营销案例
  • 设计类的网站和简介关键词优化推广排名多少钱
  • 代理记账网站怎么做北京seo方法
  • cdr做网站企业网站建设的基本流程
  • 网站建设需要哪些硬件百度指数排名
  • 2017年网站开发用什么语言找培训机构的app
  • 澳门响应式网站建设seo入门黑帽培训教程
  • 有哪些网站可以做微商口碑营销案例2021
  • 百度推广要不要建网站网络平台建设及运营方案
  • 大型网站开发考试查网址
  • 网站建设业务市场营销论文搜索优化
  • 黄页88企业名录seo怎么优化武汉厂商
  • 触摸屏网站如何做泰州seo网络公司
  • 银川app购物网站制作公司搜狗收录入口
  • 做单页网站要多少钱wordpress免费网站
  • 网站建设性价比高优化设计官网
  • 电脑手机网站相互跳转西安seo关键词排名优化
  • 一般做网站用什么字体比较合适搜索引擎营销是什么
  • 去什么网站发贴做推广seo及网络推广招聘
  • 如何批量建站什么是互联网营销
  • 哈尔滨网站建设如何搭建一个网站平台
  • 哪些网站可以做任务网络营销推广的基本手段
  • 互联网舆情报告什么是seo营销