Babylon (Build 20.14)

oder
100 Tage Limit in einem Freeware Programm?


Einleitung

Na Leute, da haben wir ja mal wieder ein schoenes Freeware-Tool gefunden. Wer Babylon noch nicht kennt, hat wirklich was verpasst. Das Programm ist einfach genial. Es uebersetzt englische Vokabeln ins Deutsche (bzw. in irgendeine andere Sprache, je nachdem welches Sprachmodul ihr euch runtergeladen habt.) und das ganze per Point und Click. (Wie es sich fuer einen Windows-User gehoert :)

Das ganze hat nur einen kleinen Haken. Nach genau 100 Tagen laeuft Babylon nicht mehr und will geupdated werden. Naja, ich hab aber keinen Bock meine Software staendig zu aktualisieren, bzw. soll es auch Leute geben die noch kein Internet haben und sich deshalb nicht staendig neue Updates aus dem Netz ziehen koennen.

Deshalb geht es in diesem Tutorial darum, das 100 Tage Limit zu entfernen. Also los gehts...

Benoetigte Tools

Babylon Translator (Build 20.14) Babylon Homepage
W32DASM - Disassembler
Softice 2.3 - Debugger
HexWorkshop oder einen anderen Hexeditor
Diverse Vorkenntnisse im Reverse Engineering.


Die Suche - oder wo werden die uebrigen Tage ueberprueft?

Erstmal stellen wir unsere Systemzeit um 1 Jahr vor, damit wir das 100 Tage Limit ueberschreiten.
Wenn wir jetzt Babylon starten kommt eine Dialogbox, die uns sagt das unsere Babylon Version erloschen ist. So ein Mist auch... Genau das wollen wir ja vermeiden.
Disassemblieren wir die Babylon.exe erstmal mit W32DASM um zu sehen in welche Funktion wir uns einklinken.
Mhh, sieht noch nicht so toll aus. Muss wohl 'ne andere Strategie her...

Ok, dann jagen wir eben mal die CAPTLIB.DLL duch den W32DASM...
Da finden wir unter den exportierten Funktionen folgendes:
 +++++++++++++++++++ EXPORTED FUNCTIONS ++++++++++++++++++
 Number of Exported Functions = 0015 (decimal)

 Addr:00402215 Ord:   1 (0001h) Name: OpenBabylonDLL
 Addr:0040249A Ord:   2 (0002h) Name: OpenFilesForEnglishDictionaries
 Addr:00402898 Ord:   3 (0003h) Name: CloseFilesForEnglishDictionaries
 Addr:004034C4 Ord:   4 (0004h) Name: GetEnglishMakors
 Addr:00404D3B Ord:   5 (0005h) Name: GetExactEnglishBitui
 Addr:0040382E Ord:   6 (0006h) Name: GetEnglishWordTranslationFromPtr
 Addr:004040D4 Ord:   7 (0007h) Name: EnglishBituim
 Addr:00405221 Ord:   8 (0008h) Name: FindInCommonMistakes
 Addr:004056DF Ord:   9 (0009h) Name: FixRightHalfOfWord
 Addr:00405A93 Ord:  10 (000Ah) Name: Init
 Addr:00405AB4 Ord:  11 (000Bh) Name: DLLSetHookOption
 Addr:00405D14 Ord:  12 (000Ch) Name: MyHookProc
 Addr:004101B8 Ord:  13 (000Dh) Name: __DebuggerHookData
 Addr:004069AC Ord:  14 (000Eh) Name: __lockDebuggerData(void)
 Addr:004069D4 Ord:  15 (000Fh) Name: __unlockDebuggerData(void)

OpenBabylonDLL - Das hoert sich schonmal gut an... Versuchen wir mal hier reinzuspringen.

1.) Softice-Loader starten
2.) Babylon.exe in den Loader laden.
3.) CTRL-D um in Softice zu gelangen.
4.) BPX OpenBabylonDLL
5.) Und Babylon.exe ausfuehren.

