April 1998/März 1999
"Memory Map 2" 
Mein erster Crack
MS-DOS PROGRAM 
MS-DOS Reversing
 
von The Sandman  
Übersetzung von BLACKHAwK
 
 
Code Reversing für Anfänger 
 
 
 
Program Details 
Program Name: Memory Map 2 
Program Type: Utility 
Program Location: [ hier ] 
Program Size: 24379 Bytes 
Packed using: LZEXE V0.91 or V1 
 
  
benötigte Tools: 
Unp  - DOS generic unpacker 
Softice V3 - Win'95 De-bugger 
 
Einschätzung
leicht ( X )  mittel (   )  schwer (   )  Profi (   )
There is a crack, a crack in everything. That's how the light gets in.

Ein Beispiel zum Cracken eines kleinen DOS Utility`s
geschrieben von The Sandman
 
Einführung
Memory Map 2 (mit Nigel) ist erschienen mit PC Plus  so um *1990*.

Es ist ein TSR Programm im vollen Umfang, hat aber eine ärgerliche Eingenschaft, denn zu zufälligen Zeiten erscheint der Nag Screen, der uns auffordert, dieses Teil zu Kaufen. Es kontrolliert das BIOS, zeigt den Speicherinhalt in Assembler, Hex und im Textformat an und vieles mehr. Nicht schlecht für nur 40K.
 
Die Anleitung
Einige Jahre bevor das Programm herausgekommen ist habe ich versucht (erfolglos) den Nigel Nag Screen zu cracken und ich erinnere mich, daß ich immerwieder beim "auspacken" des Codes ins Stocken geraden bin, um das Schutzsystem zu cracken. Ich erinnere mich auch an das schwierige Ausarbeiten, wo die Mitteilungen gespeichert sind und wie sie innerhalb des Schutz-Systems aufgerufen werden. Wenn ich nur etwas über ZEN gewußt hätte, manche Dinge*Mächte* wären anders gewesen.

Alle Anfänger können von meinen Fehlern lernen und es in Zukunft besser machen

Los geht`s mit der Anleitung ...
 
SOFTICE laden, und im Windows File Manager die Option "Quick View" auf das Zielfile (MAP.EXE) anwenden.  OK, es ist ein MS-DOS Programm, aber das soll uns nicht von der Arbeit ablenken.

Mein erster Schritt ist das Durchsuchen des Quelltextes nach lesbaren Texten. Jedes noch so kleines Bruchstück hilft uns, den Ablauf besser zu verstehen.

Ein kleiner Tip: -Benenne die MAP.EXE in MAP.TXT um und öffne sie im Notepad

Auf der anderen Seite merkt Wordpad, das es eine ausführbare Datei ist, und öffnet sie nicht.(Wer weis warum?)
 

OK, was sehen wir....  Ah, einen Hinweis,daß das Programm beginnt mit:-
 

MZ;0    Uÿÿì     €    Ü   LZ91

 
Dieser sagt uns, daß die Datei durch den DOS Packer LZEXE V0.91 komprimiert wurde.Wir könnten noch weiteren Text lesen, das aber ist momentan nicht von echtem Interesse. Wir könnten, wenn wir wollten, diese Datei jetzt entpacken, z.B. mit UNP oder UNLZEXE, aber daß ist im Moment nicht notwendig. Beim Start des Programm`s wird es ja eh im Speicher entpackt und wir können darauf zugreifen.

Das Entpacken des Programm`s, damit wir ein "Dead Listing" vom Code erstellen können (mehr dazu später, alles zu seiner Zeit) hilft uns nicht viel, da unser Wissen über Assemblerbefehle und der Aufbau des internen Code`s begrenzt ist oder im Monent nicht vorhanden ist
 

Starten wir nun die MAP.EXE mit einen Doppelklick im Dateimanager. Während wir auf den NAG Screen warten testen wir die Eigenschaften des Programm`s aus. es dauert nicht lang und der NAG Screen erscheint. Hier stellen wir folgendes fest:-

 1. Beim ersten Mal haben wir 2-3 sec Pause, ehe wir wieder eine Taste drücken können. Das ist der Standard für diese NAG Screen`s . Alle folgenden NAG Screen`s bestehen aus 3 Abschnitten:-

