我实现了以下代码来保护使用 cmregistercallback
的注册表。
当“Windows Registry Edit”访问注册表时,我的代码运行良好。
但是当我使用 cmd - sc delete 'service'
获得管理员权限时,注册表被删除了。
NTSTATUS RegistryFilterCallback(IN PVOID _CallbackContext, IN PVOID _FuncClass, IN PVOID _RegKeyInfo)
{
UNREFERENCED_PARAMETER(_CallbackContext);
NTSTATUS Status = STATUS_SUCCESS;
REG_NOTIFY_CLASS NotifyClass = (REG_NOTIFY_CLASS)(ULONG_PTR)_FuncClass;
if (IsAllowProcess()== TRUE)
{
return Status;
}
switch (NotifyClass)
{
case RegNtPreOpenKeyEx:
{
PREG_CREATE_KEY_INFORMATION RegInfo = (PREG_CREATE_KEY_INFORMATION)_RegKeyInfo;
if (RegPreOpenKey(RegInfo->RootObject, RegInfo->CompleteName))
{
DbgPrint("RegNtPreOpenKeyEx : Prevent Opening Handle\n");
Status = STATUS_ACCESS_DENIED;
}
break;
}
case RegNtPreDeleteKey:
{
DbgPrint("RegNtDeleteKey : Prevent delete Handle\n");
Status = MyDeleteKey((PUNICODE_STRING)_RegKeyInfo);
break;
}
case RegNtPreDeleteValueKey:
DbgPrint("RegNtPreDeleteValueKey : Prevent delete Handle\n");
break;
case RegNtPreUnLoadKey:
DbgPrint("RegNtPreUnLoadKey : Prevent delete Handle\n");
break;
}
return Status;
}
最佳答案
我不知道 IsAllowProcess
的作用,但它可能只会阻止“用户进程”?
SCM 作为系统运行,它可能会删除注册表项,而不是 sc.exe。
管理员可以使用各种技巧将 cmd.exe 实例作为系统启动。真正的解决方案是不要给不受信任的用户管理员帐户。
关于c - 如何保护注册表不使用 deleteservice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57304687/