Shell4UPX

Eine Shell für UPX
Eine Oberfläche für den EXE-Packer UPX

Opensource zum Lernen und Diskutieren.

Ich bin überzeugt, das dieses Projekt nicht fertig sein kann. Anderseits ist
UPX eines der wirklich innovativsten Tools der jüngsten Vergangenheit.

Für den Download von Shell4UPX biete ich folgende Möglichkeiten:

Komprimierte Shell4UPX.exe für NON-Delphi Programmierer: Shell4UPX_exe05.zip
Sourcode der Shell4UPX für Delphi 3 mit RXVcl 2.75     : Shell4UPX_Src05.zip
Sourcode der Shell4UPX für Delphi 3 ohne RXVcl         : Shell4UPX_Src051.zip

Wichtige Informationen über UPX und diese Shell

Bei jeder neue Version eines Betriebssystems oder einer Anwendung erwartet der Programmierer vom Enduser, das ausgerechnet sein Programm oder sein System auf seine schon übervolle Festplatte gequetscht wird. Wenn es sich dabei noch um echte Testversionen handelt, befindet sich darin auch noch alle Einträge des Debuggers. Wer da als Programmierer noch ein klein wenig Schamgefühl  hat, macht sich da schon seine Gedanken. Zumindest ging es mir so.

Ernsthafte Gedanken machten sich dabei schon viele Programmierer. Ich erinnere mich an eine Diskussion bei www.UNDU.com im Mai 1995, als der Herausgeber dieser alternativen und hochinteressanten Newsletter Robert Vivrette in seinem Beitrag " EXE Size In A Delphi Application "seiner Unzufriedenheit Ausdruck gab. Er kam dann aber zum Schluß, das demjenigen, welchem die Oberfläche von mit Delphi programmierten Anwendungen gefällt, diese Programmgröße einfach auch in Kauf nehmen muß.

Seit diesem Artikel sind mehr als zehn Jahre vergangen. Die Diskussionen sind nicht verstummt. Eine echte und dauerhafte Lösung hat bisher kaum einer geboten. Wenn es eine solche gab, dann wurde von uns sehr viel Geld verlangt. Damit gelangten Hobby- und Freizeitprogrammierer immer mehr ins Hintertreffen. Ihr Geldbeutel reichte meist nur für ein Delphi Standard bzw. Personal. Dazu kommt noch die in den letzten Jahren von Borland eingeführte Lizenspolitik, welche sich von TP 3.0 -  Zeiten grundsätzlich unterscheidet. Aber viele gute Gedanken kommen gerade aus dieser Ecke. Das wurde auf der Chefetage von Borland zeitweilig viele Jahre ganz und gar vergessen. Da muß man sich dann bei Borland auch die Ignoranz der Anwender ihrer Produkte gefallen lassen. Eine der auffälligsten Lösungen ist am Ende des Jahres 2002 die JediVcl mit mehr als 400 Komponente und Experten. Sie ist kein Ersatz, aber eine echte und umfassende Alternative zur Borland-VCL.

Wenn nun aber die  Hobby- und Freizeitprogrammierer alle Möglichkeiten der Jedi-VCL nutzen, ist die neue Programmgeneration zwar äußerst komfortabel und besitzt einen effektiven Programmcode, aber die Größe der Programme wächst auch ins Unermeßliche. Eine Lößung bietet uns Borland selbst mit der Generierung und Nutzung von Laufzeit-Bibliotheken an. Wer jetzt aber auf seine Festplatte sieht stellt fest, im Verzeichnis Windows\System32 befinden sich schon jede Menge davon und nun mal ehrlich, wie viele von denen  habt Ihr dort selbst hinein geschoben. Kein Reinigungstool beschäftigt sich mit diesen Bibliotheken. Jetzt kommt da noch die Jedi-VCL. Das sind schon einige MByte pro Version und ich kann schon heute sechs Versionen zählen. Das sind sechs verschiedene BPL's. Die Aussage: "Das machen doch alle so !" muß verworfen werden. Auch Programmierer sollten ein wenig Ehre und Schamgefühl besitzen.

