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

4
我正在开发一款旨在提高生产力的小型程序。它应该在预设的分钟数后将用户断开互联网或关闭计算机。该程序不应通过任务管理器关闭。我可以编译并运行该程序,但我可以通过任务管理器关闭它。我从这个页面中获得了灵感。
#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;
}

5
由于明显的原因,从任务管理器中隐藏程序或防止它们被关闭是Windows努力防范的事情。 - ChrisF
@Carl Norum 我经常需要阅读PDF文件来学习,但是网络总是让我无法连接。无论是管理员权限还是用户权限都不行。 - AaronP
@ChrisF 在给定的链接中,你可以看到有人已经成功地完成了那个。 - AaronP
你所链接的内容与你所描述的情况并不完全相同。 - ChrisF
有一些浏览器插件可以帮助你防止在互联网上浪费时间(除非你仍然使用gopher、telnet或usenet)。 - Emile Cormier
显示剩余2条评论
1个回答

9

这个功能是故意不支持的,而且被有意地设置成难以实现:

为什么不能拦截TerminateProcess函数?

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

TerminateProcess是低级别的进程终止函数。它绕过了DLL_PROCESS_DETACH和进程中的其他任何内容。当您使用TerminateProcess终止进程时,该进程中不会再运行任何用户模式代码。它已经消失了。不要收集200美元。

如果您可以拦截TerminateProcess,那么您将加剧程序和用户之间的武器竞赛。假设您可以拦截它。好吧,那么如果您想使您的程序无法被杀死,您只需提交您的TerminateProcess处理程序!然后人们会寻求“一种杀死拒绝使用TerminateProcess杀死的进程的方法”,我们又回到了起点。

在实践中,试图逃避检测和任务终止的程序会尝试将自己重命名为接近 Windows 系统进程的同形词。不要这样做。这将确保您的程序被提交为恶意软件,并且会彻底破坏您的信誉。

这让我想起了一个问题,有人问如何始终保持最顶层的窗口,即使已经有一个窗口被设置为始终保持最顶层。 - The Muffin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接