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

一、前言

大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关。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

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

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

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

l        在链接时以库的方式引入

其中,如果代码需要在系统为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帮助文档。

时间: 2024-10-21 15:33:29

驱动开发中使用安全字符串函数的相关文章

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

参考链接:http://www.cppblog.com/aurain/archive/2009/09/27/97363.html 一.前言 大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关.c/c++语言运行库提供的标准字符串操作函数(strcpy, strcat, sprintf等)不能阻止在超出字符串尾端的写入. 基于Windows XP SP1以及随后的操作系统的Windows DDK版本提供了安全字符串函数(safe strin

项目开发中常用的PHP函数

日期操作 为了便于存储.比较和传递,我们通常需要使用strtotime()函数将日期转换成UNIX时间戳,只有在显示给用户看的时候才使用date()函数将日期转换成常用的时间格式. strtotime()  函数将任何英文文本的日期时间描述解析为 Unix 时间戳 eg: <?php echo(strtotime("now")); echo(strtotime("3 October 2005")); echo(strtotime("+5 hours&

iOS开发中常用的数学函数

/*---- 常用数学公式 ----*/ //指数运算 3^2 3^3 NSLog(@"结果 %.f", pow(3,2)); //result 9 NSLog(@"结果 %.f", pow(3,3)); //result 27 //开平方运算 NSLog(@"结果 %.f", sqrt(16)); //result 4 NSLog(@"结果 %.f", sqrt(81)); //result 9 //进一 NSLog(@&q

PHP开发中常用的字符串操作函数

1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行定义,这样做是比较有好处的. 2,替换字符串 在PHP这门语言中,提供了一个名字叫做substr_replace()的函数,该函数的作用可以快速的完成扫描和编辑文本内容较多的字符串替换功能.他的语法格式: mixed substr_replace(mixed $string,string $repl

如何在前端模版引擎开发中避免使用eval函数

前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用.于是根据自己对模版引擎的理解,定义自己的模版格式,然后,根据自己定义的格式,编写处理函数,将模版标签中的字符串,解析成可执行的字符串,然后再用eval函数执行该可执行的字符串. 然后问题就出现了!eval等价于evil! 为什么呢?各大js权威书籍上都不提倡使用eval.下面我详细的解释一下为什么不提倡. 首先,大家需要知道,js并不是一门解释型语言.它和其他大家熟知的编程语言(c,java,c++)一样,是编译型语言.但是

Sql Server中常用的字符串函数

len(expression) 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格. datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格length(expression,variable)指定字符串或变量名称的长度.substring(expression,start,length) 不多说了,取子串right(char_expr,int_expr) 返回字符串右边int_expr个字符concat(str1,str2,...)返回来自于参数连结

PHP中常用的字符串函数str

1 字符串大小写函数 strtoupper($str) strtolower($str) 2 字符串切割函数 explode(',',$str) join(',',$str) implode(',',$str) 3 字符串长度函数 strlen($str) 4 字符串重复函数 str_repeat($str,2) 5 字符串首字符大写 ucfirst($str) 6 字符串单词首字符大写 ucwords($str) 7 去除两边指定字符 trim($str,',.?!') ltrim($str,

开发中遇到的jquery函数应用和表单验证处理

整理前端js笔记第一篇! form 表单提交 $(".submit").removeAttr.('onclick'); $('[name="form表单名"]').submit; 获取input的id $('#id').val(); 获取input的name $('[name="name值"]').val(); each方法为每个元素匹配元素规定的函数 $("li").each(function()){ } //为li标签匹配

iOS 开发中字典和字符串的转换

1.字符串转字典 NSString * jsonString = @""; NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; 2.字典转字符串 S