Zoom Icon

Anti Debugging Techniques

From UIC

Anti Debugging Techniques

Contents


Anti Debugging Techniques
Author: UICommunity
Email:
Website: Home
Date: 06/09/2010 (dd/mm/yyyy)
Level: Some skills are required
Language: English Flag English.gif
Comments: Everybody can add new tricks



Thanks to:

Giuseppe 'Evilcry' Bonfa', SatUrN, LittleLuk, M$, Intel©, Pn.


Generic Tricks

This page is a repository of known or new techniques used by reverse engineers to thwart the work of a debugger on a running program. This is a community page expanded by UIC members, so feel free to contribute to the repository.

CheckRemoteDebuggerPresent

Search on Msdn

IsDebuggerPresent

Search on Msdn

NtSetDebugFilterState

NtSetDebugFilterState_Anti-Dbg_Trick

TrapFlag

// Detect Debug with TrapFlag
        bool notDetected = false;
        __try
        {
#ifdef _M_IX86
                unsigned int eflag = __readeflags() | 0x00000100;
                __writeeflags(eflag);
#elif _M_X64
                unsigned __int64 eflag = __readeflags() | 0x00000100;
                __writeeflags(eflag);
#endif
                __nop();
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                notDetected = true;
        }
       
        if(notDetected)
        {
                MessageBox( NULL, _T("Not present"), _T("Debug"), MB_OK);
        }
        else
        {
                MessageBox( NULL, _T("Present"), _T("Debug"), MB_OK);
        }


Tricks on x86 architecture

BeingDebug

It's like IsDebuggerPresent

MOV EAX,DWORD PTR FS:[30]   ;fs:[30] return the PEB address
ADD EAX,2         ; PEB+2 is beingdebug memory address
MOV EAX,DWORD PTR DS:[EAX]   ; AL maybe 0(not debug) or 1(debug present)
OR AL,AL
JE NO_DEBUG

ProcessHeap

MOV EAX,DWORD PTR FS:[18]    ; fs:[18] return the TEB address
MOV EAX,DWORD PTR [EAX+30]   ;TEB+0x30 return the PEB address
MOV EAX, DWORD PTR[EAX+18]   ;PEB+0x18 retunr the ProcessHeap address
CMP DWORD PTR DS:[EAX+10],0  ;EAX+10  maybe 0(not debug) or other values (debug present)
JNE DEBUG_PRESENT

NtGlobalFlag

MOV EAX,DWORD PTR FS:[30]  ;fs:[30] return the PEB address
ADD EAX,068h; address of NtGlobalFlag
MOV EAX,DWORD PTR DS:[EAX] ; NtGlobalFlag maybe 0x70(debug present) or 0
TEST EAX, EAX
JE NO_DEBUG


Tricks on x64 architecture


Tricks for OllyDbg

Bye OllyDbg 1.10

;bye OllyDbg 1.10 :))
.data
byeolly qword -1
word 403Dh
.code
start:
fld tbyte ptr ds:[byeolly]
end start



Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.