Disassemblierung

Hin und wieder kommt es vor, dass einem noch so tollen Programm, das man gerade erworben hat, eben doch noch das i-Tüpfelchen fehlt. Was tun? Eine Methode ist das Patchen - hierzu nimmt man z.B. einen Debugger (unter CP/M z.B. (Z)SID) und ändert an entsprechender Stelle den Programmcode. Dies geht natürlich nur bei minimalen Änderungen. Oder man schreibt eine neue Routine, die dann an das bestehende Programm angehängt wird. Hierzu muss allerdings noch durch einen entsprechenden Patch dieser neue Teil aktiviert werden.
Ich habe dies mal bei dem JOYCE Terminalprogramm MAIL232 gemacht, um die Einstellungen der seriellen Schnittstelle übernehmen zu können.
Beide Möglichkeiten sind aber mit Vorsicht zu genießen, da man nie 100% weiß, was mit einem Patch wirklich angestellt wird.

Drastischer ist es da, einen Disassembler zu benutzen. Das bedeutet, man erzeugt aus dem (binären) Programm einen mit einem Editor lesbaren Quelltext. Nun kann man das Programm mit dem Editor beliebig verändern. Wird dieser Quelltext dann assembliert, so erhält man wieder ein lauffähiges Programm. Angeregt durch einen Hamburger JOYCEler habe ich versucht, mit DASM ein solches Projekt durchzuziehen. DASM hatte einige Einschränkungen, die die Speicherverwaltung betrafen. Da zu diesem Programm auch die Quellen vorhanden waren, ließ sich DASM aber entsprechend optimieren.
Neben DASM sind mir weitere Disassembler bekannt, die ich hin und wieder eingesetzt hatte.

Bekanntlich wird ja bei der Erstellung einer .COM Datei unter TURBO PASCAL die komplette Library (ca. 8kBytes groß) gelinkt. Unter MS-DOS 2.11 gab es ein kommerzielles Programm, das überflüssige Routinen aus einem fertigen Programm entfernte und somit das .COM File entsprechend verkürzte. Dies wollte ich auch für CP/M machen, jedoch lief es darauf hinaus, dass ich den kompletten Compiler disassemblierte und neue Funktionen und Prozeduren hinzufügte.

Ein ähnlich großer Aufwand der Disassemblierung von TURBO PASCAL war der Microsoft Assembler M80. Auch ihn habe ich mir vorgeknöpft und nach meinen Vorstellungen „verbessert".


Weit komplizierter als die Disassemblierung eines in Assembler geschriebenen Programms ist die De-Kompilierung1 eines in einer Hochsprache (z.B. FORTRAN, PASCAL, C) geschriebenen Programms. Im ersten Schritt muss ein Assembler-Quelltext mit einem Disassembler, im zweiten Schritt dann aus dem Assemblercode der Quelltext für die Hochsprache von Hand erstellt werden. Ich habe dies nur wenige Male versucht, undzwar an dem Spielen

Diese Programme waren ursprünglich für TURBO-PASCAL geschrieben worden. Da TURBO-PASCAL über eine statische Laufzeitbibliothek verfügt, ist die De-Kompilierung relativ „einfach".

Ein Hilfsmittel war dabei das Programm TPCTL, das eine Turbo PASCAL .COM Datei nach dem Aufruf zweier spezieller Laufzeitroutinen durchsuchte. Dies sind Routinen, denen direkt Daten folgen. (Diese Version von TPCTL findet die Turbo PASCAL-Versionen 1, 2, 3 und 3A - die erste Version war nur für Turbo PASCAL 3 .COM Dateien geeignet).
Beispiel - kompiliert mit Turbo PASCAL 3:
TURBO QuelleErzeugter Code
write('Test');
call 17BA
db   4
db   'Test'
Die zweite Routine ist bei Adresse 054d zu finden.

(Ein weiteres Hilfsprogramm ist OVLEXT.MAC. Mit diesem Programm lassen sich einzelne Module aus einer Overlay-Datei in .COM-Dateien schreiben.)
Zurück zu den JOYCE-Aktivitäten

1. Es gibt keinen generellen De-Kompiler, der aus einem beliebigen binären Programm einen Quelltext in einer Hochsprache erstellt. Zum einen gibt es unterschiedliche Hochsprachen und zum anderen variiert der binäre Code auch bei verschiedenen Compilern gleicher Sprache. Hier einige Beispiele von binären Code für gleiche Quellen.

Letzte Änderung: 19.November 2014