【问题标题】:Prevent process from being closed in task manager防止进程在任务管理器中关闭
【发布时间】:2012-03-17 22:36:32
【问题描述】:

我正在开发一个小程序来提高工作效率。它应该在预设的分钟数后断开用户与 Internet 的连接或关闭您的计算机。该程序不应使用任务管理器关闭。我可以编译程序并运行它,但我可以用任务管理器关闭它。我的灵感来自this page

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

【问题讨论】:

  • 管理员将总是能够杀死您的程序,不是吗?停止互联网连接不会降低您的工作效率吗?
  • 从任务管理器中隐藏程序或阻止它们被关闭是 Windows 努力阻止的事情,原因很明显。
  • @Carl Norum 我经常不得不阅读 pdf 来学习,但互联网让我望而却步。它不适用于管理员或用户权限。
  • @ChrisF 在给定的链接上你可以看到有人成功地做到了。
  • 您链接到的情况与您描述的情况并不完全相同。

标签: c++ windows


【解决方案1】:

这个功能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 系统进程的近似异构体。不要这样做。它保证您的程序将作为恶意软件提交,并会扼杀您的信誉。

【讨论】:

  • 这让我想起了一个问题,有人问当已经有一个窗口被设置为始终是最顶层的窗口时,如何始终成为最顶层的窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多