【轉】核心安全字元函數

來源:互聯網
上載者:User

標籤:

 

原帖 驅動開發中使用安全字串函數

一、前言

       大量的系統安全問題是由於薄弱的緩衝處理以及由此產生的緩衝區溢位造成的,而薄弱的緩衝區處理常常與字串操作相關。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協助文檔。

【轉】核心安全字元函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.