Domanda:
Crea un processo irreversibile in Windows
user20825
2013-02-16 01:44:03 UTC
view on stackexchange narkive permalink

Sono uno studente e sono sinceramente curioso di processi irreversibili in Windows.

Per scopi didattici, vorrei creare un'applicazione (possibilmente in VB6?) che non può essere terminata da un utente da task manager o taskkill. Quali sono alcune strategie ed exploit che tali applicazioni impiegano per renderlo possibile?

VB6 probabilmente non ti porterà lì. È un po 'come dire che hai sentito parlare di spedizioni internazionali di merci, hai una barca a remi e vorresti provarla.
[Questa domanda StackOverflow] (http://stackoverflow.com/questions/992671/how-to-write-an-unkillable-process-for-windows) può aiutare e [questo articolo di Technet] (http: // blogs. technet.com/b/markrussinovich/archive/2005/08/17/unkillable-processes.aspx) - la loro conclusione, non puoi fare nulla di utile con qualcosa * veramente * impossibile da eliminare. Qualsiasi cosa è necessario utilizzare tecniche di tipo malware (come l'installazione come driver) per diventare più difficile da uccidere. Potresti anche essere interessato a [come lo fa DRM] (http://en.wikipedia.org/wiki/StarForce).
Cinque risposte:
Polynomial
2013-02-16 19:50:32 UTC
view on stackexchange narkive permalink

Contrariamente a quanto credono molte persone, in realtà ci sono diversi modi per farlo. Alcuni di loro sono comuni, alcuni visti raramente. Alcuni di loro sono deboli, altri forti. Tutto dipende da come lo fai.

Vediamone una raccolta:


1. Trucco RegisterServiceProcess pre-NT
Windows 9x e altri sistemi operativi pre-NT avevano un'API non documentata in kernel32.dll chiamata RegisterServiceProcess , che (come suggerisce il nome) registra il processo come servizio di sistema. Una volta che un processo aveva chiamato questa funzione, il sistema operativo la considerava critica e non avrebbe permesso al task manager di ucciderla. Questa funzione è stata rimossa quando è uscito NT, quindi non funziona su XP o versioni successive.

2. Trucchi per la denominazione dei processi
In WinXP, l'eseguibile di Task Manager conteneva un elenco hardcoded di nomi di processi che avrebbe rifiutato di uccidere, mostrando invece un messaggio come quello che hai menzionato. Fondamentalmente coprivano i servizi di sistema critici come smss.exe e rpcss.exe . Il problema era che il percorso non è stato controllato, quindi qualsiasi altro eseguibile con lo stesso nome risulterebbe in un processo irreversibile. Questo trucco non impedisce di per sé che il processo venga terminato, ma piuttosto impedisce al Task Manager di Windows XP di essere in grado di terminare il processo. È ancora possibile utilizzare un altro strumento per terminare il processo.

3. Processi di mantenimento
Questi sono di gran lunga i più comuni. Vengono creati due processi e controllano ripetutamente l'esistenza dell'altro. Se uno viene ucciso, l'altro lo resuscita. Questo non ti impedisce di interrompere davvero il processo, ma rende fastidioso interrompere il processo di ritorno.

Task Manager include un'opzione per terminare l'albero dei processi, che consente di terminare un processo e tutti i processi figli, il che può aiutare a risolvere questo problema. Quando un processo viene creato in Windows, il sistema operativo tiene traccia dell'ID del processo che lo ha creato. Kill process tree itera attraverso tutti i processi e cerca quelli che hanno un ID genitore uguale all'ID del processo che stai uccidendo. Poiché i processi keep-alive di solito funzionano su un polling ripetuto, puoi terminare entrambi i processi prima che si accorgano che qualcosa è andato storto.

Una difesa contro questo è creare un processo fittizio che genera il processo keep-alive, quindi avere l'uscita del processo fittizio. Il processo principale passa il proprio ID al processo fittizio e il processo fittizio passa il proprio ID al processo keep-alive, ma la catena viene interrotta quando il processo fittizio esce. Ciò lascia in esecuzione sia il processo primario che quello keepalive, ma rende impossibile utilizzare la funzione di kill process tree di Task Manager. Invece, dovresti scrivere uno script per ucciderli o utilizzare uno strumento che ti consenta di uccidere più processi contemporaneamente.

4. Hook in modalità utente tramite DLL caricate
È possibile iniettare una DLL in un processo in esecuzione. In effetti, Windows offre una funzionalità per caricare qualsiasi DLL in tutti i processi che importano user32.dll, ai fini dell'estensibilità. Questo metodo è chiamato AppInit DLL. Una volta che una DLL viene inserita, potrebbe manipolare la memoria del processo. È quindi possibile sovrascrivere i valori di determinati puntatori a funzione in modo che la chiamata venga reindirizzata a una routine di stub, che quindi chiama la funzione di destinazione. Quella routine stub può essere utilizzata per filtrare o manipolare i parametri e restituire i valori di una chiamata di funzione. Questa tecnica è chiamata hooking e può essere molto potente. In questo caso, sarebbe possibile iniettare una DLL nei processi in esecuzione che aggancia OpenProcess e TerminateProcess per garantire che nessuna applicazione possa ottenere un handle per il processo o terminarlo . Ciò si traduce in qualche modo in una corsa agli armamenti, poiché è possibile utilizzare API alternative in modalità utente per terminare i processi ed è difficile collegarli e bloccarli tutti, soprattutto se si considerano le API non documentate.

5 . Hook in modalità utente tramite thread iniettati
Questo trucco funziona come con le DLL, tranne per il fatto che non è necessario alcun file DLL. Viene creato un handle per il processo di destinazione, una parte della memoria viene allocata al suo interno tramite VirtualAllocEx , il codice e i dati vengono copiati nel blocco di memoria tramite WriteProcessMemory e viene creato un thread in il processo tramite CreateRemoteThread . Ciò si traduce in un codice esterno che viene eseguito all'interno di un processo di destinazione, che può quindi istigare vari hook per impedire che un processo venga ucciso.

6. Hook di chiamata in modalità kernel
Nel kernel, c'è una struttura speciale chiamata SSDT (System Service Dispatch Table), che mappa gli ID delle funzioni dalle chiamate in modalità utente ai puntatori alle funzioni delle API del kernel. Questa tabella viene utilizzata per passare dalla modalità utente alla modalità kernel. Se è possibile caricare un driver dannoso, potrebbe modificare l'SSDT per eseguire la propria funzione, invece dell'API corretta. Questo è un hook in modalità kernel, che costituisce un rootkit. In sostanza è possibile gettare la lana sugli occhi del sistema operativo restituendo dati fasulli dalle chiamate. In effetti, è possibile rendere il processo non solo non uccidibile, ma anche invisibile. Un problema con questo su build x64 è che SSDT è protetto da Kernel Patch Protection (KPP). È possibile disabilitare KPP, ma ciò ha conseguenze di vasta portata che potrebbero rendere difficile lo sviluppo di un rootkit.

7. Manipolazione diretta degli oggetti del kernel (DKOM)
Questo trucco comporta anche il caricamento di un driver dannoso sul sistema operativo, ma non richiede l'alterazione dell'SSDT. I processi sul sistema sono memorizzati come strutture EPROCESS nel kernel. Tieni presente che questa struttura dipende interamente dalla versione ed è solo parzialmente documentata da Microsoft, quindi è necessario il reverse engineering su più versioni di destinazione per assicurarti che il codice non tenti di leggere i puntatori oi dati sbagliati. Tuttavia, se riesci a individuare ed enumerare con successo le strutture EPROCESS nel kernel, è possibile manipolarle.

Ogni voce nell'elenco dei processi ha un puntatore FLink e BLink , che punta al processo successivo e precedente nell'elenco. Se identifichi il tuo processo di destinazione e fai in modo che i suoi puntatori FLink e BLink rimandino a se stessi e i FLink e BLink dei suoi fratelli puntano l'uno verso l'altro, il sistema operativo salta semplicemente il processo quando si eseguono operazioni di pulizia, ad es. processi di uccisione. Questo trucco si chiama scollegamento. Ciò non solo rende il processo invisibile all'utente, ma impedisce anche a tutte le API in modalità utente di prendere di mira il processo a meno che non sia stato generato un handle per il processo prima che fosse scollegato. Questa è una tecnica rootkit molto potente, soprattutto perché è difficile ripristinarla.

8. Trucchi del debugger
Questo è un trucco piuttosto interessante che devo ancora vedere in natura, ma funziona abbastanza bene. L'API del debugger di Windows consente a qualsiasi processo di eseguire il debug di un altro, a condizione che disponga delle autorizzazioni per farlo. Se si utilizza l'API del debugger, è possibile mettere un processo in uno stato "debuggato". Se questo processo contiene un thread che è attualmente interrotto da un debugger, il processo non può essere terminato da Windows, perché non è possibile garantire il controllo appropriato del thread durante la terminazione quando il thread è bloccato. Ovviamente, se uccidi il debugger, il processo smette di essere sottoposto a debug e si chiude o si blocca. Tuttavia, a volte è possibile produrre una situazione in cui esiste una catena di processi che eseguono il debug a vicenda in un ciclo. Se ogni processo interrompe un thread fittizio nel successivo, nessuno può essere ucciso. Nota che è possibile per un utente esperto uccidere manualmente altri thread all'interno del processo, rendendolo inutilizzabile, ma non verrà comunque ucciso.

9. Windows 8 DRM
Questo è uno nuovo di cui ho sentito parlare solo di recente, ma non ne so molto. Su Twitter circolava un po 'di voci al riguardo, e ho visto frammenti qua e là su vari siti tecnici, ma devo ancora vedere alcuna ricerca concreta. Penso che sia ancora agli inizi. In sostanza, la storia è che Windows 8 ha un meccanismo che consente ai "fornitori affidabili" di registrare i processi come DRM critici, impedendo che vengano uccisi o manipolati dall'utente. Alcune persone hanno ipotizzato che il meccanismo per controllare i provider attendibili sia debole e potrebbe essere soggetto ad attacchi. < - Sembra che questo sia falso. Questo per quanto riguarda le voci!

Aggiornamento: Harry Johnston ha sottolineato nei commenti che Windows 8.1 introduce servizi protetti, progettati per essere utilizzati da AV e DRM per proteggere il sistema da eventuali manipolazioni o attacchi da parte di codice con privilegi inferiori.

10. Manipolazione degli strumenti
Questo probabilmente è stato usato molto in natura, ma non l'ho mai visto fare correttamente. Essenzialmente questo trucco implica il targeting di strumenti specifici, ad es. Task Manager, modificando gli eseguibili su disco in un modo che altera la funzionalità. Questo è molto simile ai trucchi hook in modalità utente che ho menzionato prima, ma in questo caso persistono su disco e hanno conseguenze di più ampia portata rispetto al semplice hooking API. Naturalmente, un problema è che Windows File Protection (WFP) impedisce l'alterazione di alcuni file di sistema critici, incluso il task manager. In modo divertente, tuttavia, è possibile modificare il percorso eseguibile del task manager predefinito tramite il registro. Quindi, invece di scherzare con il file eseguibile del task manager, scarica la tua versione da qualche parte e fai in modo che il sistema operativo la utilizzi.


Tutto sommato, ci sono molti modi per ottenere questo risultato, con diversi gradi di robustezza. Quanto sopra ne rappresenta la maggioranza, ma non è esaustivo. In effetti, molti dei trucchi che ho descritto possono essere realizzati in modi alternativi, utilizzando diversi meccanismi o API per raggiungere lo stesso obiettivo.

-1
Sono tutti ugualmente possibili, dare o avere.
Questa è un'ottima risposta, ma sarei curioso di vedere i privilegi minimi richiesti per realizzare ciascun metodo, poiché richiedono tutti livelli diversi.
@SteveS 1,2,3 può essere eseguito da qualsiasi utente, 4,5,8,9 richiede admin, 6,7 richiede admin e un modo per bypassare la firma del driver (disabilitarlo o utilizzare un driver firmato), 10 dipende dall'ACL del file che stai tentando di sostituire.
Hai dei link su Windows 8 DRM? Sembra orribile.
# 8 richiede davvero un amministratore? E per il n. 3, puoi anche interrompere Kill Process Tree facendo in modo che ProcA avvii ProcB che avvierà ProcC e quindi ProcB terminerà (il tutto prima dell'apertura di Task Manager). Quindi C è la sua radice nel processo "foresta" e non è correlato ad A.
@mihi Sì, # 8 richiede un amministratore, poiché il debug è un'operazione privilegiata. Ho menzionato il trucco del concatenamento del processo nell'ultimo paragrafo del n. 3.
Avevo l'impressione che fosse possibile eseguire il debug di un processo se si dispone delle autorizzazioni di controllo completo per esso (ad esempio se viene eseguito con il proprio account utente). Almeno ho eseguito il debug di alcuni programmi con OllyDbg senza essere un amministratore (cose come HW Breakpoints non funzionano però).
@mihi Sì, è vero, ma sono abbastanza sicuro che in questo caso la parte "debug di un debugger" richiede admin.
Il tuo # 9 suona in modo sospetto come [servizi protetti] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn313124 (v = vs.85) .aspx) che sono stati introdotti in Windows 8.1. (Forse le voci erano corrette, ma la tecnologia non era pronta in tempo per il rilascio originale di Windows 8?)
@HarryJohnston Bella scoperta. Lo includerò nella risposta.
Nel caso in cui questa risposta venga rimossa, salvo la pagina :)
AJ Henderson
2013-02-16 02:24:34 UTC
view on stackexchange narkive permalink

