参考路径:
\\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;
}
枚举
参考:https://blog.csdn.net/a530791614/article/details/48735923