Ci sono degli svantaggi nell’usare UPX per comprimere un eseguibile di Windows?

Ho usato UPX prima per ridurre la dimensione dei miei eseguibili di Windows, ma devo ammettere che sono ingenuo con qualsiasi effetto collaterale negativo che questo potrebbe avere. Qual è il lato negativo di tutto questo imballaggio / disimballaggio?

Ci sono scenari in cui qualcuno consiglierebbe NON UPX di eseguire un eseguibile (ad esempio quando si scrive una DLL, un servizio di Windows o quando si mira a Vista o a Win7)? Scrivo la maggior parte del mio codice in Delphi, ma ho usato UPX per comprimere anche gli eseguibili C / C ++.

Da un lato, non sto eseguendo UPX in qualche tentativo di proteggere il mio exe dai disassemblatori, solo per ridurre le dimensioni dell’eseguibile ed evitare manomissioni.

Il motivo è che ci sono aspetti negativi nell’utilizzo di compressori EXE. Soprattutto:

All’avvio di un file EXE / DLL compresso, tutto il codice viene decompresso dall’immagine del disco in memoria in un unico passaggio, il che può causare il disco thrash se il sistema ha poca memoria ed è obbligato ad accedere al file di scambio. Al contrario, con EXE / DLL non compressi, il sistema operativo alloca la memoria per le code page su richiesta (cioè quando vengono eseguite).

Più istanze di un EXE / DLL compresso creano più istanze del codice in memoria. Se si dispone di un file EXE compresso contenente 1 MB di codice (prima della compressione) e l’utente avvia 5 istanze di esso, vengono sprecati circa 4 MB di memoria. Allo stesso modo, se si dispone di una DLL che è 1 MB e viene utilizzata da 5 applicazioni in esecuzione, vengono sprecati circa 4 MB di memoria. Con EXE / DLL non compressi, il codice viene memorizzato solo una volta e viene condiviso tra le istanze.

http://www.jrsoftware.org/striprlc.php#execomp

Sono sorpreso che questo non sia stato ancora menzionato, ma l’uso di eseguibili UPX aumenta anche il rischio di produrre falsi positivi dal software anti-virus euristico perché statisticamente un sacco di malware usa anche UPX.

Ci sono tre inconvenienti:

  1. L’intero codice sarà completamente decompresso nella memoria virtuale, mentre in un normale EXE o DLL, solo il codice effettivamente utilizzato viene caricato in memoria. Ciò è particolarmente rilevante se viene utilizzata solo una piccola parte del codice nel tuo EXE / DLL ad ogni esecuzione.
  2. Se sono presenti più istanze di DLL ed EXE in esecuzione, il loro codice non può essere condiviso tra le istanze, quindi utilizzerai più memoria.
  3. Se il tuo EXE / DLL è già nella cache, o su un supporto di memoria molto veloce, o se la CPU su cui stai lavorando è lenta, sperimenterai una velocità di avvio ridotta poiché la decompressione dovrà ancora avvenire e non lo farai beneficiare delle dimensioni ridotte. Questo è particolarmente vero per un EXE che verrà richiamato più volte ripetutamente.

Quindi gli svantaggi sopra riportati sono più un problema se il tuo EXE o DLL contiene molte risorse, ma in caso contrario, potrebbero non essere molto utili nella pratica, date le dimensioni relative degli eseguibili e della memoria disponibile, a meno che tu non stia parlando di DLL usato da molti file eseguibili (come DLL di sistema).

Per dissipare alcune informazioni errate in altre risposte:

  • UPX non influenzerà la tua capacità di girare su macchine protette da DEP.
  • UPX non influenzerà la capacità dei principali software anti-virus, in quanto supportano gli eseguibili compressi UPX (così come altri formati di compressione eseguibili).
  • UPX è stato in grado di utilizzare la compressione LZMA da un po ‘di tempo (l’algoritmo di compressione di 7zip), utilizzare l’opzione –lzma.

L’unica dimensione temporale è durante il download da Internet. Se si utilizza UPX, si ottengono prestazioni peggiori rispetto a quando si utilizza 7-zip (in base ai test effettuati, 7-Zip è due volte più buono di UPX). Quindi, quando viene effettivamente lasciato sul computer di destinazione, le prestazioni diminuiscono (vedi la risposta di Lars). Quindi UPX non è una buona soluzione per le dimensioni del file. Basta 7zip il tutto.

