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.
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
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).
TURBO Quelle | Erzeugter Code |
---|---|
write('Test'); |
call 17BA db 4 db 'Test' |
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. |