Packer (informatica): differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica |
|||
Riga 8:
==Tecniche anti-disasm==
Le tecniche anti-disassembly sono molteplici e, perlomeno quelle più conosciute, vengono rilevate e gestite
In particolare, disassembler come [[IDA pro]] riescono a riconoscere la presenza di un packer e permettono un disassembling selettivo del codice (l'utente decide cosa disassemblare e cosa no).
===Junk Code===
Il junk code è una tecnica che consiste nel mischiare dati e codice insieme. Questa tecnica ha lo scopo di far perdere l'allineamento al disassembler che tenterà di decodificare dei dati (e quindi non delle istruzioni). La tecnica usata dai disassembler più avanzati è quella di considerare "dati" tutto quello che, nel corso del programma, non verrà mai eseguito.
Il junk code è facilmente identificabile anche da un essere umano, perché la sua decodifica di solito produce:
* errore, il codice non corrisponde a nessun opcode. In questo caso la presenza di junk code è palese.
* istruzioni privilegiate, davvero
* salti a porzioni di codice visibilmente fuori dal programma. Questo avviene se il codice del junk code corrisponde ad un istruzione di salto (condizionato o no).
Il junk code può essere usato anche per altri scopi.
Riga 31 ⟶ 32:
In questa porzione di codice viene chiamata la funzione func1 che incrementa l'indirizzo di ritorno di func1 per fare in modo che "DB ..." non venga eseguito.
Nell'analisi di questa porzione di codice con un debugger, è facile accorgersi che lo [[step-over]] della funzione "func1" non ha l'effetto sperato: l'esecuzione continua fino al termine del programma. Questo è dovuto al fatto che i più comuni strumenti di debugging, nell'eseguire lo step-over, impostano un [[breakpoint]] subito dopo la chiamata della funzione. Di conseguenza per un debugger una funzione non è terminata fin quando l'istruction pointer non punta all'istruzione successiva alla CALL.
===Virtual machine===
Questa tecnica è sicuramente una delle più difficili da gestire. Consiste nel simulare un microprocessore (con un set di istruzioni personalizzato). Tutti gli opcodes presenti nel programma dovranno quindi essere decodificate dal processore virtuale e, a loro volta, da quello reale. Come è facile intuire questa tecnica introduce un leggero [[overhead]] (ridotto al minimo utilizzando istruzioni di virtualizzazione, ove presenti).
==Collegamenti esterni==
|