使用 ZwSetValueKey 来进行注册表键值的写操作,写操作是并不需要键已经存在,如果已存在则覆盖值.
步骤 ZwOpenKey -> ZwSetValueKey
ZwSetValueKey(
_In_ HANDLE KeyHandle,//注册表键句柄
_In_ PUNICODE_STRING ValueName,//键名
_In_opt_ ULONG TitleIndex,//始终为零
_In_ ULONG Type,//类型?
_In_reads_bytes_opt_(DataSize) PVOID Data,//执行开始写入数据的地址,可以是任意数据,不管类型是什么都可以
_In_ ULONG DataSize//数据的长度
);
返回结果:
#include
VOID DriverUnload(PDRIVER_OBJECT driver){
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
//注册表键句柄
HANDLE mykey = NULL;
//函数执行的返回结果
NTSTATUS status;
//静态定义要获取的注册表路径
UNICODE_STRING mykeypath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
//注册表对象属性,包涵注册表路径名称
OBJECT_ATTRIBUTES myobjattr = { 0 };
//初始化 OBJECT_ATTRIBUTES
InitializeObjectAttributes(&myobjattr, &mykeypath,OBJ_CASE_INSENSITIVE,NULL,NULL);
//打开注册表Key
status = ZwOpenKey(&mykey, KEY_READ, &myobjattr);
if (!NT_SUCCESS(status)){
DbgPrint("misaka: open regeditkey failed\r\n");
}
//要写的键
UNICODE_STRING name = RTL_CONSTANT_STRING(L"misaka");
//要写的值
PWCHAR value = { L"hello , this is a misaka value" };
//写入注册表数据,加1是加上空结束符
status = ZwSetValueKey(mykey,&name,0,REG_SZ,value,(wcslen(value)+1)*sizeof(WCHAR));
if (!NT_SUCCESS(status)){
DbgPrint("misaka: this is error !\r\n");
}
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
结果成功写入 键 misaka 值 misaka: open regeditkey failed 到对应注册表,重启系统数据还在!