c ++ - Forhindre, at processen lukkes i task manager

Indlæg af Hanne Mølgaard Plasc

Problem



Hej, jeg programmerer et lille program for at blive mere produktiv. Det skal afbryde brugeren fra internettet eller lukke computeren nede efter et forudindstillet antal minutter. Programmet bør ikke lukkes med task manager. Jeg kunne kompilere programmet og det kører, men jeg kunne lukke det med task manager. Jeg fik inspiration fra denne side
Forhindre brugerprocessen fra at blive dræbt med 'Afslut proces' fra 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;
}

Bedste reference


Denne funktionalitet er bevidst ikke understøttet og gøres aktivt uhåndterbar: [12]



   Hvorfor kan du ikke fange TerminateProcess?

  
  Hvis en bruger fyrer op på Opgavehåndtering og klikker på Afslut opgave på fanen Programmer, forsøger Windows først at lukke dit program pænt ved at sende WM\_CLOSE meddelelser til GUI-programmer og CTRL\_CLOSE\_EVENT begivenheder for at konsolere programmer. Men du får ikke chancen for at opfange TerminateProcess. Hvorfor ikke?

  
  TerminateProcess er lav-niveau proces-killingsfunktionen. Den omgår DLL\_PROCESS\_DETACH og alt andet i processen. Når du dræber med TerminateProcess, kører der ikke mere brugertilstandskode i den proces. Det er væk. Gå ikke i gang. Indsaml ikke $ 200.

  
  Hvis du kunne opfange TerminateProcess, ville du eskalere våbenkampen mellem programmer og brugere. Antag at du kunne opfange det. Nå, så hvis du ville gøre dit program unkillable, ville du bare indlevere din TerminateProcess handler! Og så vil folk bede om 'en måde at dræbe en proces, der nægter at blive dræbt med TerminateProcess,' og vi 'er tilbage til, hvor vi startede.



I praksis forsøger programmer, der forsøger at unddrage sig detektions- og opgavedræbte, at omdøbe sig til nær isoformer af Windows-systemprocesserne. Gør det ikke. Det garanterer, at dit program vil blive sendt som malware og vil dræbe din troværdighed død.