首页
社区
课程
招聘
未解决 驱动中使用ZwSetValueKey写入注册表键值返回没有权限(0xC0000022)
发表于: 2019-3-27 21:39 3383

未解决 驱动中使用ZwSetValueKey写入注册表键值返回没有权限(0xC0000022)

2019-3-27 21:39
3383
驱动中使用 ZwSetValueKey 写入注册表键值,部分系统写入成功没有任何问题,但是有些系统执行写入函数后返回  STATUS_ACCESS_DENIED(0xC0000022)  提示没有权限。
在 PCHunter 中操作注册表写入键值又没有问题,各位带哥这样的问题应该怎么处理?想要在百度/谷歌搜索一些资料做参考但是没找到...

写入键值代码:
NTSTATUS SetRegistryValueKey()
{
	HANDLE KeyHandle = NULL;
	NTSTATUS Status = STATUS_SUCCESS;
	//UNICODE_STRING KeyPath = G_KeyPath;//RTL_CONSTANT_STRING(L"\\Registry\\User\\S-1-5-21-4212467076-4147758605-2199231723-1000\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");//S-1-5-21-361059460-2165877035-28880545-500 
	OBJECT_ATTRIBUTES ObjectAttributes;
	UNICODE_STRING SourceKeyName = RTL_CONSTANT_STRING(L"TmpURL");
	UNICODE_STRING TargetKeyName = RTL_CONSTANT_STRING(L"AutoConfigURL");
	PKEY_VALUE_PARTIAL_INFORMATION AcKeyInfo = NULL;
	KEY_VALUE_PARTIAL_INFORMATION KeyInfo;
	ULONG Length = 0;

	//初始化OBJECT_ATTRIBUTES结构体
	InitializeObjectAttributes(
		&ObjectAttributes,
		&Globals_KEYPATH,
		OBJ_CASE_INSENSITIVE,
		NULL,
		NULL);

	//打开注册表键
	Status = ZwOpenKey(&KeyHandle, /*KEY_READ | KEY_WRITE*/KEY_ALL_ACCESS, &ObjectAttributes);
	if (!NT_SUCCESS(Status))
	{
		DbgPrint("打开注册表键失败!! -- %#X\n", Status);
		return Status;
	}



	//第一次读取注册表键值探测数据大小
	Status = ZwQueryValueKey(
		KeyHandle,
		&SourceKeyName,
		KeyValuePartialInformation,
		&KeyInfo,
		sizeof(KEY_VALUE_PARTIAL_INFORMATION),
		&Length);
	if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_OVERFLOW && Status != STATUS_BUFFER_TOO_SMALL)
	{
		DbgPrint("读取 AutoConfigURL 键值失败!! - %#X\n", Status);
		ZwClose(KeyHandle);
		return Status;
	}

	//根据上面探测的注册表键值大小动态分配内存
	AcKeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePoolWithTag(NonPagedPool, Length, "tag2");
	if (NULL == AcKeyInfo)
	{
		DbgPrint("在分配保存键值的内存空间时失败!!");
		ZwClose(KeyHandle);
		Status = STATUS_INSUFFICIENT_RESOURCES;
		return Status;
	}

	//再次读取注册表键值
	Status = ZwQueryValueKey(
		KeyHandle,
		&SourceKeyName,
		KeyValuePartialInformation,
		AcKeyInfo,
		Length,
		&Length);
	if (!NT_SUCCESS(Status))
	{
		DbgPrint("读取 AutoConfigURL 键值失败!! - %#X\n", Status);
		ZwClose(KeyHandle);
		ExFreePool(AcKeyInfo);
		return Status;
	}

	//写入注册表值
	Status = ZwSetValueKey(
		KeyHandle,
		&TargetKeyName,
		0,
		AcKeyInfo->Type,
		AcKeyInfo->Data,
		AcKeyInfo->DataLength);
	if (!NT_SUCCESS(Status))
	{
		DbgPrint("写入目标键值失败!! - %#X\n", Status);
		ZwClose(KeyHandle);
		ExFreePool(AcKeyInfo);
		return Status;
	}

	DbgPrint("AutoConfigURL 已写入新值!!\n");

	//释放内存与句柄
	ZwClose(KeyHandle);
	ExFreePool(AcKeyInfo);
	return Status;
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-3-28 16:21 被CharlesXYZ编辑 ,原因: 贴入相关代码
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 6694
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
代码问题, 贴代码 看看。
2019-3-28 00:02
0
雪    币: 167
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
zhatian 代码问题, 贴代码 看看。
代码贴在上面了,注册表是被锁定了没有办法写入新值;试过了用火绒剑也不能写入,PCHunter倒是能写入。
2019-3-28 16:26
0
雪    币: 6694
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
CharlesXYZ 代码贴在上面了,注册表是被锁定了没有办法写入新值;试过了用火绒剑也不能写入,PCHunter倒是能写入。
写入到 别人保护的 key?   
2019-3-28 16:38
0
雪    币: 167
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
zhatian 写入到 别人保护的 key?
在他的角度可能是他保护的key吧,强制写入了一个PAC地址进去访问的一些特定URL全都通过HTTP代理跳转到另一个URL了。
2019-3-28 16:43
0
雪    币: 1036
活跃值: (1316)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
6
RtlWriteRegistryValue 一个函数就搞定的。
2019-3-28 16:46
0
雪    币: 6694
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
CharlesXYZ 在他的角度可能是他保护的key吧,强制写入了一个PAC地址进去访问的一些特定URL全都通过HTTP代理跳转到另一个URL了。
被保护的key 就不能直接写入。 你那份代码没用了。
2019-3-28 17:07
0
雪    币: 167
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
zhatian 被保护的key 就不能直接写入。 你那份代码没用了。
RtlWriteRegistryValue 可以直接写入被保护的KEY吗?在虚拟机里面试过了 RtlWriteRegistryValue 可以写入新值,晚上回去才能在被锁的机器上测试。
2019-3-28 17:26
0
雪    币: 6694
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
CharlesXYZ RtlWriteRegistryValue 可以直接写入被保护的KEY吗?在虚拟机里面试过了 RtlWriteRegistryValue 可以写入新值,晚上回去才能在被锁的机器上测试。[em_2]
那行不行呢?
2019-3-28 22:14
0
雪    币: 167
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
zhatian 那行不行呢?
我用WKE关掉了注册表的回调之后可以直接写入注册表,但是这个怎么能找到具体是哪里的回调呢?
2019-3-29 17:25
0
雪    币: 6694
活跃值: (4172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
CharlesXYZ 我用WKE关掉了注册表的回调之后可以直接写入注册表,但是这个怎么能找到具体是哪里的回调呢?
可以关掉就好,你管他是哪个回调呢。  又不用到商业级,其实没什么的。
2019-3-29 18:39
0
游客
登录 | 注册 方可回帖
返回
//