Keiner von uns muß sich schämen, denn es gibt eine echte Lösung! Nur wer auf sie  verzichtet, wird zukünftig seine Programme nur noch für sich selbst schreiben dürfen. Jetzt gibt es UPX von Markus F. X. J. Oberhumer und Laszlo Molnar. Dieser Packer für eXecutable Dateien ist ein echter Hammer und wird bei http://UPX.SourceForge.Net von den beiden Autoren als OpenSource angeboten. Sieht man sich jedoch in der Szene um, stellt man fest, daß die meisten Programmierer doch noch etwas sehr zurückhaltend sind. Es könnten ja Daten verloren gehen und überhaupt, wie soll so etwas funktionieren.

Die Älteren von Euch kennen aber noch LZEXE & Co. für DOS. Der Packer LZEXE war so gut, daß sogar Symantec seine "Norton Utilitys für DOS" damit packte. Das Prinzip von UPX ist offensichtlich dem von LZEXE sehr ähnlich, aber jetzt eben mit Sourcecode für alle möglichen Systeme und Prozessoren. Viele jüngere Programmierer können mit einem Konsoleprogramm kaum umgehen. Allein schon GREP.COM ist ein Horrorprogramm. Sie meinen, in ein schwarzes Loch im Universum zu blicken.  Diese Lücke wird nun zukünftig Shell4UPX schliesen.

Was UPX kann, ist auf der Ausgabe eines Memo zu erkennen. Erwähnenswert ist, ein Ratio von 36 % ist typisch für optimierte Delphiprogramme. VisualC++-Programme und DLL's schaffen es, je nach verwendeten Compiler, immerhin noch auf 40 bis 50%. Nun versucht das mal mit Zip oder Rar. Es geht einfach nicht. Dabei sind EXE und DLL in diesem Zustand noch lauffähig. Völlig problemlos kann mit der Shell auch dekomprimert werden. Die Ausgabe auf dem Memo wird nicht ein einziges Byte Verlußt anzeigen. Ebenso kann in der jetzt veröffentlichten Version von Shell4UPX das komprimierte Programm oder die zu ihm gehörende DLL getestet werden.

Achtung: Werden Testversionen mit allen möglichen Debugger-Infos komprimiert, ist sogar ein Ratio von fast 25% möglich. Allerdings kommt es bei Kompression oder Dekompression zum Verlußt einiger Byte. Welchen Einfluß dies auf unsere Programme hat, ist mir bisher verschlossen geblieben.

Vorsicht, in dieser Kombination können auch Virensignaturen in den komprimierten Dateien festgestellt werden. (Siehe auch weiter unten im FAQ "Virenalarm bei Shell4UPX.EXE")

Der Sourcecode von  Shell4UPX wurde in letzter Zeit mehrfach überarbeitet und ergänzt. Dies geschah unter aktiver Hilfe einiger User von http://www.delphi-forum.de. Namentlich hat sich besonders Mathias Symmack hervorgehoben. In den Credits der Finalversion wird er einen würdigen Platz erhalten.

Besonderer Wert wurde darauf gelegt, daß der Quelltext von möglichst vielen Usern in die IDE geladen werden kann. Dies als Reverenz der jungen User, die zum letzten  Weihnachtsfest ein Delphi 3 Professional von Pearl oder anderen Anbietern erhalten haben.  Alternativ wird die Source mit RXVcl 2.75 oder nur mit Borland VCL angeboten.

Der Quelltext ist, so glaube ich zumindest, gut auskommentiert. Der junge Programmierer findet an jeder Stelle eine Beschreibung darüber, was das Programm an dieser Programmzeile tut oder tun sollte. Wie schon in der Version 0.1 ist Programmierern, die  nicht dem Delphi hold sind, eine EXE zum Download bereitgestellt.

