View Full Version : [C/C++] Detecting Windows NT/2K process execution
Teo@Unix
29-08-2011, 11:48
Ciao,
sto seguendo questo (http://www.codeproject.com/KB/threads/procmon.aspx)esempio per capire come realizzare un driver molto simile, ma che oltre segnalare la creazione e l'arresto di un processo dia possibilità alla app. in user-space di decidere se eseguire o meno il processo stesso.
Non saprei come modificare la callback definita nel driver. Che io sappia, in base a ciò che la callback ritorna il processo viene eseguito o meno...
Avete dei suggerimenti?
Grazie.
banryu79
29-08-2011, 12:23
Ciao,
sto seguendo questo (http://www.codeproject.com/KB/threads/procmon.aspx)esempio per capire come realizzare un driver molto simile, ma che oltre segnalare la creazione e l'arresto di un processo dia possibilità alla app. in user-space di decidere se eseguire o meno il processo stesso.
Non saprei come modificare la callback definita nel driver. Che io sappia, in base a ciò che la callback ritorna il processo viene eseguito o meno...
Avete dei suggerimenti?
Grazie.
Ciao, penso che basti implementare la callback (vedo che nell'esempio è definitia come un'interfaccia che la specifica user-application implementa come vuole) in modo che termini lei stessa il processo appena lanciato in base alla logica applicativa (ad esempio se il processo si chiama "notepad.exe" o altro).
Oppure potresti definire più di una singola callback da far implementare alle client application.
Cioè, nell'esempio c'è ne solo una che viene chiamata (OnProcessEvent) indifferentemente per tutti gli eventi (processo lanciato, terminato);
tu potresti crearne di specifiche, in particolare una apposta per i processi appena lanciati (che potresti chiamare OnProcessLaunched): chi è interessato a terminare i processi appena lanciati la implementerà con la sua logica particolare.
Teo@Unix
29-08-2011, 15:52
grazie,:)
Ma il driver posso lasciarlo invariato allora?
Hai delle info più dettagliate? Non ho mai usato gli eventi di windows tanto meno lavorato su driver...
Grazie mille.
banryu79
29-08-2011, 16:21
grazie,:)
Ma il driver posso lasciarlo invariato allora?
Hai delle info più dettagliate? Non ho mai usato gli eventi di windows tanto meno lavorato su driver...
Grazie mille.
No, mi spiace, ne so quanto te (anzi, ho il fondato sospetto di saperne molto meno :p ). Ti ho detto quello che ti ho detto sulla base della mie poche conoscenze applicate alle informazioni racimolate dalla veloce lettura dell'articolo da te linkato.
Non ho però scaricato il codice dell'esempio allegato (mi sono quindi basato solo sugli stralci di codice pubblicati nella pagina), tu l'hai consultato? Imagino che con quello in mano puoi fare un confronto, una prova e magari copiarlo pari pari per creartene una copia modificata come pensi ti serva e fare dei test.
Teo@Unix
29-08-2011, 20:43
Si in effetti sto facendo il debug del driver, almeno capisco meglio :) ... non è semplicissimo visto che driver per windows non ne ho mai fatti... e devo ingurgitare un sacco di info nuove...
Rimango della speranza che se modifico quello dovrei riuscire a fare quello che voglio... però è la user-app che deve determinare se eseguirlo o no e non posso permettermi di terminare il processo da user-space tramite PID, perchè significa eseguirlo comunque prima... devo bloccare prima che il processo venga eseguito.
Teo@Unix
30-08-2011, 14:54
Credo che questa (http://msdn.microsoft.com/en-us/library/ff554758(v=VS.85).aspx)sia la soluzione migliore.
Ci sono svariati modi, il problema che ti poni tu è quello della comunicazione/notifica driver->user mode, è più complesso perché solitamente si affronta il contrario, cioè user mode->driver.
Soluzioni varie:
1) Comunicazione tra user mode e kernel mode tramite section condivise (shared sections), regolamentate da elementi di sincronizzazione
2) Abusare della FltSendMessage dei minifilter driver
3) LPC communication (http://www.zezula.net/en/prog/lpc.html), quindi NtListenPort/NtConnectPort/etc...etc...
Solitamente il metodo 3 è molto apprezzato, anche se il 2 è molto più semplice da implementare quando si utilizzano minifilter driver
Scusa se non ti ho risposto via e-mail, me la sono persa nel mare di e-mail ;) :)
Teo@Unix
01-09-2011, 11:21
Grazie :)
In questi giorni stò provando ad usare il minifilter che Microsoft fornisce per la scansione, vedo che è già piuttosto completo... almeno per iniziare...
anche se da C++ ora ho un problema con FilterReplyMessage() che ritorna 0x800700ea ... tutti i miei thread danno quell'errore ..
anche se non mi sembra che questo impedisca il funzionamento corretto... l'unica cosa è che dal loro client di esempio scritto in C non succede...
tu hai qualche info al riguardo per caso?
EDIT:
cioè è importante che vada, perchè a quanto ho capito serve a informare il driver .... mmm
Grazie :)
In questi giorni stò provando ad usare il minifilter che Microsoft fornisce per la scansione, vedo che è già piuttosto completo... almeno per iniziare...
anche se da C++ ora ho un problema con FilterReplyMessage() che ritorna 0x800700ea ... tutti i miei thread danno quell'errore ..
anche se non mi sembra che questo impedisca il funzionamento corretto... l'unica cosa è che dal loro client di esempio scritto in C non succede...
tu hai qualche info al riguardo per caso?
EDIT:
cioè è importante che vada, perchè a quanto ho capito serve a informare il driver .... mmm
Prova a controllare le dimensioni dei buffer, perché potrebbe essere un problema di allocazione della memoria non sufficiente. Controlla lo status della FltSendMessage(), se è 0x80000005 (STATUS_BUFFER_OVERFLOW) significa che il buffer che stai utilizzando è troppo piccolo
Teo@Unix
01-09-2011, 15:22
Prova a controllare le dimensioni dei buffer, perché potrebbe essere un problema di allocazione della memoria non sufficiente. Controlla lo status della FltSendMessage(), se è 0x80000005 (STATUS_BUFFER_OVERFLOW) significa che il buffer che stai utilizzando è troppo piccolo
Grazie, è esattamente così. :D ... C++ non è C :fagiano:
Ora devo implementare il driver ma vedo che già è settato per bloccare i file che la user-app segnala come positivi ai controlli... difatti facendo delle prove su file di testo funziona bene.
Da lato driver hai delle linee guida su cosa aggiungere? Dovrà essere assegnato ad un software anti-virus...
La soluzione adottata è già abbastanza intelligente... e credo sia molto meglio che controllare i processi all'esecuzione..
stò pensando che solitamente software antivirus fanno diverse azioni oltre il blocco dell'operazione in corso che c'è nell'esempio... immagino che dovrò ampliare le info che user-app e driver si scambiano... quindi le possibili azioni compiute dal driver, blocco, eliminazione, spostamento ... etc..
Grazie, è esattamente così. :D ... C++ non è C :fagiano:
Ora devo implementare il driver ma vedo che già è settato per bloccare i file che la user-app segnala come positivi ai controlli... difatti facendo delle prove su file di testo funziona bene.
Da lato driver hai delle linee guida su cosa aggiungere? Dovrà essere assegnato ad un software anti-virus...
La soluzione adottata è già abbastanza intelligente... e credo sia molto meglio che controllare i processi all'esecuzione..
stò pensando che solitamente software antivirus fanno diverse azioni oltre il blocco dell'operazione in corso che c'è nell'esempio... immagino che dovrò ampliare le info che user-app e driver si scambiano... quindi le possibili azioni compiute dal driver, blocco, eliminazione, spostamento ... etc..
Ma che stai facendo? Per curiosità :D
quindi le possibili azioni compiute dal driver, blocco, eliminazione, spostamento ... etc..
La maggior parte di quello che hai detto può essere fatto tranquillamente in user mode. Evita di portare troppo in kernel mode, per quanto più possibile tieniti in user mode. Se hai poca esperienza di coding di driver in ambiente Windows, rischi molti BSOD :)
Teo@Unix
01-09-2011, 21:02
Un pezzo di un software anti-virus. Ovvero la parte che si interfaccia con il kernel in questo modo.
Naturalmente non è una roba per Symantec...
Un pezzo di un software anti-virus. Ovvero la parte che si interfaccia con il kernel in questo modo.
Naturalmente non è una roba per Symantec...
Capito, qualche nuova start up company che si vuole lanciare nel mondo degli antivirus? ;)
Teo@Unix
01-09-2011, 21:13
Capito, qualche nuova start up company che si vuole lanciare nel mondo degli antivirus? ;)
Già :) , ma non so io, faccio giusto questo.
Sicuramente sono obiettivi ambiziosi. Ma tanto di cappello.
Per lo meno io ho opportunità di approfondire queste cose.:)
Già :) , ma non so io, faccio giusto questo.
Sicuramente sono obiettivi ambiziosi. Ma tanto di cappello.
Per lo meno io ho opportunità di approfondire queste cose.:)
Decisamente molto ambiziosi :D
Teo@Unix
01-09-2011, 21:23
Decisamente molto ambiziosi :D
Alla fine tutto gioca sulle routine di pattern-matching immagino... bo sarei curioso di vederle...
Teo@Unix
01-09-2011, 22:59
A una cosa... per fare il debug in kernel-mode cosa usi?
Io stò provando VisualDDK, l'unica cosa è che quando sono fermo su un break point e passo il mouse sopra una variabile da visualizzare crasha tutto l'ambiente, simpatico no?
Alla fine tutto gioca sulle routine di pattern-matching immagino... bo sarei curioso di vederle...
:D detta così è banalizzata al massimo :) È molto più di un semplice signature scan, ci sono tecnologie dietro veramente molto, molto, molto complesse. Senza considerare che anche parlare del semplice signature scanning richiede una notevole esperienza, non è un argomento così immediato e banale. Per questo mi arrabbio sempre quando le persone parlano di software antivirus definendoli come "programmi stupidi, che hanno una black list e se il virus è presente nella lista viene bloccato, sennò infetta il PC". Chi parla così non ha la minima idea di quale grado di complessità ci sia dietro un software antivirus. Per questo motivo iniziare da zero un antivirus è un progetto molto, molto ambizioso; non tanto per il lavoro di codice che c'è dietro - che è immenso - ma più che altro per l'esperienza necessaria che serve per affrontare al meglio l'argomento.
A scrivere un software che ti blocca i malware in base al loro hash MD5, beh, sono capaci tutti. Ma quelli difficilmente si possono chiamare antivirus. Scrivere un programma capace di individuare e riparare infezioni causate ad esempio da Virut, Parite, Polip, Tenga, Sality, quello sì che diventa un'impresa molto più ardua, che richiede una notevole esperienza di reverse engineering, assembly, conoscenza del funzionamento del sistema operativo e molto, molto altro.
A una cosa... per fare il debug in kernel-mode cosa usi?
Io stò provando VisualDDK, l'unica cosa è che quando sono fermo su un break point e passo il mouse sopra una variabile da visualizzare crasha tutto l'ambiente, simpatico no?
Mai utilizzato VisualDDK. Il mio metodo? Molti DbgPrint e WinDbg sempre a portata di mano :)
Teo@Unix
02-09-2011, 07:28
Sono d'accordo.
Non conosco tali tecnologie, se non in via del tutto teorica... interessante. Anche secondo me si tratta di qualcosa di molto ambizioso... ma non conosco chi se ne stà occupando.
Grz dei consigli. :)
Sono d'accordo.
Non conosco tali tecnologie, se non in via del tutto teorica... interessante. Anche secondo me si tratta di qualcosa di molto ambizioso... ma non conosco chi se ne stà occupando.
Grz dei consigli. :)
Di nulla :) In bocca al lupo allora :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.