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