[NT API] Open Any Registry Key for Full Access

#define WIN32_NO_STATUS
#include <Windows.h>
#include <..\ndk\ntndk.h>
#include "global.h"


NTSTATUS openKeyAllAccess(PHANDLE pKeyHandle, PUNICODE_STRING pFullKeyPath) {
OBJECT_ATTRIBUTES keyAttr;


ULONG privsToEnable[] = { SE_BACKUP_PRIVILEGE, SE_RESTORE_PRIVILEGE };
BOOLEAN oldPrivState[sizeof(privsToEnable) / sizeof(ULONG)] = { 0 };


NTSTATUS status = STATUS_NOT_ALLOWED_ON_SYSTEM_FILE;


if (!pKeyHandle || !pFullKeyPath)
return STATUS_INVALID_PARAMETER;


for (ULONG i = 0; i < sizeof(privsToEnable) / sizeof(ULONG); i++) {
status = RtlAdjustPrivilege(privsToEnable[i], TRUE, FALSE, &oldPrivState[i]);
if (status) {
for (i = 0; i < sizeof(privsToEnable) / sizeof(ULONG); i++)
RtlAdjustPrivilege(privsToEnable[i], oldPrivState[i], FALSE, &oldPrivState[i]);


*pKeyHandle = NULL;
return status;
}
}

InitializeObjectAttributes(&keyAttr, pFullKeyPath, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = NtOpenKeyEx(pKeyHandle, KEY_ALL_ACCESS, &keyAttr, REG_OPTION_BACKUP_RESTORE);
if (status)
*pKeyHandle = NULL;


for (ULONG i = 0; i < sizeof(privsToEnable) / sizeof(ULONG); i++)
RtlAdjustPrivilege(privsToEnable[i], oldPrivState[i], FALSE, &oldPrivState[i]);

return status;
}


void mymain(void){
UNICODE_STRING uKeyFullName;


NTSTATUS status = STATUS_NOT_ALLOWED_ON_SYSTEM_FILE;
HANDLE hTestKey = INVALID_HANDLE_VALUE;


RtlInitUnicodeString(&uKeyFullName, L"\\Registry\\Machine\\SECURITY\\Policy");
status = openKeyAllAccess(&hTestKey, &uKeyFullName);


NtRaiseHardError(status, 0, 0, NULL, 0, (PULONG)&status);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值