Home

Zurück zur Assemblerauswahlseite

Der Debugger DEBUG

8086 Assembler (MS-DOS):
Beispiel zum Disassembler ASMGEN

Diese Seite behandelt den Disassembler ASMGEN3. Es handelt sich um ein Programm zum Disassemblieren: Aus ausführbaren MS-DOS-Assemblerprogrammen (COM und EXE) wird ein Assemblerquellprogramm erstellt. Man kann es im Internet herabladen, indem man nach „ASMGEN3 download” sucht. Das herabgeladene ZIP-Archiv beinhaltet eine Bedienungsanleitung für das Programm in englischer Sprache. Die Bedienungsanleitung beschreibt auch den Aufbau der weiter unten auf dieser Seite erwähnte SEQ-Steuerungsdatei. Es fehlt darin lediglich der auf dieser Seite gemachte Hinweis auf das Dateiende mit 1AH (Steuerung Z).

Weiterhin beinhaltet das ZIP-Archiv unter dem Namen ASMGEN3.ASM den Quellcode des Disassemblerprogramms. Es entstand durch Rückassemblierung und manuelle Überarbeitung.

Disassemblieren - darf man das überhaupt ?

Man darf es dann, wenn der Urheberrechtsinhaber damit einverstanden ist.

Es gibt Umstände, unter denen man es darf, obwohl der Urheberrechtsinhaber damit nicht einverstanden ist. Diese Umstände sind im Gesetz über das Urheberrecht und verwandte Schutzrechte in §65e und §69g Absatz 2 genannt.

COM-Progamme lassen sich aufgrund ihrer einfachen Struktur wesentlich leichter disassemblieren als EXE-Prpogramme. Der Disassembler ASMGEN3 ist grundsätzlich auch zur Disassemblierung von EXE-Propgrammen geeignet. Es ist jedoch ein mühsames Geschäft, denn die manuelle Nacharbeit ist ungleich größer als bei der Disassemblierung von COM-Programmen.

Als Versuchsobjekt dient hier das ausführbare Programm JN.COM. Es entstand aus JN.ASM:

.MODEL TINY
;=====================================
; Eingabe Ja oder Nein nach Hinweisanzeige
;======================================
;
.CODE
               ORG         100h

_start: mov     dx,offset hinweis
        mov     ah,9     ;Hinweis anzeigen
        int     21h
        mov     ah,08h   ;lese 1 Zeichen von Tastatur
        int     21h
        or      al,20h   ;Eingabe wird Kleinschrift
        cmp     al,'j'
        mov     al,0     ;Return-Code auf 0
        je      fertig
        inc     al       ;Return-code auf 1 falls nicht "j"
fertig: mov     ah,4ch   ;Programm beenden
        int     21h

hinweis db      "Bitte genen Sie j oder j fuer Ja und N oder N fuer Nein ein: $"

END     _start

1. Disassemblierung ohne SEQ-Steuerungsdatei

Vor der Disassemblierung hat es sich bewährt, das ausführbare Programm umzubenennen oder in eine Datei mit anderem Namen zu kopieren. Der Disassembler erzeugt eine neue Quelldatei; deren Namen wird aus dem Namen des ausführbaren Programms abgeleitet.

Hier hat das ausführbare Programm den neuen Namen JNDEMO.COM erhalten. Die erste Disassemblierung wird gestartet mit (gelb hinterlegter Text kennzeichnet Eingaben):

D:\DOS\ML\TEST>asmgen3 jndemo.com,,;
File JNDEMO.SEQ not found
Building Reference Table

Writing D:JNDEMO.ASM
Bytes in output file: 0A6DH

Writing D:JNDEMO.TBL
Bytes in output file: 0218H

0:14:56:54 D:\DOS\ML\TEST>dir jndemo.*

 Volume in drive D is HP_D           Serial number is 402E:2809
 Directory of  d:\dos\ml\test\jndemo.*

jndemo.asm        3072   7.03.11  14:56
jndemo.com          87   7.03.11  14:49
jndemo.tbl        1024   7.03.11  14:56

Das disassemblierte Programm JNDEMO.ASM wird z.B. durch den NOTEPAD-Editor etwas länger dargestellt als hier nachfolgend gezeigt. ASMGEN3 kennzeichnet das Ende des Quellprogramms mit dem Byte 1AH (Steuerung Z). NOTEPAD kennt diese veraltete Art der Endmarkierung nicht mehr. Glücklicherweise stört sich der Makroassembler ML nicht daran. Unglücklicherweise bemängelt ML all die Zeilen hinter dem Label L0119 mit den doppelten Fragezeichen. Hier müsste man mit einem Editor nachhelfen.

Die Datumsangaben „3-7-111” für den 7.März 111 deutet an, dass ASMGEN3 aus der Zeit vor dem Jahre 2000 stammt. ASMGEN wurde 1985 geschrieben. Die letzte veröffentlichte Überarbeitung ASMGEN3 erfolgte 1995.