Non credo che quello che stai cercando di fare sia possibile. Dovresti sovvertire il sistema operativo per impedire che un processo possa essere ucciso. Tutti i processi vengono eseguiti all'interno del sistema operativo, quindi il sistema operativo può interrompere qualsiasi processo. Puoi persino terminare processi come "explorer.exe", che è ciò che esegue il menu di avvio e il desktop.

La maggior parte dei programmi che sembrano essere "unkillable" sono effettivamente eliminabili, ma un altro programma sta monitorando la loro esecuzione e quando vede il processo chiudersi, verrà automaticamente riavviato immediatamente. Quando uccidi il processoA, il processoB lo avvia e quando uccidi il processoB, il processoA lo avvia. Poiché non è possibile terminare facilmente entrambi i processi esattamente insieme, diventa molto difficile sbarazzarsene mentre il sistema è in esecuzione.

Questa stessa tecnica viene utilizzata da diversi fornitori di antivirus oltre che dal popolare programma anti-cheat PunkBuster.

È anche possibile, su sistemi più vecchi, che il processo possa essere eseguito come servizio. In Windows XP e Windows 2000, il Task Manager non è in grado di terminare i processi avviati dal gestore del servizio poiché il gestore del servizio viene eseguito in un contesto utente diverso. Su questi sistemi meno recenti, la creazione di un servizio Windows sarebbe resistente all'uccisione diretta con Task Manager, tuttavia le versioni più recenti di Windows ne consentiranno l'arresto.

