Process Explorer zeigt manchmal eine EXE als "gepacktes Bild" an, aber was bedeutet das?
Was ich herausgefunden habe, ist: Kompilieren einer EXE (mit Visual C ++ 2010) mit /ZI
-Option führt zu einem gepackten Bild, aber /Zi
nicht. Warum solch ein Unterschied?
Übrigens: Eine mit /ZI
kompilierte DLL wird ebenfalls als "gepacktes Bild" betrachtet und als violett markiert.
Ein "gepacktes Bild" ist eines, in dem ausführbarer Code mit der Absicht komprimiert wird, die Datei kleiner zu machen. Die typische Reduzierung der Dateigröße liegt bei 50%. Es verwendet zur Laufzeit einen "Loader", um die Daten vor der Ausführung in ausführbaren Code zu dekomprimieren. Es war in den alten Tagen mit begrenzter Plattenspeicherkapazität und begrenzter Netzwerkbandbreite nützlich.
Heute ist es bei Terabyte-Festplatten und Megabit-Netzwerken ein Geruch, und das Packen kann auch dazu genutzt werden, bösartigen Code zu verstecken. Sicher der Grund, warum Process Explorer es anders abfärbt.
Die genaue Heuristik, die PE verwendet, um das Packen zu erkennen, ist nicht dokumentiert. Natürlich nicht, das würde es zu leicht machen, es zu umgehen. Es ist nicht trivial, es gibt keinen Standardweg, um das Packen zu implementieren. Grob betrachtet würde es sich die Abschnitte in der ausführbaren Datei ansehen und die Blaue Flagge auslösen, wenn zu viel davon wie nicht ausführbarer Code aussieht.
Und ja, wenn du / ZI benutzt, dann wird es eine Menge davon geben. Wichtiger ist die Option / INCREMENTAL des Linkers, die bei Verwendung von / ZI automatisch aktiviert wird. Mit dieser Option können Sie beim Debuggen Code schreiben, die Option Bearbeiten + Weiter. Verknüpfen Sie die ausführbare Datei schnell, ohne dass der Linker die Datei vollständig neu generieren muss. Dies kann nur funktionieren, wenn in der ausführbaren Datei viel Platz vorhanden ist, um neue Maschinencode-Bytes hinzuzufügen. Das ist eine Blaue Flagge.
Kein wirkliches Problem, aber Ihr Benutzer wird immer nur den Release-Build Ihres Programms sehen. Welches ist ohne / ZI und ohne / INCREMENTAL gebaut.
Aus dem Process-Hacker-Quellcode :
Ein Bild ist gepackt, wenn:
- Es verweist auf weniger als 3 Module und
- Es importiert weniger als 5 Funktionen und
- Das native Subsystem wird nicht verwendet.
Oder:
- Das Funktion-zu-Modul-Verhältnis ist kleiner als 3 (im Durchschnitt werden weniger als 3 Funktionen von jedem Modul importiert) und
- Es bezieht sich auf mehr als 2 Module, aber weniger als 6 Module.
Oder:
- Das Funktion-zu-Modul-Verhältnis ist kleiner als 2 (im Durchschnitt werden weniger als 2 Funktionen von jedem Modul importiert) und
- Es bezieht sich auf mehr als 5 Module, aber weniger als 31 Module.
Oder:
- Es hat keinen Abschnitt namens ".text".
Ein Bild wird nicht als gepackt betrachtet, wenn es nur einen Import hat ein Modul namens "mscoree.dll".
Sie können sich auch den Quellcode ansehen, um herauszufinden, ob ein Bild wahrscheinlich gepackt ist oder nicht.