BANG! Schon sind wir in der OpenBabylonDLL Funktion
Backtrace mit F12 und wir kommen zu folgendem Code:

:004019B1 68CC244400              push 004424CC
:004019B6 FF1570254400            call dword ptr [00442570]
:004019BC 8BD8                    mov ebx, eax
:004019BE 3B1DCC244400            cmp ebx, dword ptr [004424CC]
:004019C4 7407                    je 004019CD
:004019C6 33C0                    xor eax, eax
:004019C8 A3CC244400              mov dword ptr [004424CC], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004019C4(C)
|
:004019CD 833DCC24440000          cmp dword ptr [004424CC], 00000000
:004019D4 0F9FC2                  setg dl
:004019D7 83E201                  and edx, 00000001
:004019DA 8915C8244400            mov dword ptr [004424C8], edx
:004019E0 C705B820440001000000    mov dword ptr [004420B8], 00000001
:004019EA 33C9                    xor ecx, ecx
:004019EC 890DBC204400            mov dword ptr [004420BC], ecx
:004019F2 E86B090000              call 00402362
:004019F7 FF75FC                  push [ebp-04]
:004019FA E8C2090000              call 004023C1
:004019FF 59                      pop ecx
:00401A00 833DC020440000          cmp dword ptr [004420C0], 00000000
:00401A07 752A                    jne 00401A33
:00401A09 6A0B                    push 0000000B

Sieht so aus, als ob da irgendwas an der Adresse 004424CC geprueft wird bevor es weitergeht.

Ich hab das natuerlich schon im Vorraus fuer euch ueberprueft und verrate euch schonmal, das in dieser Adresse die verbleibenden Tage gespeichert werden.

Hier jetzt die Erklaerung zur Ueberpruefungsroutine:

:004019B1 68CC244400           	  push 004424CC			; Irgendwas auf den Stack
:004019B6 FF1570254400            call dword ptr [00442570]	; OpenBabylonDLL Funktion aufrufen
:004019BC 8BD8                    mov ebx, eax			; Uebrige Tage von EAX nach EDX
:004019BE 3B1DCC244400            cmp ebx, dword ptr [004424CC] ; Steht in EBX dasselbe wie in 4424CC?
:004019C4 7407                    je 004019CD			; JA --> Dann Sprung...
:004019C6 33C0                    xor eax, eax			; EAX loeschen
:004019C8 A3CC244400              mov dword ptr [004424CC], eax	; EAX in Adr. 4424CC speichern

:004019CD 833DCC24440000          cmp dword ptr [004424CC], 00000000 ; Haben wir noch einen Tag?


Wir brauchen jetzt also nur noch dafuer zu sorgen, das Babylon denkt wir haetten immer 100 Tage uebrig.
Also Taschenrechner raus und erstmal 100 in Hex umrechnen. Ok... Ergibt 64h.

Jetzt schreiben wir die Funktion so um das es uns immer 100 Tage an die Adresse 4424CC schreibt wenn wir Babylon starten. Gesagt, getan...

:004019B1 68CC244400              push 004424CC			     ; Irgendwas auf den Stack
:004019B6 FF1570254400            call dword ptr [00442570]	     ; OpenBabylonDLL Funktion aufrufen
:004019BC C705CC24440064000000    mov dword ptr [004424CC], 00000064 ; 100 an Adresse 4424CC schreiben
:004019C6 90                      nop				     ; Den Rest ausnoppen,
:004019C7 90                      nop				     ; damit wir keine Probleme
:004019C8 90                      nop				     ; mit dem Stack bekommen!
:004019C9 90                      nop
:004019CA 90                      nop
:004019CB 90                      nop
:004019CC 90                      nop
:004019CD 833DCC24440000          cmp dword ptr [004424CC], 00000000


So, lassen wir das Programm mal weiterlaufen um zu sehen obs auch klappt so wie wir uns das vorstellen. (Dazu druecken wir in Softice die Taste F5 fuer alle die es noch nicht wussten :)