Selbstverständlich gehört UPX nicht zum Lieferumfang. Es wäre unfair, wenn ich UPX hier an dieser Stelle anbieten würde. Abgesehen davon, http://UPX.SourceForge.Net sollte von jedem ernsthaften UPX-Anwender besucht werden. Dort gibt es nicht nur UPX und seinen Sourcecode. Auch LZOP und weitere Versuche zu einer Shell erhaltet Ihr dort. LZOP ist ein hervorragender Packer für die Kommandozeile, der über weite Strecken die gleiche Source wie UPX verwendet. Rein sachlich gesehen ist LZOP zum jetzigen Zeitpunkt überflüssig, denn das Integrationsvermögen und Handling von ZIP würde nur mit riesigen Anstrengungen erreicht werden. Zip ist der gegenwärtige Standart und wird es auch noch einige Jahre bleiben. Nach neuesten Erkenntnissen wird wohl das Format Zip vom Format 7z abgelöst. Werden unsere Programme mit UPX komprimert, ist ZipSfx, InnoSetup und andere nur noch die komfortable Verpackung.
 

Nach oben

FAQ für Shell4UPX

Warum eine Shell für UPX ?

UPX ist ein Tool für die Kommandozeile. Die Parameter haben die gleiche Bedeutung wie eine große Optionsseite in einem Programm mit Bedienoberfläche und besitzen die Funktion von Radiobuttons und Checkboxen. Eine Shell ist die programmtechnische Umsetzung der Kommandozeile in eine grafische Ansicht. Um optimale Ergebnisse zu erziehlen und wenn Ihr auf die Besonderheiten einer EXE, DLL oder Treiber eingehen wollt, ist eine sehr umfangreiche Parameterangabe notwendig. Zum Beispiel können EXE-Dateien bevorzugt auf ein älteres System (100 Mhz) abgestimmt werden. Oder es ist gar noch ein DOS-Programm oder nur für einen XP mit mehr als 256 MB Speicher  bestimmt. Hier kannst Du zB. mit -1 bis --best variieren.
Anderseits ist es auch möglich auf die Besonderheiten deines eigenen Computers einzugehen. Nicht jeder hat eben 256 MByte und mehr Speicher zur Verfügung. Hier zählt dann jedes Byte und die erforderlichen Parameter müssen gesetzt werden. Abgesehen davon sind die unterschiedlichen Parameter selbstverständlich viel schneller gesetzt, als auf der Kommandozeile.

Welche Gefahren gehen von UPX aus ?

Bei sachgemäßer Anwendung überhaupt keine.

Zur näheren Erläuterung ein Beispiel: Viele von Euch werden noch OS/2 Warp - selig kennen. Dort gab es ein ähnliches Freeware-Tool. Es wurde am besten gleich von der Konsole im Root gestartet und stieg mit den entsprechenden Parameter in alle Unterverzeichnisse hinab. Komprimiert wurde alles was ging. Das Ergebnis war der wesentlich geringerer Platzbedarf von ca. 50% des BS und  aller anderen Programme.

Das Schönste daran war: Weder OS/2 selbst noch ein anderes Tool oder Programm klagte in irgend einer Form darüber. Sogar das Kernel von OS/2 schrumpfte anstandslos um 20%. Versucht man dies mit UPX im Verzeichnis Windows\System32 von Windows 2000 oder XP, kann im Anschluß nur noch die gesamte Partition neu formatiert werden. Hier ist die Stelle an der ich sage: UPX ist außerordentlich wertvoll, aber es gehört, obwohl es OpenSource ist, nur in  Programmiererhände. Letztlich wurde der Sicherheitsstandard von Windows von den meisten Anwendern weltweit gefordert. Das System läßt sich auf diese Art und Weise kaum mehr unterwandern.

Schnell ist nach falscher Anwendung eine Schuld zugewiesen und Programmierer muß sich dann zur Wehr setzen. Dies ist auch der Grund, warum mit Shell4UPX nur immer eine Datei komprimiert werden kann, obwohl eine Erweiterung mit Wildcards grundsätzlich möglich wär

Wie erlernt man den Umgang mit UPX und seiner Shell