Potrebbe essere utile vedere in quale contesto è in esecuzione il processo sotto se il permesso viene negato. È possibile utilizzare uno strumento come Process Explorer dalla suite di SysInternal per vedere in quale contesto utente è in esecuzione il processo. Se il contesto utente in cui è in esecuzione Task Manager non ha accesso ai processi di kill in esecuzione nel contesto utente in cui è in esecuzione il processo, il kill avrà esito negativo.

Le informazioni correlate sono disponibili sul super utente sotto questa domanda https://superuser.com/questions/109010/kill-a-process-which-gives-access-denied. Sembra che ci sia un'impostazione di sicurezza per processo che può essere applicata per rimuovere il diritto di uccidere. Questo potrebbe essere fatto in modo programmatico e complicherebbe l'uccisione, tuttavia un amministratore potrebbe comunque assumere la proprietà del processo e quindi modificare nuovamente le autorizzazioni per consentirne l'uccisione. Le API di Windows particolari sono CreateProcessWithTokenW e SetSecurityInfo.

Non considerare la mia intenzione sbagliata ma ho visto i miei virus impossibili da terminare dal task manager.
@VarunDotCuDotCc: ciò che accade generalmente è che ci sono due eseguibili. Ciascuno controlla l'altro e quando uno viene ucciso, l'altro lo riavvia immediatamente. Poiché i file possono essere bloccati mentre gli eseguibili sono in esecuzione, non è possibile eliminarli semplicemente senza prima arrestarli entrambi. Questa tecnica viene spesso utilizzata dal software AV e dal popolare programma anti-cheat Punkbuster.
No, c'è un unico eseguibile. Sono abbastanza sicuro. Quando faccio clic sull'opzione Termina procedure, viene visualizzato il messaggio "Impossibile terminare il processo" in Task Manager.
E poi l'antivirus fa la magia e il processo viene interrotto (dopo una scansione)
@VarunDotCuDotCc - Stai cercando di terminare l '"applicazione" o il "processo". Se l'UAC è attivo, stai eseguendo come amministratore o utente? Se esegui a livello utente, non sarai in grado di terminare i processi amministrativi. Inoltre, quando si uccide a livello "Applicazione / Attività", il processo viene chiesto di chiudersi e può essere rifiutato. L'uccisione del processo stesso dovrebbe fermare il processo indipendentemente dai suoi desideri.
OK, ho una prova. Installa AVG Anti Virus (può essere gratuito). Ora vai alla scheda Processo nel task manager e scegli di terminare il processo avgnt.exe Sai cosa otterrai, solo un messaggio "Impossibile completare l'operazione. Accesso negato"
@VarunDotCuDotCc - Se ricevi un messaggio di accesso negato, quasi certamente hai UAC attivato e non stai eseguendo il task manager in modalità amministrativa. Hai un pulsante "Mostra processi per tutti gli utenti? In tal caso, fai clic su di esso (il task manager si chiuderà e si riaprirà automaticamente in modalità amministrativa) e poi prova a terminare il processo.
@VarunDotCuDotCc: l'altra possibilità è che se ottieni qualcosa chiamato rootkit, potrebbe sostituire Task Manager con una versione falsa o alterata o potrebbe alterare i file di sistema di Windows in modo tale che le istruzioni per terminare il processo vengano ignorate. Tuttavia, un programma del genere non può essere realizzato in Visual Basic poiché richiede una programmazione di codice nativo molto avanzata per dirottare tale funzionalità e VB6 è troppo limitato per farlo. È inoltre improbabile che i programmi legittimi utilizzino un kit di root poiché possono compromettere un computer. (Vedi il fiasco di Sony DRM RootKit.)
OK, ho provato a eseguire Task Manager come amministratore e tutto ciò che hai detto. Inoltre, penso che l'UAC non esista in XP.
Penso che i rootkit non siano creati da antivirus. Hai verificato personalmente l'installazione di AVG
@VarunDotCuDotCc - Ok, ho fatto qualche ricerca in più sul messaggio che hai ricevuto. Sembra che anche a Task Manager non sia consentito uccidere i servizi. Se un processo viene avviato dal gestore del servizio, deve essere terminato dal gestore del servizio o da qualche altro killer del processo. Potresti fare un servizio con VB6. Inoltre, mi dispiace per la confusione. Non ho lavorato con XP per un po 'di tempo e l'accesso a Task Manager è stato modificato tra XP e Vista. Sono abbastanza sicuro che ora possa uccidere i servizi direttamente, ma in XP / 2000 non poteva.
alterare i file di sistema di Windows in modo tale che le istruzioni per terminare il processo vengano ignorate. questo è quello che sto cercando
Ho appena creato un servizio in VB6, installalo ed eseguilo. Dopo questo, l'ho terminato molto facilmente dal task manager.
@AJHenderson Lavoro con molte macchine XP presso la nostra azienda e posso confermare che questo messaggio viene visualizzato quando provo a terminare attività specifiche in Task Manager, anche quando hai effettuato l'accesso come amministratore (ho riscontrato anche questo errore su Anche Windows 7, anche con Esegui come amministratore). Tuttavia, non sono tutti i servizi, solo alcuni. Inoltre, questo errore non è limitato solo ai processi di sistema, anche se si tratta principalmente di processi di sistema che non ti consentono di ucciderli.
@Rachel Come puoi vedere sto cercando di trasmettere la stessa cosa dagli ultimi 45 minuti. Ora, ho alcuni voti sulle mie argomentazioni. In genere, questa tecnica viene utilizzata da virus e antivirus per impedire che vengano terminati dall'altro.
Sono le 2:45 del mattino qui e ho trascorso alcune ore qui senza fortuna. Quindi, vado a dormire e mi unirò alla discussione più tardi.
@Rachel - hai Active Directory in esecuzione e i processi sono eseguiti da un contesto su cui l'amministratore locale non ha il controllo? In definitiva, il contesto di esecuzione è l'elemento chiave qui. Windows (a meno che non sia rootkit o molto raramente, il kernel viene reso instabile) può uccidere qualsiasi processo in esecuzione. L'accesso è negato i messaggi sono il risultato del contesto di esecuzione di Task Manager che non dispone dell'autorizzazione per terminare le applicazioni in esecuzione nel contesto di esecuzione del processo.
@AJHenderson Sì, usiamo Active Directory e so di aver visto quell'errore alcune volte quando ho provato a terminare un processo dall'account dell'amministratore di rete, non solo dall'account dell'amministratore locale. A volte sono processi di sistema, altre volte sono programmatori di terze parti come AVG e una o due volte è stato Malware. Non è un problema che sto riscontrando ora, quindi probabilmente non sarei utile per eseguire i test, ma posso confermare che è successo in passato :)
http://superuser.com/questions/109010/kill-a-process-which-gives-access-denied - Contiene maggiori dettagli sui contesti dell'utente del processo.
tylerl
2013-02-16 07:05:41 UTC
view on stackexchange narkive permalink

