参考路径:
\\Registry\\Machine\\Software\\Test
<>创建注册表目录
HANDLE create_regedit_dir(UNICODE_STRING registryPath) { // 初始化
OBJECT_ATTRIBUTES objectAttributes= { 0 }; InitializeObjectAttributes( &
objectAttributes, // 返回 OBJECT_ATTRIBUTES 结构体指针 ®istryPath, // 注册表路径
OBJ_CASE_INSENSITIVE, // 第二个参数不区分大小写 NULL, // 根对象目录的句柄 NULL // 安全描述符 ); //
创建注册表目录 HANDLE h_register = NULL; ULONG create_or_open = 0; if (ZwCreateKey( &
h_register, // 接收注册表键句柄的指针 KEY_ALL_ACCESS, // 访问权限 &objectAttributes, //
OBJECT_ATTRIBUTES 对象 0, // 设备和驱动程序将此参数置 0 NULL, // 注册表键对象类名
REG_OPTION_NON_VOLATILE, // 重启保留,(不保留:REG_OPTION_VOLATILE) &create_or_open //
创建新注册表,还是打开现有注册表 ) != STATUS_SUCCESS) { DbgPrint("[LYSM] ZwCreateKey failed. \n"
); goto badEnd; } return h_register; badEnd: if(h_register) ZwClose(h_register);
return 0; }
<>打开现有注册表目录
HANDLE open_regedit_dir(UNICODE_STRING registryPath) { // 初始化
OBJECT_ATTRIBUTES objectAttributes= { 0 }; InitializeObjectAttributes( &
objectAttributes, // 返回 OBJECT_ATTRIBUTES 结构体指针 ®istryPath, // 注册表路径
OBJ_CASE_INSENSITIVE, // 第二个参数不区分大小写 NULL, // 根对象目录的句柄 NULL // 安全描述符 ); //
打开注册表键 HANDLE h_register = NULL; if (ZwOpenKey( &h_register, // 接收注册表键句柄
KEY_ALL_ACCESS, // 访问权限 &objectAttributes // OBJECT_ATTRIBUTES 对象 ) !=
STATUS_SUCCESS) { DbgPrint("[LYSM] ZwOpenKey failed. \n"); goto badEnd; } return
h_register; badEnd: if (h_register) ZwClose(h_register); return 0; }
<>读注册表
BOOLEAN get_regedit_value(HANDLE hReg, UNICODE_STRING keyName) { ULONG size = 0
; PKEY_VALUE_PARTIAL_INFORMATION pvpi = NULL; // 获取接收注册表键需要的缓冲区大小
ZwQueryValueKey(hReg,&keyName, KeyValuePartialInformation,0,0,&size); if (size
== 0) { DbgPrint("[LYSM] ZwQueryValueKey [1] failed. \n"); goto badEnd; }
DbgPrint("[LYSM] size:%d. \n", size); // 读注册表 pvpi = (
PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, size); if (pvpi == NULL
) { DbgPrint("[LYSM] ExAllocatePool failed. \n"); goto badEnd; } if (
ZwQueryValueKey( hReg, // 注册表句柄 &keyName, // 注册表键名 KeyValuePartialInformation,
// 读取部分信息 pvpi, // 接收信息的缓冲区指针 size, // 缓冲区大小 &size // 实际接收的信息长度 ) !=
STATUS_SUCCESS) { DbgPrint("[LYSM] ZwQueryValueKey [2] failed. \n"); goto badEnd
; } DbgPrint("[LYSM] size:%d. \n", size); // 打印 switch (pvpi->Type) { case
REG_SZ: DbgPrint("[LYSM] REG_SZ:%S \n",pvpi->Data); break; case REG_BINARY: for
(INT i = 0; i < pvpi->DataLength; i++) { DbgPrint("[LYSM] REG_BINARY:%x \n", *(
PUCHAR)((ULONG64)pvpi->Data + i)); } break; case REG_DWORD: DbgPrint("[LYSM]
REG_DWORD:%x \n", *(PDWORD32)pvpi->Data); break; case REG_QWORD: DbgPrint(
"[LYSM] REG_QWORD:%p \n", *(PDWORD64)pvpi->Data); break; case REG_MULTI_SZ:
DbgPrint("[LYSM] REG_MULTI_SZ:%S \n",pvpi->Data); break; case REG_EXPAND_SZ:
DbgPrint("[LYSM] REG_EXPAND_SZ:%S \n", pvpi->Data); break; default: break; }
return TRUE; badEnd: if (pvpi) { ExFreePool(pvpi); } return FALSE; }
<>写注册表(REG_SZ 为例)
BOOLEAN set_regedit_value(HANDLE hReg, UNICODE_STRING keyName,WCHAR value[]) {
if (ZwSetValueKey( hReg, // 注册表句柄 &keyName, // 注册表键名 0, // 设备和驱动将此参数置零 REG_SZ,
// 键类型 value, // 要修改的值 (wcslen(value) + 1) * sizeof(WCHAR) // 长度 ) !=
STATUS_SUCCESS) { DbgPrint("[LYSM] ZwSetValueKey failed. \n"); return FALSE; }
return TRUE; }

技术
©2019-2020 Toolsou All rights reserved,
Element-Ui组件 Message 消息提示, alert 弹窗Java:案例理解-接口回调element-ui踩坑记录【Golang 基础系列十】Go 语言 条件语句之if使用css样式设计一个简单的html登陆界面2020顺丰前端暑期实习面经(已过)无孔化就是手机的未来?还有很多问题需要解决【C#】实现学生成绩信息管理系统云原生应用如何做到低成本获得高稳定?用HTML+CSS做一个漂亮简单的个人网页