Eigentlich sehr schnell. Aufgrund der übersichtlichen Anordnung und Bezeichnung der Checkboxen und Radiobuttons wird es für Programmierer kaum Probleme geben. Zusätzlich werden kleine helfende Texte in der Statusbar angezeigt. Einstellungen, deren Namen unbekannt erscheinen, sollten immer ihre Default-Einstellung behalten. Wer tiefer in die Materie eindringen will, sollte sich unbedingt mit den Originaldokumenten  vertraut machen. Solche speziellen Einstellungen sind aber Programmierern mit anderen Compilern z.B. Watcom, C++, gcc, VB ua. eher bekannt.
In der Shell werden die übergebenen Parameter und das Ergebnis der Kompression auf einer Memokomponente angezeigt. Dort kann man sich vom Erfolg oder Mißerfolg seiner Bemühungen überzeugen und es unter Umständen auch mal mit anderen Parametern versuchen. Wer nach der Kompression sein Programm testen möchte, kann dies unmittelbar aus der Shell heraus  tun. Auch DLL's lassen sich testen, es muß nur die dazu gehörende EXE aufgerufen werden.

Shell4UPX ist abgestürzt, trotzdem wurde fertig komprimiert.

Bei dieser Aussage handelt es sich um ein bekanntes und uraltes Problem von Windows. Wird ein Programm mit einer API-Funktionen aufgerufen, übernimt Windows die Kontrolle bis der Programmlauf des aufgerufenen Programmes beendet ist. Erst dann  übergibt Windows wieder an das aufrufende Programm. Wurde jetzt das aufrufende Programm, aus welchem Grund auch immer, vorzeitig beendet, läßt Windows das aufgerufene Programm weiter arbeiten !!! Dieser Umstand ist sehr leicht von jedem User nachvollziehbar und trifft ebenso zu, wenn das aufgerufene Programm im Hintergrund (WM_HIDE) arbeitet. Erschwerend kommt hinzu, das Windows selbst bei Abbruch keine Fehlermeldung abgibt

Eigentlich ist überhaupt nichts abgestürzt. Die betroffenen  User haben, so vermute ich, eine sehr große Exe mit dem Level --best komprimieren wollen. Wer dazu noch einen älteren Computer mit einer geringen Taktfrequenz und relativ wenig Speicher benutzt, kann wirklich erst einmal zum Kaffeeautomaten gehen. C-Programmierer haben damit keine Probleme und können sich sehr schnell damit abfinden. Anders bei Delphi, diesen Codern ist so etwas unbekannt. Dies ist auch der Grund, warum in der Shell4UPX nun zu jeder durchgeführten Opertion die annähernd  verbrauchte Zeit angezeigt wird.

Leider läßt sich mit geringen Aufwand kein Echtzeit-Capture auf den Desktop bringen. Damit wäre das Problem aus der Welt. UPX hat eine Progress-Ausgabe, mit der so etwas leicht zu kontrollieren wäre. Wir können nur hoffen, das spätere Versionen von UPX eine abfragbare Schnittstelle besitzen, so wie das bei DOS-Packern ( z.B. ARJ) üblich war.

Damit der User feststellen kann, ob die Shell abgestürzt ist oder nicht, wurde in der Statusbar eine  einfache Uhr mit Sekundenanzeige implementiert. Läuft diese, ist alles gut. Läuft sie nicht, dann ist Downtime.

11. Februar 2003

Virenalarm bei Shell4UPX.EXE

Bei einer vor einigen Wochen zum Download angebotenen Shell4UPX.EXE Version 0.3 wurde mit den neuesten Virenscannern eine Virensignatur festgestellt. Diese Datei wurde zu Testzwecken mit allen unter Delphi 6.2 verfügbaren  Debuggerinformationen compilert. Erst nachdem diese EXE von mehr als 3,2 MByte mit UPX komprimiert war, konnte diese Signatur erkannt werden. Offensichtlich handelt es sich hierbei um die Kombination Debugger und UPX, die so etwas entstehen läßt. Ein weiterer Schaden an anderen Dateien wurde nicht festgestellt. Auch der Virus selbst wurde trotz intensiver Suche von der Reparaturkonsole aus, nicht nachgewiesen.

Dies ist eine Lehre, Debuggerinfos und UPX müssen sich nicht unbedingt vertragen.

Nach oben               Zurück zu Programmdownload