我试图保护c ++窗口中的进程, 代码是:
#include <iostream>
#include <Aclapi.h>
#include <iostream>
#include <windows.h>
#include <sddl.h>
#include <stdio.h>
using namespace std;
BOOL DenyAccess()
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
SetKernelObjectSecurity(hProcess, DACL_SECURITY_INFORMATION, sa.lpSecurityDescriptor);
return TRUE;
}
int main()
{
while(DenyAccess());
return 0;
}
但是我可以从任务管理器中删除进程!什么错了?
答案 0 :(得分:1)
Windows服务器使用一对相互监视的线程来强制执行Windows Server与Windows Client的许可。如果一个线程被停止或挂起,则另一个线程将恢复受影响的线程或启动新线程。线程在系统进程中运行。您不能在不崩溃窗口的情况下终止系统进程。
因此,一种方法是将代码注入到系统进程中,该进程启动一对线程并让线程保护每个线程,并执行您的不可修复进程所做的任何事情(或者让第三个线程执行任何工作你要)。您可以将线程设置为非常高的优先级,以确保没有任何内容可以同时成功定位两个线程。
答案 1 :(得分:0)
有一项工作。而不是使流程不可销售,您可以制作流程&#34; critical&#34;这意味着终止此进程会导致Windows系统崩溃(BSOD)。
这可以通过在ntdll.dll中调用未记录的函数RtlSetProcessIsCritical来完成。
请参阅http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti中的详细示例
但请记住:您必须在注销和/或系统关闭时实施适当的终止。否则系统会在这种情况下崩溃。