x64驱动操作注册表

参考路径:

\\Registry\\Machine\\Software\\Test

创建注册表目录

HANDLE create_regedit_dir(UNICODE_STRING registryPath) {
    
    

	// 初始化
	OBJECT_ATTRIBUTES objectAttributes = {
    
     0 };
	InitializeObjectAttributes(
		&objectAttributes, 						// 返回 OBJECT_ATTRIBUTES 结构体指针
		&registryPath, 								// 注册表路径
		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 结构体指针
		&registryPath, 								// 注册表路径
		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;
}

猜你喜欢

转载自blog.csdn.net/Simon798/article/details/107771060
今日推荐