Ultimate Packer for eXecutables?
mad/os

Kompressionsformate wie zum Beispiel ACE, ARJ, RAR oder natürlich ZIP kennt jeder. Die Vorteile dieser Formate müssen nicht erklärt werden: Beliebige Dateien werden auf ein Minimum ihrer ursprünglichen Größe reduziert, so dass Speicherplatz und Bandbreiten effektivst genutzt werden können. Außerdem ist es möglich, mehrere Dateien in einem komprimierten Archiv zusammenzufassen.

Einen völlig anderen Ansatz verfolgen die sogenannten "Executable Packer", von denen LZEXE und PKLite zumindest unter DOS die bekanntesten waren. Auch sie verfolgen das Ziel, Speicherplatz einzusparen. Allerdings erzeugen sie keine Archivdateien, die nur mit dem richtigen Programm wieder entpackt werden können. Ein "Executable Packer" komprimiert, wie der Name schon sagt, ausführbare Programmdateien. Diese bleiben - ganz im Gegensatz zu normalen Kompressionsformaten - ausführbar und funktional völlig unverändert. Ein Entpackprogramm wird nicht benötigt. Die komprimierte Programmdatei ist abgesehen von ihrer Größe mit dem Original völlig identisch. Wird sie gestartet, so dekomprimiert sie sich selbst und führt ihren Programmcode aus. Und da dieser Vorgang nur Sekundenbruchteile benötigt, geschieht das Ganze für den Anwender völlig transparent.

Eines der modernsten Werkzeuge dieser Gattung nennt sich "The Ultimate Packer for eXecutables" oder kurz "UPX" (http://upx.tsx.org). Die Autoren Markus Oberhumer (Universität Linz, Östereich) und Laszlo Molnar (Ungarn) arbeiten seit 1998 an dem Programm, und erst vor einigen Monaten veröffentlichten sie eine erste offizielle Version 1.0, die nicht mehr mit dem Zusatz "Beta" ausgestattet ist. Diese Version akzeptiert neben nahezu allen DOS- und Windows-Programmen auch Windows' DLL-Dateien und sogar Atari- und Linux-Programme. Besonders erfreulich ist dabei die Tatsache, dass UPX nach den Regeln der "GNU General Public License" (GPL) veröffentlicht wurde. Das Programm ist damit sowohl für private als auch kommerzielle Zwecke frei und kostenlos verwendbar. Ideale Voraussetzungen für uns und ein guter Grund, UPX näher zu untersuchen.

Ich stellte eine kleine Auswahl verschiedenster Programmdateien aus der DOS- und Windows-Welt zusammen (Dateiendungen .com, .exe und .dll). Der erste Vergleichstest mit dem inzwischen stark veralteten PKLite verlief erwartungsgemäß eindeutig: PKLite, das naturgemäß nur DOS kennt, komprimierte die Testdateien auf 50% der Ausgangsgröße. UPX konnte die selben Dateien bereits auf nur noch 40% schrumpfen.

Als nächstes interessierte mich, wie gut der Kompressionsalgorithmus von UPX im Vergleich zum allgemeinen Standard ZIP arbeitet. Wenn nämlich ein Programm ohnehin als ZIP-komprimierte Datei vertrieben werden soll, dann stellt sich die berechtigte Frage, ob eine zusätzliche zweite Kompression mit einem "Executable Packer" überhaupt sinnvoll ist. Es kann im Gegenteil sogar geschehen, dass der EXE-Packer ineffizient arbeitet und die am Ende entstehende ZIP-Datei größer ist als vorher. In diesem Fall wäre zwar das fertig installierte Programm kleiner, aber der Download des ZIP-Archives aus dem Internet würde länger dauern. Und angesichts heutiger Festplattengrößen würde man dann wahrscheinlich auf UPX verzichten.

Doch UPX übertrifft auch hier alle Erwartungen. ZIP allein verkleinert die Testdateien auf mäßige 46%, UPX schafft bereits 41%, und beide Methoden gemeinsam erreichen eine Verkleinerung auf 39%.

Die Erklärungen dafür sind einleuchtend.

ZIP ist ein universelles Format, das alle Dateiarten behandeln muss, so dass Spezialisierungen kaum möglich sind. Zudem ist der ZIP-Algorithmus etliche Jahre alt und aus heutiger Sicht nicht mehr wirklich effektiv.

UPX ist modern und vor allem speziell für Programmdateien entwickelt worden. Programmcode weist oft ähnliche Strukturen auf und so ist es möglich, einen dafür angepassten Kompressions-Algorithmus zu benutzen.

Trotzdem muss eine mit UPX komprimierte Datei ausführbar bleiben, was bedeutet, dass ein gewisser Teil des Programmkopfes, Icons und ähnliches nicht komprimiert werden dürfen. Dies ist der Grund, warum gerade bei Windows-Anwendungen noch ein guter Prozentsatz aus den bereits UPX-komprimierten Dateien herausgequetscht werden kann. Bei DOS-Programmen ist dieser "Overhead" weitaus kleiner, so dass externe Packprogramme nur in seltenen Fällen noch ein paar Bytes einsparen können.

Die Nachteile von UPX sollen nicht verschwiegen werden. Viren sind es, die die wohl größte Gefahr im Umgang mit Programmdateien darstellen. Besonders gefährlich wird das, wenn ein Programm bereits vor der Komprimierung infiziert wurde, weil viele Antivirus-Programme diese Kompression nicht nachvollziehen können. Aus den selben Gründen vertrauen viele User solchermaßen komprimierten Dateien nicht.

Doch dies sollte niemanden davon abhalten, UPX zu verwenden, schließlich hat man jederzeit die Möglichkeit, die Kompression wieder rückgängig zu machen. Es gehört zu den erklärten Grundsätzen der UPX-Programmierer, keine Verschlüsselung zu erlauben. Ihr Argument, dass ohnehin jeder halbherzige Versuch, einen Dekomprimier-Schutz einzubauen, in kürzester Zeit gehackt würde, ist angesichts der unzähligen Werkzeuge, die genau das tun, leicht nachvollziehbar.

Ein völlig anderer Nachteil von UPX ist wohl nur für die 4k-Programmierer unter den Lesern interessant: Bei besonders kleinen Dateien ist UPX nicht mehr sonderlich effektiv. Andere Executable Packer wie zum Beispiel aPack (http://apack.cjb.net) bringen dort teilweise wesentlich mehr.

mad/os