5

Listato 7.1 La Decryptor del virus CascadeSP (Stack Pointer) Anti-debug trucco - 86

lea si, Start ; position to decrypt (dynamically set) 

mov  sp, 0682 ; length of encrypted body (1666 bytes) 

Decrypt: 
xor  [si],si ; decryption key/counter 1 
xor  [si],sp ; decryption key/counter 2 
inc  si ; increment one counter 
dec  sp ; decrement the other 
jnz  Decrypt ; loop until all bytes are decrypted 

Start: ; Encrypted/Decrypted Virus Body 

Si noti che questo decryptor ha caratteristiche AntiDebug perché la SP (stack pointer) registro viene utilizzato come uno dei le chiavi di decodifica.

Qualcuno può spiegare perché l'utilizzo del registro SP si comporta come una funzione anti-debug? Correggetemi se sbaglio, ma non credo che avere un debugger in esecuzione cambia il layout pila ...

Grazie in anticipo

+0

Suoni sospettosamente come i compiti ... –

+0

Ottima domanda! –

risposta

1

mio x86-fu è arrugginito, ma mi sembra di ricordare il debug più breakpoint gli strumenti funzionano attivando un errore nella CPU e affermandosi come un processo supervisore, che fornisce un nuovo stack e un puntatore dello stack modificato in modo corrispondente. Quindi, passando da quel codice si otterrebbero valori di sp diversi da quelli che il processo normalmente vedrebbe se non fosse stato intrappolato da un debugger.

0

La maggior parte dei debugger si aspetta che [e] sp sia valido e che punta a un'area di stack. Credo che sia possibile che alcuni debugger si blocchino se sp non punta a una memoria valida, ma non ne conosco nessuno.

+1

Per definizione, (e) sp è valido. La maggior parte dei debugger se sono progettati in modo intelligente utilizzano la propria area di stack * propria * per evitare di sovraccaricare lo spazio di stack utilizzato dal programma applicativo. Vedere la mia risposta sul perché utilizzare il proprio stack non abilita il debugger a eseguire il debug di questo codice. –

+0

Ah, questo ha senso. Non pensavo ai gestori di interrupt. –

2

Se il segmento di stack è uguale al segmento di dati (si tratta di virus .com o .exe? Sembra .com, poiché il DS è già uguale a CS), qualsiasi modifica dello stack (debugger o persino interrupt) verrà modificata la memoria in cui ss: [sp] sta puntando e punta da qualche parte nel corpo del virus (perché è usato come contatore).

5

L'acquisizione di un punto di interruzione o di un interrupt "spinge i dati nello stack", danneggiando i byte di dati nell'area in cui il puntatore dello stack fa riferimento. Pertanto, se si inserisce un punto di interruzione (INT n) nel codice utilizzando un debugger, il proprio atto di debug (che incontra il punto di interruzione) distruggerà i dati che questo codice sta tentando di decodificare.

Questo codice potrebbe funzionare sotto DOS se non si verificano interruzioni; forse disabilitano prima gli interrupt. Non si può realisticamente usare questo sotto Windows o Linux (il suo codice a 16 bit comunque).

+0

Solo per elaborare la tua risposta: "INT n generalmente si comporta come una chiamata remota tranne che il registro flags viene inserito nello stack prima dell'indirizzo di ritorno. Le procedure di interruzione vengono restituite tramite l'istruzione IRET, che apre i flag e restituisce l'indirizzo dallo stack ". - http://pdos.csail.mit.edu/6.828/2008/readings/i386/INT.htm –

+0

Si scopre che questo trucco funziona bene su Windows a 32 bit. – Joshua