目录
内存中字符串编程
一丶 UNICODE_STRING 讲解
1.1 简介
1.2 字符串的操作函数
1.3UNICODE_STRING 的使用
1.3.3 堆上初始化一个缓冲区.
内存中字符串编程
一丶 UNICODE_STRING 讲解
1.1 简介
在内核中. 我们的字符有 char 类型的. 也有 wchar_t 类型的. 分别是宽字符
跟窄字符. 但是这种都不建议使用了. 而内核提供了两个新的结构体让我们使用
分别别:
- UNICODE_STRING
- ANSI_STRING
随便哪个结构体进行简介.
- typedef struct _UNICODE_STRING {
- USHORT Length;
- USHORT MaximumLength;
- PWSTR Buffer;
- } UNICODE_STRING, *PUNICODE_STRING;
内核中的 UNICODE_STRING 其实是个结构体.
简介一下:
参数一: 字符串的字节数. 不带 \ 0 结尾的字节数. 注意是字节数
参数二: Buffer 的最大字节数. 如果 Buffer 存储字符串. 那么字节数就是
wcslen(Buffer)+sizeof(wchar_t) 也就是说说带 \ 0 结尾.
参数三: Buffer 缓冲区. 存放字符串的指针.
1.2 字符串的操作函数
既然有了这些结构体. 那么就会有相应的提供操作字符串的函数.
如我们在 WDK 文档查询这个结构体的时候.
下面就会有个 See Also 告诉我们字符串操作相关的一系列函数.
函数名 | 作用 | |
---|---|---|
RtlUnicodeStringInit | 安全的初始化 UNICODE_STRING. 不安全的有 RtlinitUnicodeString. 安全的动词放后面 | |
RtlStringCbCopyUnicodeString | 将 UNICODE_STRING 按照字节大小, 拷贝到一个 wchar_t 的缓冲区中 | |
RtlUnicodeStringCat | 拼接一个 UNICODE_STRIGN | |
RtlUnicodeStringCatString | 将 UNICODE_STRING 拼接一个 PCTSTR 的字符串. | |
RtlUnicodeStringCbCatN | 都是传入两个 UNICODE_STRING 结构体. 多了一个参数. 这个参数指定你要拼接的字节数进行拼接. 不用完整拼接了. |
具体函数查询 WDK 帮助文档即可.
1.3UNICODE_STRING 的使用
说的 UNICODE_STRING 的使用. 这里需要注意一下.
1.3.1 在栈上初始化一个 Buffer
- UNICODE_STRING TestUCString = [0];
- WCHAR wzData[0x100] = L"Hello World""
- RtlInitUnicodeString(&TetUCString,wzData);
这样初始化的方式. 是将 UNICODE_STRING 的 Buffer 指针指向栈内存.
伪代码:
Buffer = wzData;
最重要的一点就是此时你可以使用 Rtl 拷贝函数对这个 UNICODE_STRING 进行操作了.
因为内存是有的.
RtlUnicodeStringCopyString 是可以对这个内存进行拷贝的.
1.3.2 全局初始化
- UNICODE_STRING ustr;
- RtlUnicodeStringInit(&ustr,L"HelloWorld");
此时的 UNICODE_STRING 里面的 Buffer 指针是指向全局常量区的 HelloWorld 的. 所以此时你使用拷贝函数就会出错. 很可能就会蓝屏
1.3.3 堆上初始化一个缓冲区.
- UNICODE_STRING ustr = {0};
- ULONG length = (wcslen(L"HelloWorld") + ) * sizeof(WCHAR);
- ustr.Buffer = ExAllocatePoolWithTag(PagedPool,MAX_PATH 8 sizeof(WCHAR),"niBI");
- if (ustr.Buffer == NULL)
- return ;
清空缓存
- RtlZeroMemory(ustr.Buffer,MAX_PATH *sizeof(WCHAR));
- wcscpy(ustr.Buffer,L"HelloWorld");
- ustr.length = length;
- ustr.Maximumlength = MAX_PATH * sizeof(WCHAR);
- DbgPrint("%wZ",&ustr);
- ExFreePool(ustr.Buffer);
上面的 UNICODE_STRING 的 Buffer 指向一个堆内存. 这个内存是我们分配的.
来源: http://www.bubuko.com/infodetail-3086330.html