驱动开发中使用安全字符串函数

转载 2015年07月08日 13:10:11

一、前言

       大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关。c/c++语言运行库提供的标准字符串操作函数(strcpy, strcat, sprintf等)不能阻止在超出字符串尾端的写入。

       基于Windows XP SP1以及随后的操作系统的Windows DDK版本提供了安全字符串函数(safe string functions)。这类函数被设计的目的是用来取代相同功能的c/c++标准函数和其它微软提供的库函数。这类函数具有以下特征:

  • 每个函数以目标缓冲区所占的字节大小作为其一个输入参数,因此可以保证在写入时不会超出缓冲区末端。
  • 每个函数的输出字符串均以NULL结尾(null-terminate),即使该函数可能会对正确的结果进行截断。
  • 所有函数均有返回值,类型为NTSTATUS,只有返回STATUS_SUCCESS时,操作结果才正确。
  • 每个函数均有两种类型的版本,按字节或者按字符数。例如,RtlStringCbCatWRtlStringCchCatW
  • 每个函数均有支持双字节的unicode字符(以W作为后缀)和单字节的ANSI字符(以A作为后缀)的版本。例如:RtlStringCbCatWRtlStringCbCatA
  • 大部分函数有提供扩展版本的函数(以Ex作为后缀),例如,RtlStringCbCatWRtlStringCbCatExW

二、如何在内核驱动代码中引入安全字符串函数

    有两种方式可以引入安全字符串函数:

           以内联的方式引入,包含在ntstrsafe.h中

           在链接时以库的方式引入

       其中,如果代码需要在系统为Windows XP及以后版本运行时,可以使用内联的方式;如果代码需要运行在早于Windows XP时,则必须使用链接库的方式。

以内联方式引入

只需包含头文件即可

#include <ntstrsafe.h>

以链接库的方式

  1. 在包含头文件之前先定义宏

#define NTSTRSAFE_LIB

#include <ntstrsafe.h>

  1. 在项目的sources文件中,添加一TARGETLIBS条目如下: $(DDK_LIB_PATH)\ntstrsafe.lib.

在默认情况下,当引入了安全字符串函数后,那些被取代的c/c++运行库函数将变得无效,编译是会报错,提示需要使用安全字符串函数。

    如果还希望继续使用c/c++运行库函数,即在使用安全字符串函数的时候,c/c++运行库函数还可以继续使用,则需要在包含ntstrsafe.h之前先定义宏NTSTRSAFE_NO_DEPRECATE

#define NTSTRSAFE_NO_DEPRECATE

The maximum number of characters that any ANSI or Unicode string can contain is STRSAFE_MAX_CCH. This constant is defined in ntstrsafe.h.

字符串最长长度为STRSAFE_MAX_CCH,该宏在ntstrsafe.h中定义。另外,如果一个字符串需要被转换成UNICODE_STRING结构,则该字符串长度不能超过65535.

三、内核模式安全字符串函数概述

    下表概述了可以在内核驱动中使用的安全字符串函数,并指明了它们用来何种类型的c/c++运行库函数。

说明:

函数名含有Cb的是以字节数为单位,含有Cch的是以字符数为单位。

函数名

作用

取代

RtlStringCbCat
RtlStringCbCatEx
RtlStringCchCat
RtlStringCchCatEx

将源字符串连接到目的字符串的末尾

strcat
wcscat

RtlStringCbCatN
RtlStringCbCatNEx
RtlStringCchCatN
RtlStringCchCatNEx

将源字符串指定数目的字符连接到目的字符串的末尾

strncat
wcsncat

RtlStringCbCopy
RtlStringCbCopyEx
RtlStringCchCopy
RtlStringCchCopyEx

将源字符串拷贝到目的字符串

strcpy
wcscpy

RtlStringCbCopyN
RtlStringCbCopyNEx
RtlStringCchCopyN
RtlStringCchCopyNEx

将源字符串指定数目的字符拷贝到目的字符串

strncpy
wcsncpy

RtlStringCbLength
RtlStringCchLength

确定字符串的长度

strlen
wcslen

RtlStringCbPrintf
RtlStringCbPrintfEx
RtlStringCchPrintf
RtlStringCchPrintfEx

格式化输出

sprintf
swprintf
_snprintf
_snwprintf

RtlStringCbVPrintf
RtlStringCbVPrintfEx
RtlStringCchVPrintf
RtlStringCchVPrintfEx

可变格式化输出

vsprintf
vswprintf
_vsnprintf
_vsnwprintf

各个函数的作用可以通过它所取代的c/c++函数可以大概看出,具体用法请查阅DDK帮助文档。

 

补充:

对于UNICODE_STRING类型的字符串,DDK中有另一套安全函数,以下是操作UNICODE_STRING的全部函数:

 

原文连接:

http://www.cppblog.com/aurain/archive/2009/09/27/97363.html

汇编实现的加减乘除四则运算

;本程序综合多种子程序传参法,包括寄存器传参,地址表传参,堆栈传参data segment    num1Message db please input num1:,$        num2Mess...

对几种函数调用约定的总结

  在DLL的调用中,要特别注意调用约定的不同,在windows中,有__cdecl,__stdcall,__fastcall等几种调用约定。#include int fun();int main(i...

驱动开发中使用安全字符串函数

一、前言        大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关。c/c++语言运行库提供的标准字符串操作函数(strcpy, s...

驱动开发中使用安全字符串函数

转自:http://www.cppblog.com/sleepwom/archive/2009/09/27/97402.html驱动开发中使用安全字符串函数一、前言  大量的系统安全问题是由于薄弱的缓...

驱动开发中使用安全字符串函数

一、前言        大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关。c/c++语言运行库提供的标准字符串操作函数(strcpy, st...
  • whatday
  • whatday
  • 2015年09月23日 14:09
  • 971

驱动开发 常用字符串操作函数

#ifndef __KFunction_String__ #define __KFunction_String__ #include /*******************...

驱动开发(5)内核中的字符串

在驱动开发中,内核函数使用的字符串不再是应用程序使用的Win32子系统API和Native API中的char*和wchar_t*,而是内核Unicode字符串UNICODE_STRING。 内核字符...

Windows驱动开发(3) - 内核模式下的字符串操作

Windows驱动开发(3) - 内核模式下的字符串操作1、ASCII字符串和宽字符串  char型,记录ansi字符集。每个字符一个字节。以0标志结束。在KdPrint中用%s输出。   宽字符型...

驱动开发之字符串操作

WDM驱动程序可以使用下面4种格式的字符串: Unicode串,由UNICODE_STRING结构描述,包含16位字符。Unicode有足够的代码空间编码地球上所有语言的字型。参见http:/...

windows内核安全与驱动开发光盘

  • 2015年08月17日 14:23
  • 4.76MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:驱动开发中使用安全字符串函数
举报原因:
原因补充:

(最多只允许输入30个字)