参考路径:
\\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,
hive大量小文件处理方法总结苹果不送充填器耳机真为环保?可能还是为了赚钱吧 Unity3D Input按键系统灰色预测使用正交表法设计测试用例函数基本定义和使用‘未完待续face_recognition的5个应用实例VaR - 风险价值 - 蒙特卡罗法 - Python一个猜数字的小游戏,用JavaScript实现k8s入门到放弃--k8s重要概念