Al fine di evitare manomissioni, è un errore anche. UPX supporta anche la decompressione. Se qualcuno vuole modificare l’EXE, vedrà che è compresso con UPX e quindi decomprimerà. La percentuale di possibili cracker che potresti rallentare non giustifica lo sforzo e la perdita di prestazioni.

Una soluzione migliore sarebbe usare la firma binaria o almeno un semplice hash. Un semplice sistema di verifica hash consiste nel prendere un hash del tuo binario e un valore segreto (di solito un guid). Solo il tuo EXE conosce il valore segreto, quindi quando ricalcola l’hash per la verifica può utilizzarlo di nuovo. Questo non è perfetto (il valore segreto può essere recuperato). La situazione ideale sarebbe utilizzare un certificato e una firma.

Di questi tempi, la dimensione finale dell’eseguibile su disco è in gran parte irrilevante. Il tuo programma potrebbe caricare alcuni millisecondi più velocemente, ma una volta avviato, la differenza è indistinguibile.

Alcune persone potrebbero essere più sospettose del tuo eseguibile solo perché è compresso con UPX. A seconda dei tuoi utenti finali, questo può o non può essere una considerazione importante.

L’ultima volta che ho provato a utilizzarlo su un assembly gestito, l’ho modificato in modo tale che il runtime ha rifiutato di caricarlo. Questa è l’unica volta in cui riesco a pensare che non vorresti usarlo (e, davvero, è passato così tanto tempo da quando ho provato che la situazione potrebbe essere anche migliore ora). L’ho usato ampiamente in passato su tutti i tipi di file binari non gestiti e non ho mai avuto un problema.

Se il tuo unico interesse è nel ridurre la dimensione degli eseguibili, allora hai provato a confrontare le dimensioni dell’eseguibile con e senza i pacchetti di runtime? Certo, dovrai includere anche le dimensioni dei pacchetti insieme al tuo eseguibile, ma se hai più eseguibili che usano gli stessi pacchetti base, i tuoi risparmi sarebbero piuttosto alti.

Un’altra cosa da guardare sarebbe la grafica / glifi che usi nel tuo programma. È ansible risparmiare un po ‘di spazio consolidandoli in un singolo Timagelist incluso in un modulo dati globale piuttosto che averli ripetuti su ogni modulo. Credo che ogni immagine sia memorizzata nella risorsa modulo come esadecimale, quindi ciò significherebbe che ogni byte occupa due byte … è ansible ridurlo un po ‘caricando l’immagine da una risorsa RCData utilizzando un TResourceStream.

IMHO routinariamente UPXing è inutile, ma le ragioni sono scritte sopra, principalmente, la memoria è più costosa del disco.

Erik: lo stub LZMA potrebbe essere più grande. Anche se l’algoritmo è migliore, non sempre è un vantaggio netto.

Gli scanner antivirus che cercano virus “sconosciuti” possono contrassegnare gli eseguibili compressi UPX come se avessero un virus. Mi è stato detto che ciò è dovuto al fatto che diversi virus utilizzano l’UPX per nascondersi. Ho usato UPX sul software e McAfee contrassegnerà il file come avente un virus.

La ragione per cui UPX ha così tanti falsi allarmi è perché la sua licenza aperta consente agli autori di malware di usarli e modificarli con impunità. Naturalmente, questo problema è inerente al settore, ma purtroppo il grande progetto UPX è afflitto da questo problema.

AGGIORNAMENTO: Si noti che quando il progetto Taggant è completato, la capacità di utilizzare UPX (o qualsiasi altra cosa) senza causare falsi positivi verrà migliorata, supponendo che UPX lo supporti.

Non ci sono inconvenienti.

Ma solo FYI, c’è un malinteso molto comune riguardo UPX come …

le risorse NON vengono semplicemente compresse

Essenzialmente si sta costruendo un nuovo eseguibile che ha un compito di “loader” e l’eseguibile “reale”, beh, viene sottoposto a stripping di sezione e compressione, collocato come risorsa di dati binari dell’eseguibile del caricatore (indipendentemente dal tipo di risorse presenti l’eseguibile originale).

L’utilizzo di metodi e strumenti di reverse engineering per scopi didattici o altro ti mostrerà le informazioni relative al “eseguibile del caricatore” e non le informazioni variabili relative all’eseguibile originale.

eseguibile non compresso da UPX

eseguibile compresso da UPX

Credo che ci sia la possibilità che non funzioni su computer con DEP (Data Execution Prevention) triggersto.