Non capisco davvero come aggirare IsDebuggerPresent. Penso che dovrei trovare i registri usati per il debug e quindi impostarlo su 0 per ingannare IsDebuggerPresent, ma non so come farlo. Ho provato a cercare in giro per Google, e ho anche provato alcune soluzioni ma non ha funzionato davvero per me. Qualcuno potrebbe spiegarmi come dovrebbe funzionare e come ignorarlo?Come si ignora IsDebuggerPresent con OllyDbg?
risposta
Ci sono molti modi per farlo. Come hai detto, è possibile applicare patch al blocco di thread del programma. Ecco un tutorial, come muoversi IsDebuggerPresent, semplicemente patch questa funzione in modo restituisce sempre 0.
1) individuare IsDebuggerPresent
Nella mia situazione, è a 7664EFF7, e consistono di sole tre istruzioni + una RET. Legge il blocco del thread (l'indirizzo è in FS: 18), quindi individua il byte che dice "sto eseguendo il debug" e lo restituisce. Il valore restituito è memorizzato in EAX (come per la maggior parte delle funzioni WINAPI). Se modifico la funzione in modo che alla fine abbia EAX = 0, avrò saltato con successo IsDebuggerPresent.
2) patch
Ora il modo più semplice per farlo è quello di fare semplicemente la funzione di fare semplicemente un'istruzione MOV EAX, 0
e poi un RETN
:
Nota che ho anche riempito il resto della funzione con NOP per evitare di modificarne la dimensione. Probabilmente non è necessario, potresti anche solo fare MOV EAX, 0
e poi solo RETN
.
Inoltre, è necessario sapere che la modifica è valida solo per una corsa del programma. Quando lo riavvii, caricherà una nuova copia di kernel32.dll (dove si trova IsDebuggerPresent) con la funzione originale, e dovrai applicare nuovamente la patch. Se si desidera rendere permanente la patch, è necessario modificare il binario di avvio e modificare/rimuovere la chiamata a questa funzione. Ma prima di farlo devi anche assicurarti che il file binario non controlli se stesso per le modifiche.
C'è un modo per cercare il codice per "FS"? Inoltre, vedo più istanze di IsDebuggerPresent ... In realtà, non sono nemmeno sicuro di come trovare 'FS' e il posto giusto per rimuoverlo. Ovunque, vedo 'MOV DWORD PTR', ad es. 'MOV DWORD PTR V: [0], EAX' e' MOV EAX, DWORD PTR DS: [13000] ' – Strawberry
L'ho appena trovato seguendo le chiamate di funzione. Inoltre, ho capito che IsDebuggerPresent è solitamente usato per aggiungere spazzatura a rovinare ogni pensiero. Dovrei salvarlo dopo aver cambiato 'EAX = 0' e poi riaprirlo, quindi non carica la spazzatura? Non sono proprio sicuro di come funzioni, scusa! – Strawberry
Dovrebbe essere presente solo una posizione, in cui è definito IsDebuggerPresent, all'interno di kernel32.dll. Potrebbero esserci molte * chiamate * ad esso, ma se si aggiusta la funzione stessa, tutte le chiamate riceveranno "0" come risposta. Dovresti applicare la patch prima di eseguire il programma e devi applicarla ogni volta che lo esegui. – kuba
Iniettare questo codice nel vostro processo:
mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0
Questo sarà patchare il PEB.BeingDebugged
flag, garantendo IsDebuggerPresent
restituisce sempre 0
Quando si utilizza x64dbg è possibile eseguire il comando dbh
.
se si desidera che l'applicazione non controllare fare questo:
- Press
Alt + e
o apertiExecutable modules
finestra. - Selezionare
C:\WINDOWS\system32\kernel32.dll
e premerectrl + N
- selezionare
IsDebuggerPresent
e premere Invio. - premere
f2
- eseguire il programma e attendere l'interruzione del programma su questo codice operativo.
- premere un po 'di
f8
fino a tornare al vostro codice. - guardare per qualcosa come
TEST EAX,EAX
e dopo qualche cosa comeje
jnz
ed ecc, state attenti l'uscita diIsDebuggerPresent
viene salvato inEAX
. - se il salto si verifica su questo codice op lo cambia in
nop
e se non lo fa , cambiarlo injmp
. - salvare il programma. se non sai come salvare il codice modificato in ollyDBG basta cercarlo.
hai provato olly plugin come [Hide Debugger] (https://tuts4you.com/download.php?view.57) o [Olly Advanced] (https://tuts4you.com/download.php? view.75)? questi sono molto più facili da usare invece di modificare manualmente il codice ogni volta. – Arash