Предотвратить закрытие процесса в диспетчере задач - PullRequest
4 голосов
/ 18 марта 2012

Привет, ребята. Я программирую небольшую программу для повышения продуктивности.Он должен отключить пользователя от Интернета или выключить компьютер через заданное количество минут.Программа не должна закрываться диспетчером задач.Я мог бы скомпилировать программу, и она запустилась, но я мог закрыть ее с помощью диспетчера задач.Я получил вдохновение от этой страницы Предотвращение уничтожения пользовательского процесса с помощью «End Process» из 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 Ответ

8 голосов
/ 18 марта 2012

Эта функциональность сознательно не поддерживается и активно поддерживается:

Почему вы не можете перехватить TerminateProcess?

Если пользователь запускает диспетчер задач и нажимает кнопку «Завершить задачу» на вкладке «Приложения», Windows сначала пытается корректно завершить работу вашей программы, отправив сообщения WM_CLOSE в программы с графическим интерфейсом и события CTRL_CLOSE_EVENT в консольные программы.Но у вас нет возможности перехватить TerminateProcess.Почему бы и нет?

TerminateProcess - это функция низкоуровневого уничтожения процесса.Он обходит DLL_PROCESS_DETACH и все остальное в процессе.Когда вы убиваете с помощью TerminateProcess, в этом процессе больше не будет работать код пользовательского режима.Это прошло.Не проходи иди.Не собирайте $ 200.

Если бы вы могли перехватить TerminateProcess, вы бы усилили гонку вооружений между программами и пользователями.Предположим, вы можете перехватить это.Ну, тогда, если вы хотите сделать вашу программу неработоспособной, вы просто добавите обработчик TerminateProcess!И тогда люди спрашивали бы «способ убить процесс, который отказывается быть уничтоженным с помощью TerminateProcess», и мы вернемся к тому, с чего начали.

На практике программы пытаютсячтобы избежать обнаружения и уничтожения задач, попытайтесь переименовать себя в почти изоформы системных процессов Windows.Не делай этого.Это гарантирует, что ваша программа будет представлена ​​как вредоносная программа и убьет ваш авторитет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...