阻止进程在任务管理器中关闭

问题描述:

嗨,大家好我正在编写一个小程序,以提高生产力。它应该断开用户与Internet的连接,或者在预设的分钟数后关闭计算机。该程序不应该与任务管理器关闭。我可以编译程序并运行,但我可以用任务管理器关闭它。我得到了我的灵感来自于这个页面 Prevent user process from being killed with "End Process" from Process Explorer阻止进程在任务管理器中关闭

#include <iostream> 
#include <Windows.h> 

#include <AccCtrl.h> 
#include <AclAPI.h> 
#include <tchar.h> 

#include "shutdown.cpp" 
#include "disconnect.cpp" 



static const bool ProtectProcess() 
{ 

    HANDLE hProcess = GetCurrentProcess(); 
    EXPLICIT_ACCESS denyAccess = {0}; 
    DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL; 
    BuildExplicitAccessWithName(&denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE); 
    PACL pTempDacl = NULL; 
    DWORD dwErr = 0; 
    dwErr = SetEntriesInAcl(1, &denyAccess, NULL, &pTempDacl); 
    // check dwErr... 
    dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL); 
    // check dwErr... 
    LocalFree(pTempDacl); 
    CloseHandle(hProcess); 
    return dwErr == ERROR_SUCCESS; 

} 


int main() 
{ 
    using namespace std; 
    int abfrage; 

    ProtectProcess(); 

    for (;;) 
    { 
     cout << "10.Cut your Internet connection" << endl 
      << "11.Cut your Internet connection after 'x' minutes of surfing" << endl 
      << "20.Shutdown"     << endl; 
     cin >> abfrage; 

     switch(abfrage) 
     { 
      case 10: disconnectnow(); break; 
      case 11: disconnectlater(); break; 
      case 20: shutdown(); break; 

      default: cout << "nothing to see here" << endl; 
     } 
    } 
    return EXIT_SUCCESS; 
} 
+0

管理员将*总是*能够杀死你的程序,不是吗?并不会停止互联网连接,使您*少*生产力? – 2012-03-17 22:38:29

+5

从任务管理器隐藏程序或防止它们被关闭是Windows出于显而易见的原因难以预防的原因。 – ChrisF 2012-03-17 22:39:01

+0

@Carl Norum我经常需要阅读pdf才能学习,但互联网让我无法读书。它既不能与管理员也不能使用用户权限。 – AaronP 2012-03-17 22:50:52

此功能is, deliberately, unsupported and actively made intractable:

你为什么不能捕获了TerminateProcess?

如果用户触发了任务管理器,单击应用程序选项卡上结束任务按钮,Windows首先尝试很好地关闭你的程序,通过发送WM_CLOSE消息GUI程序和CTRL_CLOSE_EVENT事件控制台程序。但是你没有机会拦截TerminateProcess。为什么不?

TerminateProcess是低级进程查杀功能。它绕过DLL_PROCESS_DETACH和其他任何过程。当你用TerminateProcess杀死时,在该进程中不会再运行用户模式代码。它消失了。不要过关。不要收200美元。

如果你可以拦截TerminateProcess,那么你将会升级程序和用户之间的军备竞赛。假设你可以拦截它。那么,如果你想让你的程序无法运行,你只需交出你的TerminateProcess处理程序!然后人们会要求“一种方法来杀死一个拒绝被TerminateProcess杀死的进程”,我们会回到我们开始的地方。

实际上,试图逃避检测和任务kill的程序尝试将其自身重命名为Windows系统进程的近似形式。不要这样做。它保证你的程序将被提交为恶意软件,并会杀死你的信誉。