【问题标题】:How to protect a process from being killed? [duplicate]如何保护进程不被杀死? [复制]
【发布时间】:2016-01-28 11:38:55
【问题描述】:

我试图在 c++ windows 中保护一个进程, 代码是:

#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;
}

但是我可以从任务管理器中杀死进程!怎么了?

【问题讨论】:

  • @Holonout 我不明白,这个 URL 是关于信号的,它和这个有什么关系吗?!你能解释更多吗?
  • 对不起用户,错误的链接。这将更符合您的要求:security.stackexchange.com/questions/30985/…
  • IIRC,现代版本的 Windows 上的防病毒软件使用一种特殊技术(我认为类似于“受保护的进程”),但您必须为此获得 Microsoft 的特殊数字签名。较旧的防病毒软件被骗,部分运行在内核模式下,并以未记录和不受支持的方式干扰操作系统。 (这就是为什么有这么多人不幸倾向于导致 Windows 出现故障。)
  • 总体目标是什么?无法杀死的进程?编写设备驱动程序。

标签: c++ windows winapi g++


【解决方案1】:

Windows 服务器使用一对相互监视的线程来强制执行 Windows Server 与 Windows 客户端的许可。如果一个线程被停止或挂起,另一个线程将恢复受影响的线程或启动一个新线程。线程在系统进程中运行。你不能在不崩溃窗口的情况下杀死系统进程。

因此,一种方法是将代码注入到启动一对线程的系统进程中,并让线程保护每个线程并执行您希望无法杀死的进程执行的任何操作(或者让第三个线程执行您想要的任何工作)。您可以将线程设置为非常高的优先级,以确保没有任何东西可以同时成功地针对两个线程。

【讨论】:

    【解决方案2】:

    有一种解决方法。您可以将进程设置为“关键”进程,而不是使进程无法终止,这意味着终止该进程会导致 Windows 系统崩溃 (BSOD)。

    这可以通过调用 ntdll.dll 中未记录的函数 RtlSetProcessIsCritical 来完成。
    参见http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti中的详细示例

    但请记住:您必须在注销和/或系统关闭时实施适当的终止。否则系统会在这种情况下崩溃。

    【讨论】:

    • 谢谢,如果结果有效,我会测试并分享!
    • 没用!我只是像其他过程一样简单地关闭该过程!不要有所作为。
    • 您是否以管理员权限启动应用程序?这是必需的。我在 Windows XP、7 和 8.1 中使用它 - 工作正常。当试图在任务管理器中终止进程时,您会收到有关系统终止的警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2011-09-23
    • 2013-04-07
    • 2012-09-21
    相关资源
    最近更新 更多