Domanda [GUIDA]Protezione per i tuoi programmi , crash del sistema se viene chiuso

Vi e' piaciuta la giuda?

  • Si, Molto Interessante

    Voti: 3 60.0%
  • No, Fa Schifo

    Voti: 2 40.0%

  • Votanti totali
    5
Stato
Discussione chiusa ad ulteriori risposte.

diolegend

Utente Silver
22 Luglio 2013
132
18
11
86
Ultima modifica:
Intanto vorrei scusarmi con Exsta.
---------------------------------------------------------------------------------------------------------------------------------------------
Ciao ragazzi , sono Diolegend e oggi vorrei portarvi una guida su un tema molto interessante , di codice c'e ne poco , ma di conoscenze tante.
Inanzitutto vi faccio vedere di cosa si tratta.
Avete presente un programma del sistema chiamato smss.exe , provate ad aprire il task manager e chiuderlo , vedrete che vi crashera l'intero sistema.
Intanto apro il mio programma in un sistema virtualizzato.

GlMmwtd.png


Dopodiche' lo chiudo , e cosa succede ? BOOM
ilEMFfy.png



Ora postiamo il codice.
C++:
#include <Windows.h>
#include <iostream>

typedef long (WINAPI *RtlSetProcessIsCritical)(IN BOOLEAN bNew,OUT BOOLEAN *pbOld,IN BOOLEAN bNeedScb);

BOOL SettarePermesso()
{
    TOKEN_PRIVILEGES d_Privilegi;
    LUID             d_Luid;
    HANDLE           d_Token;

    LookupPrivilegeValue(NULL,L"SeDebugPrivilege", &d_Luid);

    d_Privilegi.PrivilegeCount = 1;
    d_Privilegi.Privileges[0].Luid = d_Luid;
    d_Privilegi.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &d_Token);

    AdjustTokenPrivileges(d_Token, 0, &d_Privilegi, sizeof(TOKEN_PRIVILEGES), 0, 0);


    return true;
}

int main()
{
    SettarePermesso();

    RtlSetProcessIsCritical d_Process;

    HMODULE d_Ntdll = GetModuleHandle(L"ntdll.dll");

    d_Process   = (RtlSetProcessIsCritical)GetProcAddress(d_Ntdll, "RtlSetProcessIsCritical");
    d_Process(TRUE, NULL, FALSE);

    std::cout << "Sistema di difesa : [ATTIVO]" <<  std::endl;

    while (true);

    return 0;
}

Non e' tanto lunghino , inanzitutto dobbiamo avere lo scheletro della funzione, ovvero
typedef long (WINAPI *RtlSetProcessIsCritical)(IN BOOLEAN bNew,OUT BOOLEAN *pbOld,IN BOOLEAN bNeedScb);
Ricavare l'indirizzo della funzione nel modulo ntdll.dll.
E scordavo , per eseguire quella funzione , dobbiamo avere un permesso che e' chiamato SE_DEBUG_NAME, se andiamo sul sito ufficiale msdn , troviamo che c'e scritto questo.
Required to debug and adjust the memory of a process owned by another account.

Comunque tranquilli , postero' altre guide per spiegare piu' a fondo questo ntdll.dll e come chiamare una funzione ricavando l'indirizzo di un'altro programma.

Nella funzione SettarePermesso , inanzitutto devo ricavare il valore del permesso(LookupPrivilegeValue)
Inserire 1 nel Privelege count per indicare che c'e da modificare un permesso.
Inserisco il permesso e attivo.
Prendo un Token per avere il permesso di aggiustare il permesso con la funzione AdjustTokenPrivileges.

Niente di che'

La funzione che stiamo ricavando dal modulo ntdll.dll non è documentata , ciò significa che Windows ha un buon motivo di nascondere questa funzione , perché permette di killare windows quando il programma stesso si termina.
Una cosa orribile non trovate?.

Ci vediamo con il prossimo tutorial.

- Diolegend
 
Ultima modifica:
Esegue - mi stampa stato di sicurezza: [ATTIVO] ma se lo chiudo non fa nulla
 
Non si può semplicemente spegnere il PC ?
O rendere il processo necessario a Windows ? Così se si prova a chiuderlo dal Task Manager ti spunta la finestrella che spunta in ogni processo di Windows con scritto o "Termina attività" o "Arresta Sistema" ...
Così volendo fare un virus è super-sgamabile
 
Stato
Discussione chiusa ad ulteriori risposte.