Come accennato da AJ, il sistema operativo alla fine è il responsabile. Decide se un processo può essere interrotto, quando viene interrotto, come, ecc. Alcuni processi possono essere "protetti" dal sistema operativo, impedendo loro di essere terminati, o come è anche il caso, il processo può essere tecnicamente interrompibile, ma l'arresto del processo innesca l'arresto dell'intera macchina.

Se stavi scrivendo malware e volessi rendere impossibile l'arresto di un processo, la soluzione migliore sarebbe modificare il sistema operativo per impedirlo . Questo non è escluso, ed è in realtà qualcosa a cui gli autori hanno già pensato. In effetti, apportare modifiche al sistema operativo per proteggere le risorse è un filo conduttore così comune che hanno un nome: " rootkit".

Quindi come si modifica il sistema operativo in esecuzione? Fortunatamente i sistemi operativi moderni sono tutti scritti per consentire di apportare tali modifiche; basta scrivere un modulo del kernel (alias "driver"). C'è anche un kit di sviluppo per iniziare.

Una volta che sei lì, aggancia il percorso del codice che gestisce il controllo del processo e inserisci la tua piccola regola di esclusione. Continua a leggere i rootkit per ulteriori informazioni.

Evert
2015-09-03 19:14:44 UTC
view on stackexchange narkive permalink