Die als Kommentar ausgegebene Information über den anfänglichen Stackpointer auf FFFF dürfte falsch sein. Bei COM-Programmen unter MS-DOS steht der Stackpointer zu Programmbeginn auf FFFE.

PAGE        58,132
TITLE       JNDEMO        3-7-111        [3-7-111]

.RADIX        16
LF  EQU   0AH
CR  EQU   0DH
;
;INITIAL VALUES :  CS:IP  0000:0100
;                  SS:SP  0000:FFFF
       ;L0000S          L010F DI  L0156 DI
S0000  SEGMENT
       ASSUME DS:S0000, SS:S0000 ,CS:S0000 ,ES:S0000
       ORG        $+0100H
L0000  EQU        $-100
       ;L0008     L0107 DI
L0008  EQU        $-0F8
       ;L0009     L0103 DI
L0009  EQU        $-0F7
       ;L0020     L010B DI  L0128 DI  L013D DI
L0020  EQU        $-0E0
       ;L0021     L0105 CC  L0109 CC  L0117 CC
L0021  EQU        $-0DF
       ;L004C     L0115 DI
L004C  EQU        $-0B4
       ;L0061     L0138 DI
L0061  EQU        $-9F
       ;L0064     L012C DI  L013C DI  L0141 DI
L0064  EQU        $-9C
       ;L0065     L011D DI  L011E DI  L0122 DI  L0127 DI  L012D DI  L0134 DI
       ;          L0142 DI  L0149 DI  L014D DI
L0065  EQU        $-9BH
       ;L0069     L011A DI  L0124 DI  L014E DI  L0150 DI
L0069  EQU        $-97
       ;L006A     L010D DI  L0130 DI
L006A  EQU        $-96
       ;L006E     L0121 DI  L0123 DI  L0139 DI  L014F DI  L0153 DI
L006E  EQU        $-92
       ;L006F     L012B DI  L0140 DI
L006F  EQU        $-91
       ;L0075     L01
       ;L0100     L0156 CI
L0100: MOV        DX,OFFSET L0119     ;0100 BA 19 01
       MOV        AH,9                ;0103 B4 09
       INT        21                  ;0105 CD 21
       MOV        AH,8                ;0107 B4 08
       INT        21                  ;0109 CD 21
       OR         AL,20        ;' '   ;010B 0C 20
       CMP        AL,6A        ;'j'   ;010D 3C 6A
       MOV        AL,0                ;010F B0 00
       JZ         L0115               ;0111 74 02
       INC        AL                  ;0113 FE C0
       ;L0115     L0111 CJ
L0115: MOV        AH,4C        ;'L'   ;0115 B4 4C
       INT        21                  ;0117 CD 21
       ;L0119     L0100 DI
L0119:  INC       DX                  ;0119 42
        DB        69        ??        ;011A 69
       JZ         L0191               ;011B 74 74
       DB         65        ??        ;011D 65
       AND        [BX+65],AH          ;011E 20 67 65
       DB         6E        ??        ;0121 6E
       DB         65        ??        ;0122 65
       DB         6E        ??        ;0123 6E
       AND        [BP+DI+69],DL       ;0124 20 53 69
       DB         65        ??        ;0127 65
       AND        [BP+SI+20],CH       ;0128 20 6A 20
       DB         6F        ??        ;012B 6F
       DB         64        ??        ;012C 64
       DB         65        ??        ;012D 65
       JB         L0150               ;012E 72 20
       DB         6A        ??        ;0130 6A
       AND        [BP+75],AH          ;0131 20 66 75
       DB         65        ??        ;0134 65
       JB         L0157               ;0135 72 20
       DEC        DX                  ;0137 4A
       DB         61        ??        ;0138 61
       AND        [DI+6E],DH          ;0139 20 75 6E
       DB         64        ??        ;013C 64
       AND        [BP+20],CL          ;013D 20 4E 20
       DB         6F        ??        ;0140 6F
       DB         64        ??        ;0141 64
       DB         65        ??        ;0142 65
       JB         L0165               ;0143 72 20
       DB         6E        ??        ;0145 6E
       AND        [BP+75],AH          ;0146 20 66 75
       DB         65        ??        ;0149 65
       JB         L016C               ;014A 72 20
       DEC        SI                  ;014C 4E
       DB         65        ??        ;014D 65
       DB         69        ??        ;014E 69
       DB         6E        ??        ;014F 6E
       ;L0150     L012E CJ
L0150: AND        [DI+69],AH          ;0150 20 65 69
       DB         6E        ??        ;0153 6E
       CMP        AH,[BX+SI]          ;0154 3A 20
       AND        AL,0                ;0156 24 00
       ;L0157     L0135 CJ
L0157  EQU        $-1
       ;L0165     L0143 CJ
L0165  EQU        $+0DH
       ;L016C     L014A CJ
L016C  EQU        $+14
       ;L0191     L011B CJ
L0191  EQU        $+39
S0000  ENDS
;
END        L0100

2. Disassemblierung mit SEQ-Steuerungsdatei

