Come rilevare da un processo se un debugger è attivo
Transcript
Come rilevare da un processo se un debugger è attivo
Come rilevare da un processo se un debugger è attivo Scritto da Administrator Giovedì 19 Novembre 2009 15:41 - Ultimo aggiornamento Sabato 19 Giugno 2010 16:23 A volte potrebbe essere utile capire se un processo è sotto l'osservazione di un debugger o meno. Per fare ciò basta rilevare un preciso campo del PEB (Process Enviroment Block), ed in particolar modo il terzo byte a partire dal suo inizio: Dump - 7FFDE000..7FFDEFFF Indirizzo Codice Commenti 7FFDE000 00 ; InheritedAddressSpace = 0 7FFDE001 00 ; ReadImageFileExecOptions = 0 7FFDE002 01 ; BeingDebugged = TRUE 7FFDE003 00 ; SpareBool = FALSE 7FFDE004 FFFFFFFF ; Mutant = INVALID_HANDLE_VALUE 7FFDE008 00004000 ; ImageBaseAddress = 00400000 7FFDE00C A01E2400 ; LoaderData = 241EA0 ... La seguente applicazione mostra come con poche istruzioni è possibile risalire a questa informazione: program CheckDebug; {$APPTYPE CONSOLE} uses SysUtils; function CheckDebugger:boolean; begin asm mov EAX,FS:[$30] //ricavo l'indirizzo del PEB dal TEB mov EAX,[EAX] //carico in EAX i primi 4 byte del PEB and EAX,$10000 //controllo se il terzo byte - cmp EAX,$10000 //-- è uguale a 1 je @debugOK mov result,0 jmp @fine @debugOK: mov result,1 @fine: end; end; begin if CheckDebugger then Writeln('Debugger attivo!') 1/2 Come rilevare da un processo se un debugger è attivo Scritto da Administrator Giovedì 19 Novembre 2009 15:41 - Ultimo aggiornamento Sabato 19 Giugno 2010 16:23 else Writeln('Debugger non attivo'); Readln; end. Il tutto è veramente semplice per non dire banale, ma per i vari dettagli sarebbe opportuno leggere l'articolo sulla struttura TEB e in generale sulla struttura dei file PE . Un metodo più classico è quello di ricorrere alle API di windows, in particolare una funzione nella libreria kernel32.dll : IsDebuggerPresent. function IsDebuggerPresent:boolean; external 'kernel32.dll' ; procedure VerificaDebugger; begin if IsDebuggerPresent then MessageBox('ok'); else MessageBox('no'); end; Questa funzione fa esattamente la stessa cosa ossia controlla il terzo byte del PEB, solo che usa una istruzione un po diversa: 64:A1 1800000 MOV EAX,DWORD PTR FS:[18] //ricava l'indirizzo del TEB stesso 8B40 30 MOV EAX,DWORD PTR DS:[EAX+30]//ricava l'indirizzo del PEB 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX+2]//Prende il terzo byte e lo usa come risposta se il byte è 1 allora la risposta sarà positiva altrimenti no. 2/2
Documenti analoghi
Introduzione all`analisi dei malware
La Import Address Table
IAT:
●Tabella di “puntatori a funzioni esterne”
utilizzate dalla applicazione
●Locazione delle dll dinamica,
la struttura viene popolata a runtime dal PE loader
Quando vien...