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

C++ 防止在任务管理器中关闭进程,c++,windows,C++,Windows,我正在制定一个小计划来提高工作效率。它应该断开用户与Internet的连接,或者在预设的分钟数后关闭计算机。不应使用任务管理器关闭程序。我可以编译程序并运行它,但我可以使用任务管理器关闭它。我的灵感来自: #包括 #包括 #包括 #包括 #包括 #包括“shutdown.cpp” #包括“disconnect.cpp” 静态常量bool ProtectProcess() { HANDLE hProcess=GetCurrentProcess(); 显式访问denyAccess={0}; DWOR

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

#包括
#包括
#包括
#包括
#包括
#包括“shutdown.cpp”
#包括“disconnect.cpp”
静态常量bool ProtectProcess()
{
HANDLE hProcess=GetCurrentProcess();
显式访问denyAccess={0};
DWORD dwAccessPermissions=GENERIC_WRITE | PROCESS_ALL_ACCESS | WRITE_DAC | DELETE | WRITE_OWNER | READ_CONTROL;
BuildExplicitAccessWithName(&denyAccess,\u T(“当前用户”)、dwAccessPermissions、DENY\u访问、NO\u继承);
PACL pTempDacl=NULL;
DWORD dwErr=0;
dwErr=setEntriesAcl(1,&denyAccess,NULL,&pTempDacl);
//检查dwErr。。。
dwErr=SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pTempDacl,NULL);
//检查dwErr。。。
LocalFree(pTempDacl);
CloseHandle(hProcess);
返回dwErr==ERROR\u SUCCESS;
}
int main()
{
使用名称空间std;
内布拉格;
ProtectProcess();
对于(;;)
{
不能使用此功能

为什么不能捕获TerminateProcess?

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

TerminateProcess
是低级进程终止功能。它绕过了
DLL\u process\u DETACH
以及进程中的任何其他功能。当您使用
TerminateProcess
终止进程时,该进程中将不再运行任何用户模式代码。它已消失。不要通过go。不要收取200美元

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


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

管理员将始终能够终止您的程序,不是吗?而且不会停止internet连接会降低您的工作效率?隐藏任务管理器中的程序或防止它们被关闭是Windows努力防止的事情,原因很明显。@Carl Norum我经常需要阅读PDF进行学习,但internet使我无法访问。它既不具有管理员权限,也不具有用户权限。@ChrisF在给定的链接上运行良好您可以看到有人成功地做到了这一点。您链接到的情况与您描述的情况不完全相同。这让我想起了一个问题,有人问如何始终是最顶部的窗口,而已经有一个窗口设置为始终是最顶部的窗口。
#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;
}