2016-02-17 33 views
8

Process Explorer a volte mostra un EXE come "immagine compressa", ma cosa significa.Windows EXE/DLL: cos'è una "immagine compressa"

Quello che ho scoperto è: Compilare un exe (utilizzando Visual C++ 2010) con l'opzione /ZI produce un'immagine compressa, ma non lo è /Zi. Perché questa differenza?

BTW: una DLL compilata con /ZI è anche considerata "immagine compressa" e contrassegnata in viola.

enter image description here

+0

Leggere la documentazione di Visual Studio: [/ Z7,/Zi,/ZI (formato informazioni di debug)] (https://msdn.microsoft.com/en-us/library/958x11bc.aspx) e vedere anche [ Understanding Process Explorer] (http://www.howtogeek.com/school/sysinternals-pro/lesson2/). –

+0

Ma quella pagina MSDN non dice nulla di "immagine compressa"; e che la pagina di Howtogeek non dice nulla sulle opzioni del compilatore/Zx. –

+0

I file il cui codice deve essere decompresso in memoria prima che possa essere eseguito. Segno comune di malware. http://forum.sysinternals.com/packed-images_topic442.html –

risposta

10

A "immagine imballato" è quella in cui il codice eseguibile è compresso con l'intenzione di rendere il file più piccolo. La riduzione tipica della dimensione del file si aggira intorno al 50%. Utilizza un "loader" in fase di runtime per decomprimere i dati in codice eseguibile prima che inizi l'esecuzione. È stato utile nei tempi passati con capacità limitata di archiviazione su disco e larghezza di banda limitata della rete.

Oggi con i dischi terabyte e le reti megabit è un odore, l'imballaggio può anche essere sfruttato per nascondere il codice dannoso. Sicuramente la ragione per cui Process Explorer la colora diversamente.

L'euristica esatta utilizzata da PE per rilevare l'imballaggio non è documentata. Certo che no, sarebbe troppo facile da eludere. Non è banale, non esiste un modo standard per implementare l'imballaggio. Approssimativamente, guarderebbe le sezioni nel file eseguibile e alzerebbe la bandiera blu quando troppe cose sembrano codice non eseguibile.

E sì, quando si utilizza/ZI ci sarà molto. Più significativa è l'opzione del linker/INCREMENTAL, attivata automaticamente quando si utilizza/ZI. Che ti permette di scrivere codice durante il debug, l'opzione Modifica + Continua. E ricollegare rapidamente il file eseguibile senza che il linker debba rigenerare completamente il file. Questo può funzionare solo quando c'è molto spazio vuoto nel file eseguibile, disponibile per aggiungere nuovi byte di codice macchina. Questa è una bandiera blu.

Non è una preoccupazione reale, ovviamente, il tuo utente vedrà solo la versione di rilascio del tuo programma. Che è costruito senza/ZI e senza/INCREMENTAL.

+0

Grazie per le tue informazioni, sembra ragionevole. Controllo la sezione '.text' di/ZI ouput e/Zi output. Il contenuto dei binari sembra molto diverso, la dimensione di .text è 142598 vs 136722, e penso che la maggior parte dei quali sono codice da LIBCMT.lib. È ancora difficile immaginare perché ciò faccia la Bandiera Blu. –

+0

Process Explorer potrebbe non renderlo pubblico come identificare le immagini compresse, ma Process Hacker fa come si può vedere nella mia risposta –

1

Dal Process Hacker source code:

Un'immagine viene imballato se:

  1. Si fa riferimento a meno di 3 moduli e
  2. Importa meno di 5 funzioni, e
  3. Lo fa non utilizzare il sottosistema nativo.

Oppure:

  1. Il rapporto funzione-modulo è inferiore a 3 (in media meno di 3 funzioni vengono importati da ciascun modulo), e
  2. fa riferimento più di 2 moduli ma meno di 6 moduli.

Oppure:

  1. Il rapporto funzione-modulo è inferiore a 2 (in media meno di 2 funzioni vengono importati da ciascun modulo), e
  2. fa riferimento più di 5 moduli ma meno di 31 moduli.

Oppure:

  1. non ha una sezione denominata ".text".

Un'immagine non viene considerata imballata se ha una sola importazione da un modulo denominato "mscoree.dll".

Puoi anche dare un'occhiata al codice soruce per capire come determinare se un'immagine è probabilmente impacchettata o se non lo è.