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

时间:2012-03-17 22:36:33

标签: c++ windows

大家好,我正在编写一个程序来提高工作效率。它应该断开用户与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;
}

1 个答案:

答案 0 :(得分:8)

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

  

为什么不能捕获TerminateProcess?

     

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

     

TerminateProcess是低级进程终止函数。它绕过DLL_PROCESS_DETACH和其他任何过程。使用TerminateProcess终止时,不会再在该进程中运行用户模式代码。没了。不要过去。不要收200美元。

     

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

实际上,试图逃避检测和任务杀死的程序会尝试将自己重命名为Windows系统进程的近似异形。不要这样做。它保证您的程序将作为恶意软件提交,并会扼杀您的可信度。