Unpacker
Unpacker oder Stripper bezeichnen Programme, die einen bestimmten Programmschutz (engl. Protection) automatisiert entfernen.
Inhaltsverzeichnis |
Der Programmschutz (Protector)
Der Programmschutz versucht als kommerzielle oder freie Software unbefugte Personen vom Decompilieren bzw. Disassemblieren abzuhalten, sowie eine Manipulation der zu schützenden Anwendung zu unterbinden. Dazu gibt es unterschiedliche Ansätze. Allen gemein ist das Hinzufügen vom zusätzlichen Code, der für die Verschlüsselung und Entschlüsselung des Hauptprogramms sorgt, sowie (optional) den Start von Debuggern und Disassemblern unterbindet.
Beispiele für freie Protectoren:
- yoda's Crypter
- tElock
- PESpin
- UPX (mit diversen Zusätzen wie Upolyx, UPX-Scrambler, UPX-Lock)
Beispiele für kommerzielle Protectoren:
- Armadillo
- ASProtect
- ExeShield
- ExeCrypter
Die Programmierer der Protectoren setzen inzwischen verstärkt auf Verschlüsselung der Codebereiche und Virtualisierung bzw. Veränderung des Ursprungscodes, sodass ein einfaches Abbild des Speichers zur Ausführungszeit des Programms nicht ausreicht. Auch werden die für das Starten eines Programms benötigten Informationen gesondert geschützt. Oft übernimmt der Protector selbst das Laden und die Initialisierung der nötigen Programmbereiche (was normalerweise vom Betriebssystem erledigt wird). Besonders kritischer, oft ausgeführter Code wird dadurch jedoch um Faktoren langsamer abgearbeitet, wodurch das geschützte Programm wesentlich mehr Rechenleistung benötigt (Beispiele: Armadillo, ExeCrypter).
Oftmals ist der Schutz erst dann wirklich wirksam, wenn der Programmierer die Protection-Software bereits in den Quelltext seiner Anwendung integriert. Dazu werden den Protectoren Bibliotheken zum Einbinden für verbreitete Programmiersprachen und Compiler beigelegt.
Funktionsweise eines Unpackers
Die Funktionsweise eines Unpackers lässt sich grob in folgende Schritte unterteilen:
- Codebreich wiederherstellen: Es werden Verschlüsselungen oder Virtualisierungen der Protectorsoftware entfernt.
- Programm wiederherstellen: Die zum Starten des Programms vom Betriebssystem benötigte Zusatzinformationen werden von Protectoren oft versteckt bzw. in ein eigenes Format überführt, um den Start (genauer den Initialisierungsschritt) selbst vorzunehmen. Dies muss rückgängig gemacht werden.
Um diese Ziele zu erreichen werden mehrere Vorgehensweisen genutzt. Im Wesentlichen wird dabei der Programmfluss durch den Unpacker kontrolliert, um an bestimmten Punkten einzugreifen, bestimmte Änderungen vorzunehmen oder Informationen herauszulesen.
Entgegen der Werbeversprechungen der Softwarefirmen existieren für viele der verbreiteten Programmschutzprodukten geeignete Unpacker. Sie nutzen normalerweise vorhanden Schwächen aus. Dazu wird der Schutzmechanismus per Reverse_Engineering so gut wie es geht analysiert und nach Schwachstellen durchsucht (beispielsweise wenn der Programmcode zur Ausführungszeit entschlüsselt vorliegt, etc.).
Die Herausforderung bei der Entwicklung eines Unpackers
Zum Cracken von Software benötigen (Software-) Cracker keinen Upacker. Unpacker werden nicht zuletzt geschrieben, um zu zeigen, dass dieser Arbeitsschritt auch vollautomatisch funktioniert. Das Schreiben von Unpackern entwickelte sich zur eigentlichen Herausforderung für Cracker, da der Schutzmechanismus von ihm wirklich verstanden und eine allgemeine, programmiertechnisch umsetzbare Gegenlösung entwickelt werden muss. Einen Schutz per Hand zu entfernen, ist dagegen in der Regel um Faktoren einfacher, da ein Mensch besser auf unerwartete Ereignisse reagieren kann als ein Programm.
|