How to remove the CD protection in Deathtrap dungeon
XVII Comment cracker Deathtrap dungeon
Vous devez tout d’abord installer le jeu complètement (avec les motions vidéos). Il y a une vérif. du CD avant et pendant le jeu. Il y a plusieurs fichiers d’installer sur votre disque dur: ddconfig.exe, ddstart.exe et un dll appelé dungeon.dll et un sous répertoire asylum. Les trois fichiers mentionnés sont les plus importants pour nous. J’ai d’abord désassemblé ddstart.exe pour voir si la vérif n’était pas là. Bon, il y en avait une, mais le programme lançais aussi dd_cd.exe depuis x :\asylum\ sur lecteur CD ou "x" est la lettre de votre lecteur. Je me demandais pourquoi ne pas copier le répertoire d’installation et le lançais comme le programme de lancement de Deathtrap Dungeon. Ca marche, sauf pour la vérif. Donc désassemblons le fichier qui vérifie le CD, et on trouve ceci:
* Referenced by a CALL at Addresses:
|:004011A5 , :004011D7 <-- Appelé 2 fois
|
:00401220 53 push ebx
* Possible StringData Ref from Data Obj ->"X:\" <-- lettre du lecteur
:00401221 6820614000 push 00406120
:00401226 8A5C240C mov bl, byte ptr [esp+0C]
:0040122A 881D20614000 mov byte ptr [00406120], bl
* Reference To: KERNEL32.GetDriveTypeA, Ord:00DEh <-- Utilisé par les CD-CHECK
:00401230 FF1598914000 Call dword ptr [00409198]
:00401236 83F805 cmp eax, 00000005 <-- Valeur pour un lecteur CD
:00401239 752C jne 00401267 <-- si la vérif plante va en 401267
* Possible StringData Ref from Data Obj ->"rb" <-- lit les binaires (Read Binary)
:0040123B 6808614000 push 00406108
:00401240 881D0C614000 mov byte ptr [0040610C], bl
* Possible StringData Ref from Data Obj ->"X:\Asylum\DD_CD.EXE" <-- recherche
:00401246 680C614000 push 0040610C
:0040124B E8F0000000 call 00401340
:00401250 83C408 add esp, 00000008
:00401253 85C0 test eax, eax
:00401255 7410 je 00401267
:00401257 50 push eax
:00401258 E843000000 call 004012A0
:0040125D 83C404 add esp, 00000004
:00401260 B801000000 mov eax, 00000001 <-- envoie une valeur si vérif bonne
:00401265 5B pop ebx
:00401266 C3 ret
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401239(C), :00401255(C)
|:00401267 33C0 xor eax, eax <-- Zéro pour l'échec de la vérif
:00401269 5B pop ebx
:0040126A C3 ret
Bien. c'est le code qui vérifie que le fichier dd_cd.exe est sur le CD. maintenant, il faut trouver la routine qui appelle le code suivant :
:004011A5 E876000000 call 00401220 <-- fait la vérif
:004011AA 83C404 add esp, 00000004
:004011AD 85C0 test eax, eax <-- Teste les résultats
:004011AF 7416 je 004011C7 <-- prend ce jump si échec (eax=00)
L'autre partie du code qui appelle la vérif ressemble à cela :
:004011D7 E844000000 call 00401220 <-- fait la vérif
:004011DC 83C404 add esp, 00000004
:004011DF 85C0 test eax, eax <-- Teste les résultats
:004011E1 7512 jne 004011F5 <-- prend ce saut si échec (eax=00)
le fichier dd_cd.exe est vraiment petit et il est utilisé pour appeler le fichier dungeon.dll qui lance le jeu. Ceci peut-être vu en vérifiant la section du module d'importation comme ceci :
Import Module 004: Dungeon.dll <-- nom du module
Addr:000092CA hint(0001) Name: Config_Set_CD_Drive <-- recherche le lecteur CD
Addr:000092E0 hint(0003) Name: Read_Default_Values_From_Config_File <--
Addr:0000927C hint(0005) Name: _W95_Serve_Message@16
Addr:00009294 hint(0004) Name: W95_Set_Message_Loop_Caller
Addr:000092B2 hint(0002) Name: Play_Win32_Deathtrap <-- lance le jeu
Et le désassemblage de dd_cd.exe va vous donner ça :
:004010CA 52 push edx
:004010CB 50 push eax
:004010CC 51 push ecx
* Reference To: Dungeon.Play_Win32_Deathtrap, Ord:0002h <-- dit que tout va bien ici
:004010CD E8A6010000 Call 00401278
:004010D2 83C414 add esp, 00000014
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004010AF(C)
:004010D5 33C0 xor eax, eax <-- arrivé ici veut dire quitter le jeu
:004010D7 81C4D8010000 add esp, 000001D8
:004010DD C3 ret
Pourquoi ne pas simplement détruire l'ancien fichier ddstart.exe et renommer le fichier dd_cd.exe en ddstart.exe, et tout serait nickel. Et bien non ! tout simplement qu'il y 8 checks du CD. Mais ils sont cachés dans le fichier dungeon.dll lui-même et peuvent être trouvés en recherchant la chaîne "Insert Deathtrap Dungeon CD into drive %c:" dans
DATA STRING REFERENCES. Ca devrait vous donner le code suivant :
:1000F3DA E821100300 call 10040400 <-- utilitaire appelé souvent
:1000F3DF 85C0 test eax, eax <-- Teste eax pour la valeur
:1000F3E1 0F852C010000 jne 1000F513 <-- prendre ce jump pour passer la vérif
* Possible StringData Ref from Data Obj ->"-:\A.DAT" <-- fichier recherché
:1000F3E7 8B0DE08A0F10 mov ecx, dword ptr [100F8AE0]
:1000F3ED 33FF xor edi, edi
:1000F3EF A0F08A0F10 mov al, byte ptr [100F8AF0]
:1000F3F4 8801 mov byte ptr [ecx], al
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F50D(C)
|
* Possible StringData Ref from Data Obj ->"rb" <-- lit les binaires
:1000F3F6 6894D00B10 push 100BD094
* Possible StringData Ref from Data Obj ->"-:\A.DAT" <-- le fichier
:1000F3FB A1E08A0F10 mov eax, dword ptr [100F8AE0]
:1000F400 50 push eax
:1000F401 E8BAC30900 call 100AB7C0
:1000F406 83C408 add esp, 00000008
:1000F409 8BE8 mov ebp, eax
:1000F40B 85ED test ebp, ebp
:1000F40D 742B je 1000F43A
:1000F40F 53 push ebx
:1000F410 6800C07326 push 2673C000
:1000F415 55 push ebp
:1000F416 E875C50900 call 100AB990
:1000F41B 83C40C add esp, 0000000C
:1000F41E 55 push ebp
:1000F41F E82CC50900 call 100AB950
:1000F424 83C404 add esp, 00000004
:1000F427 83F84A cmp eax, 0000004A
:1000F42A 7505 jne 1000F431
:1000F42C BF01000000 mov edi, 00000001 <-- teste les flags pour échec/passe
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F42A(C)
|:1000F431 55 push ebp
:1000F432 E8A9C20900 call 100AB6E0
:1000F437 83C404 add esp, 00000004
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F40D(C)
|:1000F43A 85FF test edi, edi <-- si edi est 00000001 la vérif est passée
:1000F43C 0F85D1000000 jne 1000F513 <-- Prendre ce saut pour passer le check
* Possible StringData Ref from Data Obj ->"Insert the Deathtrap Dungeon CD into drive %c:"
:1000F442 8B0DF48A0F10 mov ecx, dword ptr [100F8AF4]
:1000F448 8D542414 lea edx, dword ptr [esp+14]
:1000F44C 0FBE05F08A0F10 movsx eax, byte ptr [100F8AF0]
:1000F453 50 push eax
:1000F454 51 push ecx
:1000F455 52 push edx
:1000F456 E855C40900 call 100AB8B0
:1000F45B 83C40C add esp, 0000000C
:1000F45E 8B2D848C0F10 mov ebp, dword ptr [100F8C84]
:1000F464 C70550DC0D1001000000 mov dword ptr [100DDC50], 00000001
:1000F46E 85ED test ebp, ebp
:1000F470 7405 je 1000F477
:1000F472 E8E9110700 call 10080660
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F470(C)
|:1000F477 E8442F0700 call 100823C0
:1000F47C 53 push ebx
:1000F47D A134DC0D10 mov eax, dword ptr [100DDC34]
:1000F482 50 push eax
* Reference To: USER32.ShowWindow, Ord:022Ch
:1000F483 FF153C253510 Call dword ptr [1035253C]
:1000F489 68007F0000 push 00007F00
:1000F48E 53 push ebx
* Reference To: KERNEL32.GetModuleHandleA, Ord:00FDh
:1000F48F FF15E8243510 Call dword ptr [103524E8]
:1000F495 50 push eax
* Reference To: USER32.LoadCursorA, Ord:0172h
:1000F496 FF1570253510 Call dword ptr [10352570]
:1000F49C 50 push eax
* Reference To: USER32.SetCursor, Ord:01EBh
:1000F49D FF1520253510 Call dword ptr [10352520]
:1000F4A3 6A01 push 00000001
* Reference To: USER32.ShowCursor, Ord:0228h
:1000F4A5 FF1518253510 Call dword ptr [10352518]
:1000F4AB 8D442414 lea eax, dword ptr [esp+14]
:1000F4AF 6835200000 push 00002035
* Possible StringData Ref from Data Obj ->"Deathtrap Dungeon"
:1000F4B4 6878F80B10 push 100BF878
:1000F4B9 50 push eax
:1000F4BA 53 push ebx
* Reference To: USER32.MessageBoxA, Ord:0195h
:1000F4BB FF1538253510 Call dword ptr [10352538]
:1000F4C1 83F802 cmp eax, 00000002 <- 02 implique l'appui sur CANCEL
:1000F4C4 750E jne 1000F4D4
* Possible StringData Ref from Data Obj ->"Original CD not found" <-- mauvais !!
:1000F4C6 A1F88A0F10 mov eax, dword ptr [100F8AF8]
:1000F4CB 50 push eax
:1000F4CC E85FC60100 call 1002BB30
:1000F4D1 83C404 add esp, 00000004
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F4C4(C)
:1000F4D4 6A03 push 00000003
:1000F4D6 A134DC0D10 mov eax, dword ptr [100DDC34]
:1000F4DB 50 push eax
:1000F4DC 891D50DC0D10 mov dword ptr [100DDC50], ebx
* Reference To: USER32.ShowWindow, Ord:022Ch
:1000F4E2 FF153C253510 Call dword ptr [1035253C]
:1000F4E8 E8030D0700 call 100801F0
:1000F4ED 85ED test ebp, ebp
:1000F4EF 7405 je 1000F4F6
:1000F4F1 E84A110700 call 10080640
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000F4EF(C)
|:1000F4F6 6A01 push 00000001
:1000F4F8 53 push ebx
:1000F4F9 68E0010000 push 000001E0
:1000F4FE 6880020000 push 00000280
:1000F503 E8A88A0400 call 10057FB0
:1000F508 83C410 add esp, 00000010
:1000F50B 85FF test edi, edi
:1000F50D 0F84E3FEFFFF je 1000F3F6 <-- essaye encore
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000F3E1(C), :1000F43C(C) <-- 2 voies sont possibles
|:1000F513 E8A83A0000 call 10012FC0 <-- arrivé ici, le jeu continue
:1000F518 E8B3070700 call 1007FCD0
:1000F51D 85C0 test eax, eax
:1000F51F 740A je 1000F52B
:1000F521 C644241101 mov [esp+11], 01
:1000F526 E947030000 jmp 1000F872
Bien. les 4 fichiers sur le CD appelé a.dat, b.dat, c.dat et d.dat font chacun 615 Mo. Chaque fichier prend donc un CD complet et vous n'allez pas copier 2460 Mo sur votre disque dur pour lancer le jeu. La meilleur manière est donc de forcer la routine à prendre le saut en 1000F3E1. De cette manière, la vérif des fichiers ne sera jamais lancée et le programme sautera à la section suivante pour continuer le jeu. Je voulais faire un patch unique dans la routine 10040400, mais elle est appelée trop de fois par les autres routines. Je ne connais pas l'impact que cela fera dans le programme. Nous devons donc changer l'appel 10040400 à l'adresse 1000F3DA en mov eax,00000001. Le code prendra donc toujours le jne en 1000F3E1 et le jeu continuera. Nous devons faire la même chose pour les 7 autres checks pendant je jeu. J'ai modifié le jeu et j'y ai joué. Aucun problème.
Résumons :
Faîtes l'installation complète de DD (avec les motions vidéos)
Copiez dd_cd.exe dans le répertoire du jeu sur votre disque dur
supprimez ddstart.exe et renommez dd_cd.exe en ddstart.exe
faîtes les changements suivants :
dans ddstart.exe (ex dd_cd.exe)
- recherchez
E8 76 00 00 00
à l'adresse offset 1,445 et remplacez parB8 01 00 00 00
. - recherchez
E8 44 00 00 00
à l'adresse 1,495 et remplacez parB8 01 00 00 00
Dans dungeon.dll,
- recherchez
E8 21 10 03 00
à l'adresse 59,354 et remplacez parB8 01 00 00 00
- recherchez
E8 DA 04 03 00
à l'adresse 62,241 et remplacez parB8 01 00 00 00
- recherchez
E8 87 FE 02 00
à l'adresse 63,860 et remplacez parB8 01 00 00 00
- recherchez
E8 D6 C4 02 00
à l'adresse 78,629 et remplacez parB8 01 00 00 00
- recherchez
E8 FE BE 02 00
à l'adresse 80,125 et remplacez parB8 01 00 00 00
- recherchez
E8 B8 12 FC FF
à l'adresse 517,443 et remplacez parB8 01 00 00 00
- recherchez
E8 A1 08 FC FF
à l'adresse 520,026 et remplacez parB8 01 00 00 00
- recherchez
E8 8A FC FB FF
à l'adresse 523,121 et remplacez parB8 01 00 00 00