1b.  Anzeige der Nachricht.

2-3 seconds
Anzeigen der erforderlichen Taste zum Schliessen des Windows

Bei dem nächsten NAG Screen drücke Strg und d zusammen, um SOFTICE in der 2-3 sec Pause zu Starten SOFTICE sollte jetzt folgenden Code Anzeigen:-
 
 
:0715.959D  
:0715.959F   
:0715.95A4  
:0715.95A7    
:0715.95AA  
:0715.95AC   
:0715.95AF  
:0715.95B1 
mov es, ax  
mov bx, cs:[884D]  
mov ax, es:[bx]  
add ax, 0024    ;ROM BIOS Zeitroutine.  
jb 95B1  
cmp ax, es:[bx] ;Du solltest irgendwo   
ja 95AC         ;hier landen   
ret             ;Auftrag beendet
 
**Bitte Beachten**
 
In meinem Beispiel wurde das Memory Map2 Programm in das memory segment :0715. geladen, aber das ist bei anderen Computer anders. Eine weitaus wichtigere Adresse ist memory offset .959D.

Beispiel:
 
:0715.959D
:          :
:          :...........Speicherinhalt ( Memory offset)
:......................Speicherplatz (memory segment)

Diese 8 Zeilen ist die Routine, welche die 2 sec. Pause generiert, bevor wir mit einer Taste weitermachen können. An dieser Stelle habe ich in SOFTICE STACK eingetippt, um nach irgentwelchen Anhaltspunkten zu suchen, ehe ich mit der RET Anweisung fortfahre. Leider wurde nichts angezeigt.
 

