Windows内核:读注册表键的值
2017-04-20 16:54
52 查看
今天 , 调试了一下读注册表键的值,有一个很有意思的发现实际需要长度aclength 和 输入长度DataLength可以是不一样的(虽然无法解释 ,但不影响使用)
打印键值直接采用
RtlInitUnicodeString(&value, ac_key_infor->Data);
KdPrintEx((DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, "%wZ", &value));
Data确实是可变长度的数组啊 !! 因为数据结构里,他起先只是一个长度的数组 UCHAR DATA[1].
#include <ntddk.h>
#include <Ntstrsafe.h>
#include "set.h"
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
HANDLE my_key;
NTSTATUS status;
driver->DriverUnload = DU;
UNICODE_STRING my_key_path = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
OBJECT_ATTRIBUTES my_obj_attr = { 0 };
InitializeObjectAttributes(&my_obj_attr, &my_key_path, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = ZwOpenKey(&my_key, KEY_READ, &my_obj_attr);
if (!NT_SUCCESS(status)){
}
UNICODE_STRING my_key_name = RTL_CONSTANT_STRING(L"SystemRoot");
KEY_VALUE_PARTIAL_INFORMATION key_infor;
PKEY_VALUE_PARTIAL_INFORMATION ac_key_infor = &key_infor;
ULONG aclength = 0;
UNICODE_STRING value;
status = ZwQueryValueKey(my_key ,&my_key_name , KeyValuePartialInformation,&key_infor ,
sizeof(KEY_VALUE_PARTIAL_INFORMATION) ,&aclength);
ULONG temp = sizeof(KEY_VALUE_PARTIAL_INFORMATION);
//失败
//如果没有失败则分配足够的空间再次读取
ac_key_infor = ExAllocatePoolWithTag(NonPagedPool, aclength, MEM_TAG);
status = ZwQueryValueKey(my_key, &my_key_name, KeyValuePartialInformation, ac_key_infor,
aclength, &aclength);
RtlInitUnicodeString(&value, ac_key_infor->Data);
KdPrintEx((DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, "%wZ", &value));
}
打印键值直接采用
RtlInitUnicodeString(&value, ac_key_infor->Data);
KdPrintEx((DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, "%wZ", &value));
Data确实是可变长度的数组啊 !! 因为数据结构里,他起先只是一个长度的数组 UCHAR DATA[1].
#include <ntddk.h>
#include <Ntstrsafe.h>
#include "set.h"
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
HANDLE my_key;
NTSTATUS status;
driver->DriverUnload = DU;
UNICODE_STRING my_key_path = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
OBJECT_ATTRIBUTES my_obj_attr = { 0 };
InitializeObjectAttributes(&my_obj_attr, &my_key_path, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = ZwOpenKey(&my_key, KEY_READ, &my_obj_attr);
if (!NT_SUCCESS(status)){
}
UNICODE_STRING my_key_name = RTL_CONSTANT_STRING(L"SystemRoot");
KEY_VALUE_PARTIAL_INFORMATION key_infor;
PKEY_VALUE_PARTIAL_INFORMATION ac_key_infor = &key_infor;
ULONG aclength = 0;
UNICODE_STRING value;
status = ZwQueryValueKey(my_key ,&my_key_name , KeyValuePartialInformation,&key_infor ,
sizeof(KEY_VALUE_PARTIAL_INFORMATION) ,&aclength);
ULONG temp = sizeof(KEY_VALUE_PARTIAL_INFORMATION);
//失败
//如果没有失败则分配足够的空间再次读取
ac_key_infor = ExAllocatePoolWithTag(NonPagedPool, aclength, MEM_TAG);
status = ZwQueryValueKey(my_key, &my_key_name, KeyValuePartialInformation, ac_key_infor,
aclength, &aclength);
RtlInitUnicodeString(&value, ac_key_infor->Data);
KdPrintEx((DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, "%wZ", &value));
}
相关文章推荐
- Windows内核函数(3) - 内核模式下的注册表操作
- Windows驱动开发(5) - 内核模式下的注册表操作
- 【Windows内核驱动开发】——读取注册表
- VB 通过API访问 Windows 注册表
- 深入 WIN2000注册表 (11) Windows 2000的安全
- 关于Windows内核空间操作的一些说明
- windows 9X, 2000, xp所有版本注册表设置(1)
- (转载)Gloomy对Windows内核的分析(研究CreateProcess)
- windows 9X, 2000, xp所有版本注册表设置(2)
- [导入]windows注册表!
- 使用Java操作Windows注册表
- java操纵windows注册表
- (转载)获取Windows 系统的内核变量
- Windows注册表背后的秘密!!!
- 关于Windows内核空间操作的一些说明
- 在Windows平台的WebSphere Application Server 5版本中使用本地操作系统作为用户注册表启用全局安全性失败
- Windows注册表修改技巧
- 装载修改过的WINDOWS系统内核程序(WIN2000)
- win9x内核后门开发技术之注册表保护
- (转载)Gloomy对Windows内核的分析(介绍)