2012-01-20 10 views
8

può rilevare se un debugger è collegato al processo nativo Windows utilizzando un timer ad alta precisione per quanto tempo ci vuole per dividere un numero intero per zero?Potete rilevare un debugger collegata al processo utilizzando Div da Zero

La logica è che se non debugger è collegato, si ottiene un errore di duro, che è gestito da hardware ed è molto veloce. Se è collegato un debugger, si ottiene invece un errore soft, che viene percolato fino al sistema operativo e infine al debugger. Questo è relativamente lento.

+1

hai provato esso? –

+2

L'ho provato. Penso che ci sia una correlazione statistica, ma non puoi usarla in modo affidabile perché è difficile scegliere una soglia di cutoff per quanto tempo ci vorrà per un hardware diverso. –

+3

E se una interruzione arrivasse in quel momento? Che ne dici di un interruttore di contesto? Nel migliore dei casi otterrai un risultato probabilistico. –

risposta

1

la maggior parte dei debugger utilizzati dai tecnici inversi sono dotati di metodi per influire (rimuovere) il 99% dei segni lasciati dai debugger, la maggior parte di questi debug ha fornito filtri di eccezione, il che significa che la differenza di velocità non sarebbe rilevabile.

è più produttivo per impedire l'attacco del debugger in primo luogo, ma a lungo termine non si uscirà mai avanti a meno che non si effettui l'investimento di sforzo richiesto non fattibile.

4

Poiché non v'è assolutamente nulla si può fare per evitare che una persona determinata dal reverse engineering del codice, nessun approccio intelligente a trovare sarà significativamente migliore di chiamare IsDebuggerPresent()

+0

Per essere più precisi, la persona reverse engineering il codice potrebbe semplicemente fornire un timer virtualizzato che nasconde il tempo trascorso nel debugger ... –

+0

... o semplicemente rimuovere qualunque è che avete intenzione di fare dopo aver rilevato la divisione lenta da 0 ... o semplicemente rimuovere la divisione per zero per sé ... o semplicemente leggere il codice smontato ... o non sprecare il suo tempo sull'applicazione che dubito davvero valga la pena di decodificare. –

+2

Sì, non è chiaro cosa c'è di sbagliato nell'usare l'ovvio approccio qui e chiamare 'IsDebuggerPresent'. Qualcuno ha commentato questo, ma il richiedente si è appena arrabbiato e invece lo ha definito "nessuno". –

3

No. Un attaccante sufficientemente determinata sarebbe semplicemente ospitare il vostro processo in una VM e irrompere in quel modo.

Inoltre, non è necessario collegare un debugger per attaccare un programma: l'acquisizione di un minidump consente ad un avversario di controllare lo stato della memoria offline o utilizzando process explorer è possibile esaminare gli handle aperti per determinare quali file sono vulnerabili.

Se si dovesse utilizzare un'eccezione per determinare se fosse collegato un debugger naive, utilizzare personalmente INT_MIN/-1 per attivare un'eccezione di overflow intero. La maggior parte non lo sa.

+1

Va notato che in realtà non è banale (in C) eseguire una divisione per zero o 'INT_MIN/-1'. Dato che è UB, finché il compilatore è in grado di rilevare in fase di compilazione che ciò accada, è libero di ottimizzarlo o fare quello che gli pare ... Spesso è necessario saltare attraverso alcuni cerchi per nascondere il comportamento del compilatore se in realtà vuoi che l'istruzione venga eseguita dalla CPU ... –

+0

Su x86, verrà generata la stessa eccezione (#DE) per entrambe le divisioni per 0 e INT_MIN/-1. –

+0

@R ..: memorizza il numeratore o il denominatore in una variabile volatile e la maggior parte dei compilatori genera il codice per la divisione. –

Problemi correlati