View Full Version : [C/C++] Nascondere processo
softwareh
05-12-2016, 16:23
Buonasera a tutti,
vorrei sapere come faccio a nascondere dalla lista dei processi di Windows un eseguibile scritto in C/C++.
Se vi state chiedendo perché desidero nasconderlo la risposta è semplice: sto sviluppando un software di sicurezza informatica che dovrà essere in grado di scansionare qualsiasi programma giri sul pc. Ho quindi deciso di ampliare le funzioni anche per i software che non vengono visualizzati in lista processi.
Il programma è infatti un semplice "Hello Word", che userò per i miei test.
Ho fatto diverse ricerche online ma nessuna sembra risolva questo quesito.
Ringrazio in anticipo chi vorrà dare il proprio contributo.
x_Master_x
05-12-2016, 16:49
Argomento borderline per dire poco, ti sconsiglio di entrare nei dettagli. Parlando in modo generico, anche se un virus-rootkit riesce a nascondersi dalla lista dei processi del task manager non é invisibile agli occhi di chi ha un monitor per le API come CreateProcess, CreateWindow e così via, deve usarne una o più di una, quindi al tuo "software di sicurezza" non sfugge.
softwareh
05-12-2016, 17:06
Argomento borderline per dire poco, ti sconsiglio di entrare nei dettagli. Parlando in modo generico, anche se un virus-rootkit riesce a nascondersi dalla lista dei processi del task manager non é invisibile agli occhi di chi ha un monitor per le API come CreateProcess, CreateWindow e così via, deve usarne una o più di una, quindi al tuo "software di sicurezza" non sfugge.
Non ho ben capito: posso creare un monitor per le API utilizzate? E' bellissima questa cosa, pensavo non fosse possibile (il mio software si basa su altri dati visibili). Sapresti darmi ulteriori informazioni?
Grazie ancora!
x_Master_x
05-12-2016, 17:55
Ti invito ad una ricerca su MSDN. Puoi iniziare da qui:
https://msdn.microsoft.com/en-us/library/ms644977(v=VS.85).aspx
Puoi usare anche WMI se per te é più semplice.
softwareh
05-12-2016, 18:00
Ti invito ad una ricerca su MSDN. Puoi iniziare da qui:
https://msdn.microsoft.com/en-us/library/ms644977(v=VS.85).aspx
Puoi usare anche WMI se per te é più semplice.
Potresti spiegarmi direttamente?
E' possibile creare un monitor che legga le funzioni utilizzate dai vari programmi? Ad esempio posso scegliere di vedere quando viene utilizzato un printf("prova") in un programma? Oppure ci si limita a chiamate di sistema?
Grazie!
x_Master_x
05-12-2016, 19:34
Spiegare cosa? Su MSDN trovi tutte le informazioni che cerchi comunque sì devi basarti sulle chiamate di sistema ma non capisco cosa c'entri il printf con la questione del processo.
Buonasera a tutti,
vorrei sapere come faccio a nascondere dalla lista dei processi di Windows un eseguibile scritto in C/C++.
Se vi state chiedendo perché desidero nasconderlo la risposta è semplice: sto sviluppando un software di sicurezza informatica che dovrà essere in grado di scansionare qualsiasi programma giri sul pc. Ho quindi deciso di ampliare le funzioni anche per i software che non vengono visualizzati in lista processi.
Il programma è infatti un semplice "Hello Word", che userò per i miei test.
Ho fatto diverse ricerche online ma nessuna sembra risolva questo quesito.
Ringrazio in anticipo chi vorrà dare il proprio contributo. E' passato un bel po' di tempo ormai dall'ultima volta che ho fatto ste porcate. :asd:
Comunque: cio' che facevo io era di creare una DLL anziche' un EXE, cosicche' rilevarla fosse un po' piu' difficile perche' un programma come Task Manager non bastava piu'.
Poi mi sono evoluto e ho creato una DLL che appena caricata allocava un'area di memoria nel processo ospite, ci si ricopiava, e restituiva FALSE dalla DllMain cosi' da "fallire" il caricamento. La DLL vera e propria non veniva caricata, ma la copia in memoria rimaneva.
Per quanto riguarda il modo in cui triggeravo il caricamento iniziale, ora purtroppo non ricordo cosa avevo arrangiato ma probabilmente installavo un qualche componente OLE che veniva usato da explorer.exe, cosicche' questi fosse il processo ospite.
Poi pero' mi sono evoluto anche su questo e ho creato un installer che di fatto modificava explorer.exe aggiungendo sezioni di codice e dati che erano quelle della "DLL", che a quel punto non era piu' una DLL perche' veniva di fatto linkata in explorer.exe. Ho potuto fare questa roba perche' ero gia' abbastanza esperto del format PE/COFF, le cui specifiche ho appena ritrovato qui: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85).aspx
Tutto cio' ovviamente funzionava solo su installazioni di Windows dove l'utente che eseguiva l'installer aveva la possibilita' di modificare explorer.exe, cosa che si e' protratta per molti anni vista la longevita' di XP e delle sue installazioni di default. :D
Da notare che l'installazione di un componente OLE richiedeva invece meno permessi, l'utente che lanciava l'installer di solito poteva installarne per se' stesso anche senza essere amministratore (solo per se' stesso ovviamente, non per altri utenti).
Per quanto riguarda l'intercettazione delle API, purtroppo non ho mai conosciuto a fondo il sopracitato WMI e non so esattamente a che serva. Io all'epoca usai sta roba qua: https://www.microsoft.com/en-us/research/project/detours/
Potresti spiegarmi direttamente?
E' possibile creare un monitor che legga le funzioni utilizzate dai vari programmi? Ad esempio posso scegliere di vedere quando viene utilizzato un printf("prova") in un programma? Oppure ci si limita a chiamate di sistema? Con le Detour che ho menzionato sopra si puo' intercettare qualunque funzione, "di sistema" e non, ma bisogna averne l'indirizzo. Avere l'indirizzo di una funzione API di sistema e' facile perche' basta dipendere dalla DLL che la esporta, ma per la printf la situazione e' complicata perche' e' una funzione del runtime di Visual C++ di cui possono esistere piu' versioni nel sistema e di cui moduli diversi possono caricare versioni diverse. Quindi la printf che vedi tu potrebbe non essere esattamente la stessa usata dal programma a partire dal quale e' stato avviato il processo.
Ora, tutta sta roba sono mie reminescenze di prima che passassi prima allo sviluppo web e poi a Linux, ossia almeno 5-6 anni fa. Nel frattempo non so piu' neanche a che versione siamo di Windows (la 10?), Windows non e' piu' su nessuno dei miei sistemi e non ho piu' idea di come funzioni.
Altra cosa. Se oltre ai processi vuoi enumerare anche tutte le DLL caricate nel sistema, questa API ti sara' fondamentale:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682633(v=vs.85).aspx
Tuttavia non e' sufficiente poiche', come ho scritto sopra, non sarebbe stata in grado di enumerare le DLL che ho creato io: ne' quella che si ricopiava in memoria e poi falliva il caricamento, ne' quella che veniva linkata dentro explorer.exe.
Ah, e in tutto cio' non abbiamo neanche toccato tutto il discorso "drivers". Immagina se il modulo che "si ricopia in memoria e poi fallisce il caricamento" fosse un driver anziche' una DLL. A quel punto non esiste nessun approccio ragionevole per il rilevamento di un simile malware.
Tuttavia la situazione dei driver su Windows oggi potrebbe essere migliorata molto rispetto ad allora. Ricordo che gia' quando ancora arrangiavo porcate cominciava a essere obbligatoria la firma.
softwareh
07-12-2016, 14:06
Ah, e in tutto cio' non abbiamo neanche toccato tutto il discorso "drivers". Immagina se il modulo che "si ricopia in memoria e poi fallisce il caricamento" fosse un driver anziche' una DLL. A quel punto non esiste nessun approccio ragionevole per il rilevamento di un simile malware.
Tuttavia la situazione dei driver su Windows oggi potrebbe essere migliorata molto rispetto ad allora. Ricordo che gia' quando ancora arrangiavo porcate cominciava a essere obbligatoria la firma.
Per questi miei test potrei anche utilizzare una versione di Windows obsoleta (metto XP o qualsiasi s.o. necessario in un vecchio PC e faccio le mie prove).
Ho fatto diverse ricerche e mi sembra di capire che scrivere un driver è paradossalmente più semplice ed inoltre tu mi confermi che renderebbe il compito ancor più arduo, quindi direi che è la soluzione ideale.
Sbaglio oppure basta creare un nuovo driver e come codice inserisco il mio "Hello World" ?
Non ho idea di come tu abbia fatto a giungere alla conclusione che scrivere un driver e' "semplice". :stordita:
softwareh
08-12-2016, 13:50
Non ho idea di come tu abbia fatto a giungere alla conclusione che scrivere un driver e' "semplice". :stordita:
Ho scritto che "scrivere un driver è PIU' semplice": è un comparativo di maggioranza ed il secondo termine del paragone non l'ho scritto ma riguarda l'altra alternativa che mi era stata proposta.
Inoltre ho trovato online diversi tutorial che spiegano come iniziare a far ciò e, che tu ci creda o no, in 10 minuti sviluppano un driver di prova (che non fa nulla di utile). Ti ricordo che il mio quesito non riguarda lo sviluppo di un driver reale ma la conversione di un normale "Hello World" in un driver.
Tornando alla dll non mi è chiara una cosa: una volta che "converto" l'exe in dll posso aprire e chiudere il programma quando mi pare? Potrei utilizzarlo normalmente?
Grazie!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.