Creare un processo davvero immutabile non è una buona idea. È tuttavia perfettamente possibile proteggere un processo dall'interruzione da parte di qualsiasi altro utente diverso da un amministratore. Gli amministratori hanno, e dovrebbero avere, pieno accesso al processo e possono terminare il processo.

Il modo per farlo è modificare l'ACL del processo in modo che il sistema operativo rifiuti qualsiasi tentativo di terminare il processo da non amministratori.

Nel codice di avvio del processo, è necessario ottenere il DACL del processo, aggiungere una restrizione in modo che "Tutti" ottengano un "Accesso negato" quando si tenta di terminare il processo, quindi scrivere indietro il processo DACL.

Potrei fornirti il ​​codice sorgente .NET su come farlo, se sei interessato.

braindigitalis
2018-06-08 18:50:28 UTC
view on stackexchange narkive permalink

Una cosa che è stata trascurata qui è il concetto di (ab) utilizzare la virtualizzazione per implementare un hypervisor sopra le finestre che contengono il tuo codice.

Dato che il tuo codice viene eseguito fuori e sopra le finestre, non è facilmente rilevabile , né può essere terminato da Windows.

" Blue Pill" era una prova del concetto di un tale concetto, tuttavia dopo qualche chiasso iniziale tale implementazione viene menzionata molto raramente e personalmente Devo ancora vedere una cosa del genere in natura.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...