
Έχω χρησιμοποιήσει [UPX](http://upx.sourceforge.net/) πριν από τη μείωση του μεγέθους των εκτελέσιμα μου τα Windows, αλλά οφείλω να ομολογήσω ότι είμαι αφελής τυχόν αρνητικές παρενέργειες μπορεί να έχει αυτό. Ποιο είναι το μειονέκτημα σε όλη αυτήν την συσκευασία / αποσυσκευασία;


Υπάρχουν σενάρια στα οποία ο καθένας θα συνιστούσα να μην UPX-σης ένα εκτελέσιμο εκεί (π.χ. όταν γράφετε ένα αρχείο DLL, τα Windows Υπηρεσία, ή όταν στοχεύουν Vista ή Win7); Γράφω πιο κώδικα μου στους Δελφούς, αλλά έχω χρησιμοποιήσει UPX να συμπιέσει C / C ++ εκτελέσιμα, καθώς και.


Σε μια πλευρά σημείωση, εγώ **δεν** τρέχει UPX σε κάποια προσπάθεια για την προστασία της exe μου από disassemblers, μόνο για να μειώσει το μέγεθος του εκτελέσιμου και την πρόληψη βιαστική αλλοίωσης.

 
Υπάρχουν μειονεκτήματα στη χρήση UPX να συμπιέσετε ένα εκτελέσιμο των Windows εκεί;
===================================================================================




> 
> Ο λόγος είναι ότι υπάρχουν μειονεκτήματα από τη χρήση συμπιεστών EXE. Κυρίως:
> 
> 
> Κατά την εκκίνηση ενός συμπιεσμένου EXE / DLL, όλα του κώδικα αποσυμπιέζεται από την εικόνα δίσκου στη μνήμη σε ένα πέρασμα, το οποίο μπορεί να προκαλέσει αλώνισμα δίσκο, αν το σύστημα είναι χαμηλή μνήμη και αναγκάζεται να αποκτήσετε πρόσβαση στο αρχείο μετάθεσης. Σε αντίθεση, με ασυμπίεστο EXE / DLL, το λειτουργικό σύστημα διαθέτει μνήμη για σελίδες κώδικας για τη ζήτηση (δηλαδή, όταν εκτελούνται).
> 
> 
> Πολλαπλές περιπτώσεις ένα συμπιεσμένο EXE / DLL δημιουργήσετε πολλαπλές παρουσίες του κώδικα στη μνήμη. Εάν έχετε ένα συμπιεσμένο EXE που περιέχει 1 ΜΒ του κώδικα (πριν από τη συμπίεση) και ο χρήστης ξεκινά 5 περιπτώσεις από αυτό, περίπου 4 MB μνήμης σπαταλιέται. Ομοίως, εάν έχετε ένα αρχείο DLL που είναι 1 MB και χρησιμοποιείται από 5 εφαρμογές που εκτελούνται, περίπου 4 MB μνήμης σπαταλιέται. Με ασυμπίεστο EXE / DLL, κωδικός αποθηκεύεται μόνο στη μνήμη μία φορά και μοιράζεται μεταξύ των περιπτώσεων.
> 
> 
> 


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

 

Είμαι έκπληκτος κάτι τέτοιο δεν έχει αναφερθεί ακόμα, αλλά χρησιμοποιώντας UPX συσκευασμένα εκτελέσιμα αυξάνει επίσης τον κίνδυνο να παράγουν ψευδώς θετικά αποτελέσματα από την ευρετική anti-virus λογισμικό, επειδή στατιστικά πολλά malware χρησιμοποιεί επίσης UPX.

 

Υπάρχουν τρία μειονεκτήματα:


1. Το σύνολο του κώδικα θα είναι πλήρως ασυμπίεστο στην εικονική μνήμη, ενώ σε τακτά χρονικά EXE ή DLL, μόνο ο κώδικας που χρησιμοποιείται στην πραγματικότητα έχει φορτωθεί στη μνήμη. Αυτό είναι ιδιαίτερα σημαντικό αν μόνο ένα μικρό μέρος του κώδικα σε EXE σας / DLL χρησιμοποιείται σε κάθε δοκιμή.
2. Αν υπάρχουν πολλές παρουσίες του DLL και EXE λειτουργία, τον κωδικό τους δεν μπορεί να μοιραστεί μεταξύ των περιπτώσεων, έτσι θα πρέπει να χρησιμοποιούν περισσότερη μνήμη.
3. Αν σας EXE / DLL είναι ήδη στη μνήμη cache, ή σε πολύ γρήγορο μέσο αποθήκευσης, ή αν η CPU τρέχετε σε είναι αργά, θα ζήσετε μειωμένη ταχύτητα εκκίνησης και αποσυμπίεσης θα πρέπει ακόμα να λάβει χώρα, και δεν θα σας επωφεληθούν από το μειωμένο μέγεθος. Αυτό ισχύει ιδιαίτερα για ένα EXE που θα γίνει επίκληση πολλές φορές κατ 'επανάληψη.


Έτσι, τα παραπάνω μειονεκτήματα είναι περισσότερα από ένα θέμα, αν EXE ή DLL σας περιέχει πολλούς πόρους, αλλά κατά τα άλλα, μπορεί να μην είναι ένα μεγάλο μέρος ενός παράγοντα στην πράξη, δεδομένου του σχετικού μεγέθους των εκτελέσιμων αρχείων και τη διαθέσιμη μνήμη, εκτός και αν μιλάμε των DLLs που χρησιμοποιούνται από πολλά εκτελέσιμα (όπως το σύστημα DLL).


Για να dispell κάποιες ανακριβείς πληροφορίες σε άλλες απαντήσεις:


* UPX δεν θα επηρεάσει την ικανότητά σας να λειτουργεί με ΔΕΠ-προστατευμένο μηχανές.
* UPX δεν θα επηρεάσει την ικανότητα των μεγάλων λογισμικό anti-virus, όπως υποστηρίζουν UPX συμπιεσμένα εκτελέσιμα (καθώς και άλλα εκτελέσιμα μορφές συμπίεσης).
* UPX ήταν σε θέση να χρησιμοποιήσουν τη συμπίεση LZMA εδώ και αρκετό καιρό (αλγόριθμο συμπίεσης 7zip του), χρησιμοποιήστε το διακόπτη --lzma.

 

Τα μόνα θέματα που το μέγεθος του χρόνου είναι κατά κατεβάσετε από το Διαδίκτυο. Εάν χρησιμοποιείτε UPX τότε μπορείτε πραγματικά να πάρει χειρότερη απόδοση από ό, τι αν χρησιμοποιείτε [7-zip](http://www.7-zip.org/) (με βάση τις δοκιμές μου 7-Zip είναι δύο φορές τόσο καλή όσο UPX). Στη συνέχεια, όταν στην πραγματικότητα αριστερά συμπιέζεται στον υπολογιστή στόχο την απόδοσή σας μειώνεται (βλέπε απάντηση Lars'). Έτσι UPX δεν είναι μια καλή λύση για το μέγεθος του αρχείου. Απλά 7Zip το όλο θέμα.


Όσον αφορά την πρόληψη αλλοίωσης, είναι ***FAIL*** επίσης. UPX υποστηρίζει αποσυμπίεση πάρα πολύ. Αν κάποιος θέλει να τροποποιήσει το EXE τότε θα δείτε ότι είναι συμπιέσει με UPX και στη συνέχεια να το αποσυμπιέσετε. Το ποσοστό των πιθανών κροτίδες που μπορεί να επιβραδύνει δεν δικαιολογεί την προσπάθεια και τις επιδόσεις απώλεια.


Μια καλύτερη λύση θα ήταν να χρησιμοποιήσετε δυαδική υπογραφή ή τουλάχιστον μόνο ένα hash. Ένα απλό σύστημα επαλήθευσης hash είναι να λάβει μια κατακερματισμού των δυαδικών σας και ένα μυστικό αξίας (συνήθως ένα GUID). Μόνο EXE σας γνωρίζει το μυστικό αξία, έτσι ώστε όταν υπολογίζει εκ νέου το hash για τον έλεγχο αυτό μπορεί να το χρησιμοποιήσει και πάλι. Αυτό δεν είναι τέλεια (το μυστικό αξία μπορεί να ανακτηθεί). Η ιδανική κατάσταση θα ήταν να χρησιμοποιήσετε ένα πιστοποιητικό και μια υπογραφή.

 

Το τελικό μέγεθος του εκτελέσιμου στο δίσκο είναι σε μεγάλο βαθμό άσχετη αυτές τις μέρες. Το πρόγραμμά σας μπορεί να φορτώσει μερικά χιλιοστά του δευτερολέπτου πιο γρήγορα, αλλά από τη στιγμή που αρχίζει να υπολογίζεται η διαφορά είναι δυσδιάκριτες.


Μερικοί άνθρωποι μπορεί να είναι πιο καχύποπτοι εκτελέσιμο σας, μόνο και μόνο επειδή είναι συμπιεσμένα με το UPX. Ανάλογα με τους τελικούς χρήστες σας, αυτό μπορεί ή δεν μπορεί να είναι ένας σημαντικός παράγοντας.

 

Εάν μόνο το ενδιαφέρον σας είναι στη μείωση του μεγέθους των εκτελέσιμων αρχείων, τότε έχετε δοκιμάσει συγκρίνοντας το μέγεθος του εκτελέσιμου με και χωρίς τα πακέτα χρόνου εκτέλεσης; Σύμφωνοι, θα πρέπει να περιλαμβάνει επίσης τα μεγέθη των πακέτων συνολικά μαζί με το εκτελέσιμο σας, αλλά αν έχετε πολλές εκτελέσιμων αρχείων που χρησιμοποιούν τα ίδια βασικά πακέτα, στη συνέχεια, τις αποταμιεύσεις σας θα είναι αρκετά υψηλό.


Ένα άλλο πράγμα που πρέπει να δούμε θα είναι τα γραφικά / ιερογλυφικών που χρησιμοποιείτε στο πρόγραμμά σας. Μπορείτε να αποθηκεύσετε αρκετά ένα κομμάτι του χώρου με την ενοποίηση τους σε ένα ενιαίο Timagelist περιλαμβάνονται σε μια παγκόσμια μονάδα δεδομένων και όχι να τους επαναλαμβάνονται σε κάθε έντυπο. Πιστεύω ότι κάθε εικόνα αποθηκεύεται στην πηγή μορφή hex, έτσι ώστε θα σήμαινε ότι κάθε byte καταλαμβάνει δύο bytes ... μπορείτε να συρρικνωθεί αυτό το λίγο από τη φόρτωση της εικόνας από μια πηγή RCData χρησιμοποιώντας ένα TResourceStream.

 

Η τελευταία φορά που προσπάθησα να το χρησιμοποιήσετε σε ένα διαχειριζόμενο συγκρότημα, το munged είναι τόσο κακή που η runtime αρνήθηκε να το φορτώσει. Αυτός είναι ο μόνος χρόνος που μπορώ να σκεφτώ ότι δεν θα θέλετε να το χρησιμοποιήσετε (και, πραγματικά, έχουν περάσει τόσο πολύς καιρός από τότε που προσπάθησα ότι η κατάσταση μπορεί να είναι ακόμη καλύτερα τώρα). Έχω χρησιμοποιήσει εκτενώς στο παρελθόν σε όλους τους τύπους των διαχειριζόμενων εκτελέσιμα, και ποτέ δεν είχε πρόβλημα.

 

Δεν υπάρχουν μειονεκτήματα.


Αλλά ακριβώς FYI, υπάρχει μια πολύ κοινή παρερμηνεία σχετικά με UPX as--


πόροι δεν είναι μόνο να συμπιεστεί
----------------------------------


Ουσιαστικά χτίζετε ένα νέο εκτελέσιμο αρχείο που έχει ένα «φορτωτή» καθήκον και την «πραγματική» εκτελέσιμο, επίσης, είναι να ενότητα απογυμνωμένο και συμπιεσμένα, τοποθετείται ως πόρος δυαδικά δεδομένα του εκτελέσιμο φορτωτή (ανεξάρτητα από το είδος των πόρων που είχαν το αρχικό εκτελέσιμο).


Χρησιμοποιώντας μεθόδους αντίστροφης μηχανικής και [εργαλεία](http://www.exeinfo.xwp.pl/) είτε για εκπαιδευτικούς σκοπούς ή *άλλους* θα σας δείξει τις πληροφορίες σχετικά με το «εκτελέσιμο φορτωτή», και όχι μεταβλητές πληροφορίες σχετικά με το αρχικό εκτελέσιμο.


[![εκτελέσιμο ασυμπίεστο από UPX](https://i.stack.imgur.com/CptR8.jpg)](https://i.stack.imgur.com/CptR8.jpg)


[![εκτελέσιμο συμπιέζεται με UPX](https://i.stack.imgur.com/KbFO2.jpg)](https://i.stack.imgur.com/KbFO2.jpg)

 

Ο λόγος για UPX έχει τόσες πολλές ψευδείς συναγερμούς είναι επειδή ανοικτή αδειοδότησης του επιτρέπει κακόβουλο λογισμικό συγγραφείς να χρησιμοποιούν και να το τροποποιήσετε με ατιμωρησία. Φυσικά, το θέμα είναι σύμφυτη με τη βιομηχανία, αλλά δυστυχώς το μεγάλο έργο UPX μαστίζεται από αυτό το ζήτημα.


UPDATE: Σημειώστε ότι έχει ολοκληρωθεί το έργο ιχνηθέτης, η δυνατότητα χρήσης UPX (ή οτιδήποτε άλλο), χωρίς να προκαλούν ψευδώς θετικά θα ενισχυθεί, με την προϋπόθεση UPX υποστηρίζει.

 

σαρωτές ιών που αναζητούν «άγνωστο» ιοί μπορούν UPX σημαία συμπιεσμένα εκτελέσιμα ότι έχει έναν ιό. Μου έχουν πει αυτό οφείλεται στο γεγονός ότι πολλές ιοί χρησιμοποιούν UPX να κρυφτούν. Έχω χρησιμοποιήσει UPX για το λογισμικό και McAfee θα επισημάνει το αρχείο ως έχει έναν ιό.

 

IMHO ρουτίνα UPXing είναι άχρηστη, αλλά οι λόγοι γράφονται ανωτέρω, ως επί το πλείστον, η μνήμη είναι πιο ακριβά από δίσκο.


Erik: το απόκομμα LZMA θα μπορούσε να είναι μεγαλύτερο. Ακόμη και αν ο αλγόριθμος είναι καλύτερο, αυτό δεν είναι πάντα καθαρός συν.

 

Πιστεύω ότι υπάρχει μια πιθανότητα ότι δεν θα μπορούσε να λειτουργήσει σε υπολογιστές που έχουν [DEP](http://en.wikipedia.org/wiki/Data_Execution_Prevention) (Αποτροπή εκτέλεσης δεδομένων) ενεργοποιημένη.

 