Der STACK ist einfach eine Stelle im Speicher des Computer`s, wo die Stelle der momentanen Position (Speicheradresse) hinterlegt wird, bevor das Programm gestoppt wird, oder etwas anderes tut .Er wird also genutzt zum momentanen speichern von Speicheradressen etc.

Eine RET Anweisung in Assembler bewirkt, das die gerade abgearbeitete Routine zuende ist und ein Sprung zu der Stelle erfolgt, von der aus diese Routine aufgerufen wurde.
 

Wenn du jetzt F10 mehrere Male drückst wirst du sehen, daß SOFTICE ständig dieselben zwei Zeilen ausführt:-
 
 

:0715.95AC                  cmp ax, es:[bx]
:0715.95AF                  ja 95AC
 

Was hier passiert, ist,das im Register AX der Wert des long integer des Counter`s vom ROM BIOS abgelegt und 24 dazugezählt wird. Die Stelle 04Ch ist bei allen PC`s vorhanden. Die Zeile mit der cmp ax,es:[bx] Anweisung vergleicht nun den Wert vom AX Register und den Wert vom ROM BIOS.

Die ja 95AC Anweisung erzeugt eine Schleife,bis der ROM BIOS Counter den selben Wert hat wie das AX Register. Das sind die 2-3 sec. Pause!

Bewege jetzt deinen Cursor unter diese beiden Zeilen, also auf die Zeile:
 

:0715.95B1 C3                     ret

Jetzt tippe Here

Nach 2-3 sec. stoppt SOFTICE an den Beiden Zeilen, von denen wir gerade sprachen.
 

Drücke nochmal F10..

Jetzt kommen wir an die zweite NAG Screen Routine:
 
 
:0715.94EB E882F3  
:0715.94EE 2E3B064B88  
:0715.94F3 7307  
:0715.94F5 5E  
:0715.94F6 5F  
:0715.94F7 5A   
:0715.94F8 59  
:0715.94F9 5B   
:0715.94FA 58  
:0715.94FB C3  

*** NIGEL'S NAG SCREEN ROUTINE  

:0715.94FC 2E8B1ED494  
:0715.9501 8B37   
:0715.9503 8B0C   
:0715.9505 BFF005   
:0715.9508 81E1FE00   
:0715.950C 2BF9  
:0715.950E 2E893E5088  
:0715.9513 8B0C  
:0715.9515 51  
:0715.9516 56  
:0715.9517 E8A300   
:0715.951A 2E8A263D01  
:0715.951F 2E8B3E5088  
:0715.9524 E805C7  
:0715.9527 5E  
:0715.9528 83C602  
:0715.952B E84BC7  
:0715.952E E8AFF1  
:0715.9531 E86700  
:0715.9534 BE9195   
:0715.9537 2E8B3E255C  
:0715.953C 83EF16  
:0715.953F 2E8A263D01  
:0715.9544 50   
:0715.9545 E892C7  
:0715.9548 B42C  
:0715.954A CD21  
:0715.954C 80E60F  
:0715.954F 80C641   
:0715.9552 58  
:0715.9553 8AC6  
:0715.9555 83EF04  
:0715.9558 AB   
:0715.9559 E85A00  
:0715.955C B400  
:0715.955E CD16  
:0715.9560 24DF  
:0715.9562 3AC6  
:0715.9564 75F3   
:0715.9566 E807F3  
:0715.9569 052800  
:0715.956C 2EA34B88  
:0715.9570 59  
:0715.9571 E87100  
:0715.9574 2E8306D49402   
:0715.957A 2E813ED494D494  
:0715.9581 7207  
:0715.9583 2EC706D494AA94  
:0715.958A 5E  
:0715.958B 5F  
:0715.958C 5A  
:0715.958D 59  
:0715.958E 5B 

call 8870  
cmp ax, cs:[884B]  
jnb 94FC  
pop si  
pop di  
pop dx  
pop cx  
pop bx  
pop ax  
ret  
  
* Referenced by a (C)onditional Jump at Address: 0001.94F3(C)  
mov bx, cs:[94D4]  
mov si, [bx]  
mov cx, [si]  
mov di, 05F0  
and cx, 00FE  
sub di, cx  
mov cs:[8850], di  
mov cx, [si]  
push cx  
push si  
call 95BD  
mov ah, cs:[013D]  
mov di, cs:[8850]  
call 5C2C  
pop si  
add si, 0002  
call 5C79  
call 86E0  
call 959B ;unser 2-3 sec. Pause Routine  
mov si, 9591 ;hier landen wir nach dem RET   
mov di, cs:[5C25]  
sub di, 0016  
mov ah, cs:[013D]  
push ax  
call 5CDA  
mov ah, 2C    ;hole Time vom BIOS  
int 21  
and dh, 0F  
add dh, 41  
pop ax  
mov al , dh  
sub di, 0004  
stosw  
call 95B6  
mov ah, 00    ;lese Tastenanschlag  
int 16  
and al, DF  
cmp al , dh  
jne 9559  ;lese die Tasten bis es die richtige ist 
call 8870  
add ax, 0028  
mov word ptr cs:[884B], ax  
pop cx  
call 95E5  
add word ptr cs:[94D4], 0002  
cmp word ptr cs:[94D4], 94D4  
jb 958A  
mov word ptr cs:[94D4], 94AA  
pop si  
pop di  
pop dx  
pop cx

 

Es gibt eine Vielzahl von Wegen, die aus dieser Routine herausführen, aber auf diese möchte ich jetzt nicht weiter eingehen sondern mich auf die Hauptsache konzentrieren. Wenn wir die oberen Zeilen anschauen, sehen wir die Stelle, wo wir von der 2-3 sec. Pause Routine zurückkehren.

Ok, jetzt müssen wir die NAG Screen`s ausschalten.
 

Wie tun wir das? Sollen wir alle Stellen im Programm suchen,die diese NAG Screen`s erscheinen lassen, oder sollen wir die Stelle suchen, wo die Entscheidung getroffen wird, ob überhaupt NAG Screen`s erscheinen sollen?! Geht dir schon ein Licht auf?

Let's crack on...

Wir können in SOFTICE sehen,wo die Routine des NAG Screen`s startet und wo sie endet. Sie startet in der Zeile:-
 

:0715.94FC 2E8B1ED494             mov bx, cs:[94D4]

Weil: über dieser Zeile sehen wir eine RET Anweisung, die uns in 99 von 100 Fällen sagt, das hier eine Routine zuende ist und eine neue beginnt.

Einfach gesagt: jede Routine endet mit einer RET Anweisung und die nächste Anweisung ist der Beginn einer anderen Routine.
 

Programmierer denken meist ganz praktisch, das heißt, sie legen alle zusammengehörenden Routinen in einen Bereich des Code`s. Es ist doch besser, bei einem Ausdruck die Routinen auf 4 oder 5 Seiten zu haben statt auf 100 oder 1000 Seiten.