Voila... Es funktioniert. Babylon laeuft wieder. Schauen wir mal unter HILFE / UEBER BABYLON nach wieviel Tage wir noch haben... 100 Jiphee... Es funktioniert wirklich.

Jetzt muessen wir den Patch nur noch permanent machen. Und das erklaere ich euch im naechsten Kapitel... (Jetzt muss ich mir aber erstmal noch 'ne schoene heisse Tasse Kaffee machen. Ohne gehts einfach nicht. :)

Jetzt wird gepatcht!

Schreiben wir uns erstmal die Hex-Bytes der Opcodes (Assembler-Syntax!) auf:

Original-Code:
:004019BC 8BD8                    mov ebx, eax			; Uebrige Tage von EAX nach EDX
:004019BE 3B1DCC244400            cmp ebx, dword ptr [004424CC] ; Steht in EBX dasselbe wie in 4424CC?
:004019C4 7407                    je 004019CD			; JA --> Dann Sprung...
:004019C6 33C0                    xor eax, eax			; EAX loeschen


Gepatchter Code:
:004019BC C705CC24440064000000    mov dword ptr [004424CC], 00000064 ; 100 an Adresse 4424CC schreiben
:004019C6 90                      nop				     ; Den Rest ausnoppen,
:004019C7 90                      nop				     ; damit wir keine Probleme
:004019C8 90                      nop				     ; mit dem Stack bekommen!
:004019C9 90                      nop
:004019CA 90                      nop
:004019CB 90                      nop
:004019CC 90                      nop


Wir muessen also noch folgender Hex-Byte-Kombination suchen:

8BD83B1DCC2444007407

und sie durch

C705CC2444006400000090909090909090

ersetzen!

Schreiten wir zur Tat,starten wir unseren Hex-Editor und laden Babylon.exe rein!

Wenn die Suche erfolgreich ist, sollten wir folgendes sehen:

00000FB0 0068 CC24 4400 FF15 7025 4400 8BD8 3B1D
00000FC0 CC24 4400 7407 33C0 A3CC 2444 0083 3DCC


Und wenn wir fertig sind sollte das Ganze so aussehen:

00000FB0 0068 CC24 4400 FF15 7025 4400 C705 CC24
00000FC0 4400 6400 0000 9090 9090 9090 9083 3DCC


Speichern wir das File unter einem neuen Namen und wenn wir alles richtig gemacht haben funktioniert es genauso wie wir uns das gedacht haben. Von jetzt an haben wir immer 100 Tage und unsere Babylon-Version laeuft NIE ab... So muss das sein :)

Wie man ein Program schreibt, das solche Patches automatisch durchfuehrt, erklaere ich vielleicht mal in einem anderen Tutorial!

Schlusswort

Dieses Tutorial ist natuerlich nur zu Informationszwecken gedacht. Bitte verwendet dieses Tutorial niemals zu illegalen Zwecken!

Greetings fly out to:
Compiler-Torsten, Micha Fix, alle Leutz aus der ehemaligen Atari-Szene (Animal Mine, Synergy, Aura, The Lost Boys, Germs und wie sie alle hiessen), alle Leutz die jemals mit mir im Grinder Projekt gearbeitet haben (Cyberpunk, Scraper, Kermit, Masterboy, Sir Bit usw. Hoffentlich hab ich da jetzt niemanden vergessen...) natuerlich auch alle Amiga-Freax da es wohl die treuesten Computerfreax sind, die es gibt, Twister-Klaus, Peter, Roland, Andi, Moritz, Puffi, ID-Software fuer Doom/Quake, Pantera, Black Sabbath, Judas Priest, Sick of it all und alle anderen die sich angesprochen fuehlen....

In diesem Sinne: Party on dudez!

Euer Sledge Hammer / Grinder


(c) by Sledge Hammer of Grinder 1999 - Use only for legal purposes!