Man kann jedoch bereits vor der Disassemblierung etwas machen. Dazu wird das ausführbare Programm mit DEBUG inspiziert. Unschwer ist zu erkennen, dass ab der Adresse 0119H kein Programmcode steht. Es handelt sich um eine ASCII-codierte Zeichenkette. Diese Eigenschaft kann man ASMGEN in der Datei JNDEMO.SEQ mitteilen. Deren Inhalt ist unterhalb der DEBUG-Darstellung angegeben.

D:\dos\ML\Test>debug jndemo.com
-d
1A97:0100  BA 19 01 B4 09 CD 21 B4-08 CD 21 0C 20 3C 6A B0   ......!...!. <j.
1A97:0110  00 74 02 FE C0 B4 4C CD-21 42 69 74 74 65 20 67   .t....L.!Bitte g
1A97:0120  65 6E 65 6E 20 53 69 65-20 4A 20 6F 64 65 72 20   enen Sie J oder
1A97:0130  6A 20 66 75 65 72 20 4A-61 20 75 6E 64 20 4E 20   j fuer Ja und N
1A97:0140  6F 64 65 72 20 6E 20 66-75 65 72 20 4E 65 69 6E   oder n fuer Nein
1A97:0150  20 65 69 6E 3A 20 24 00-00 00 00 00 00 00 00 00    ein: $.........
1A97:0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
1A97:0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
-q

D:\dos\ML\Test>

Die Datei JNDEMO.SEQ ist nachfolgend dargestellt. Sie benötigt an ihrem Textende das Steuerzeichen 1AH (Steuerung Z, hier dargestellt durch →). „Moderne” Editoren wie NOTEPAD erzeugen dies Steuerzeichen nicht mehr. Der Editor EDLIN (zu finden unter %systemroot%\system32) dagegen ist geeignet. Viel Spaß damit!

;.seq fuer Rueckassemblierung von JNDEMO.COM mit asmgen3
0100   /h
0119  S  ;ASCII-Zeichenkette am Programmende
→

Bei Vorhandensein der Steuerdatei JNDEMO.SEQ sieht das Ergebnis der Rückassemblierung viel freundlicher aus. Sogar der Tippfehler beim Wort „geben” des ursprünglichen Quellprogramms ist klar ersichtlich. Das erzeugte Quellprogramm lässt sich assemblieren. Es laufen der ML-Assembler und der Linker fehlerfrei durch. Sie erzeugen ein bytegenaues Abbild des ursprünglichen ausführbaren Programmes JNDEMO.COM.

Schade ist, dass sie Kommentare des originalen Quellprogramms nicht aus dem ausführbaren Programm erzeugt werden können. Auch ist das originale Quellprogramm für einen fachkundigen Menschen einfacher zu interpretieren als das durch Rückassemblierung erzeugte Quellprogramm.

PAGE        58,132
TITLE        JNDEMO        3-7-111        [3-7-111]

.RADIX        16
LF  EQU   0AH
CR  EQU   0DH
;
;INITIAL VALUES :  CS:IP  0000:0100
;                  SS:SP  0000:FFFF
       ;L0000S          L010F DI  L0156 DI
S0000  SEGMENT
       ASSUME DS:S0000, SS:S0000 ,CS:S0000 ,ES:S0000
       ORG        $+0100H
L0000  EQU        $-100H
       ;L0008     L0107 DI
L0008  EQU        $-0F8H
       ;L0009     L0103 DI
L0009  EQU        $-0F7H
       ;L0020     L010B DI
L0020  EQU        $-0E0H
       ;L0021     L0105 CC  L0109 CC  L0117 CC
L0021  EQU        $-0DFH
       ;L004C     L0115 DI
L004C  EQU        $-0B4H
       ;L006A     L010D DI
       ;L0100     L014E CI
L0100: MOV        DX,OFFSET L0119     ;0100 BA 19 01
       MOV        AH,9                ;0103 B4 09
       INT        21H                 ;0105 CD 21
       MOV        AH,8                ;0107 B4 08
       INT        21H                 ;0109 CD 21
       OR         AL,20H        ;' '  ;010B 0C 20
       CMP        AL,6AH        ;'j'  ;010D 3C 6A
       MOV        AL,0                ;010F B0 00
       JZ         L0115               ;0111 74 02
       INC        AL                  ;0113 FE C0
       ;L0115     L0111 CJ
L0115: MOV        AH,4CH        ;'L'  ;0115 B4 4C
       INT        21H                 ;0117 CD 21
       ;L0119     L0100 DI
L0119  DB        'Bitte genen Sie J oder j fuer Ja und N oder n fuer Ne'
       ;0119 42 69 74 74 65 20 67 65 6E 65 6E 20 53 69 65 20 4A 20 6F 64 65 72 20 6A
       DB        'in ein: $'                        ;014E 69 6E 20 65 69 6E 3A 20 24
S0000  ENDS
;
END    L0100

Letztes Upload: 21.07.2016 um 07:03:53