Meist liegt der Code des Schutzsystems auch am Ende des Programmcodes.

Ok, genug des Geschichtsunterrichtes, laßt uns erfahren, wie wir es cracken können . ;-)

Wir könnten verschiedene Breakpoint`s setzen,aber das würde uns nicht viel nützen. Zwar würden wir das Schutzsystem besser verstehen lernen, aber unserem Ziel kämen wir nicht näher.

Wir erinnern uns: wir suchen eine Stelle, von der aus die NAG Screen Routine ausgelöst wird.

Das ist in den meisten Fällen irgendein Vergleich (CMP) gefolgt von einer Jump Anweisung, und zwar einen Jump, der zum Start der NAG Screen Routine springt.

Also scrollen wir etwas hoch und runter, bis wir follgende Zeilen sehen:
 

:0715.94EB E882F3       call 8870
:0715.94EE 2E3B064B88   cmp ax, cs:[884B]     ;hat der AX den gleichen Inhalt wie
:0715.94F3 7307         jnb 94FC              ;cs:[884b]
:0715.94F5 5E           pop si
 

Für das Ereichen unseres Ziel`s ist der Call 8870 unwichtig, er bereitet wahrscheinlich nur das AX Register vor, damit ein Vergleich überhaupt möglich ist.

Was uns interessiert ist die CMP Anweisung und der folgende Jump Befehl. dieser hat zwei Möglichkeiten: entweder springt er zu unserem NAG Screen, oder es geht weiter mit der folgenden Zeile:
 

:0715.94F5 5E                     pop si
 

Was, wenn wir ein Byte des Sprungbefehls verändern, das heißt, wenn der Sprungbefehl ausgelöst wird springt er nicht, wie normalerweise, zur NAG Screen Routine,sondern einfach zur nächsten Anweisung.
 
 

So, jetzt brauchen wir nur folgendes zu tippen:-

e 94F3
 

Dies sagt SOFTICE, das wir den Speicherinhalt an der Stelle 94F3 bearbeiten möchten. Nun ändern wir den Wert 73 zu 90 und den nächsten Wert 07 auch zu 90

Jetzt nur noch ESC und x drücken und SOFTICE verlassen.Nun hast du ein gecracktes Memory Map 2 Programm was ohne die NAG Screen`s lauft. aber erinnere dich, es arbeitet nur so lange, wie es im Speicher ist . Das Programm auf deiner Festplatte ist unberühert, also uncracked...
 
 
Ein paar abschließende Worte
Es gibt bestimmt noch andere Wege um zu diesem Ziel zu gelangen, aber ich finde, dies ist der beste Weg.

Um diesen *crack* dauerhaft zu machen laden wir die MAP.EXE in unseren LieblingsHexEditor ( ich benutze HexWorkshop Version 2) und dann suche nach: 5756E882F32E3B06

000093F0 91932394 AA942EC7 064B8801 002E803E ..#......K.....>
00009400 5C010674 16505351 525756E8 82F32E3B \..t.PSQRWV....;
00009410 064B8873 075E5F5A 595B58C3 2E8B1ED4 .K.s.^_ZY[X.....
 

jetzt tausche die folgenden markierten BYTES:

000093F0 91932394 AA942EC7 064B8801 002E803E ..#......K.....>
00009400 5C010674 16505351 525756E8 82F32E3B \..t.PSQRWV....;
00009410 064B8890 905E5F5A 595B58C3 2E8B1ED4 .K.s.^_ZY[X.....

Speichere das ganze auf deiner Festplatte

Arbeit erledigt.
Oh Duh
Erinnere dich daran: Software kaufen und NICHT stehlen, damit die Softwarehäuser bestehen bleiben und noch eine Menge "Übungsmaterial" für uns produzieren können und wir die meist schwachen Schutzsysteme knacken.

Wenn du nach Crack`s oder Serial Number`s auf diesen Seiten suchst, dann verschwendest du deine Zeit. Suche lieber im Web nach Warez, Crackz etc.
 

Essay by:          The Sandman
translated by:    BLACKHAwK
Page Created: 2nd May 1998