On m'a fait une demande spécifique pour supprimer les 'cracktro'.
J'ai pensé qu'il serait intérrésant de partager les MODs.
Pas de gros tuto en perspective, on essaye d'aller à l'essenciel.

à faire avec un simple Amiga 500 avec ou sans extention mémoire 
plus une Action Replay MKIII (de préference).
Le tout est bien sûr possible sous WinUae ou autre émulateur
avec les bon fichiers (adf, kickstart, image rom de la MKIII)

Bon bidouillage


Gi@nts


Magic Pockets v1.00 (1991-09-18)(Renegade)[cr SR].adf
CRC32:BEF526E1

Test du jeu : Mini trackload et affichage d'un message de crack. RT 0 1 20000 D 20000+C 2000C MOVEA.L 4.S,A6 20010 MOVE.W #2,1C(A1) ; Trackdisk.device en lecture 20016 MOVE.L #40000,28(A1) ; Adr. mémoire de dest = $40000 2001E MOVE.L #1600,24(A1) ; $1600 de Data chargée donc, 1 Track sous l'AR 20026 MOVE.L #1600,2C(A1) ; à partir de 1a 1er track 2002E JSR -1C8(A6) ; Execution du trackload 20032 MOVEM.L D0-D7/A0-A6,(A7) ; Sauvegarde des registres 20036 JSR 40000 ; Execution du code trackloadé 2003C MOVE.W #100,DFF096 ; Conf DMACON 20044 MOVEM.L A7+,D0-D7/A0-A6 ; On restore les valeurs des registres ... Bon, plus simple, il n'y a pas. On bypass tout simplement l'execution du code trackloadé. A 20036 ^20036 NOP ^20038 NOP ^2003A NOP BOOTCHK 20000 WT 0 1 20000


Switchblade II (1991)(Gremlin)[cr CPY].adf
CRC32:79746312

RT 0 1 20000 Assez rapidement on isole l'execution du mini-boot (pas besoin de grande explication) A 2017C ^2017C BRA 20180 ; On saute le mini-boot (affichage texte 'THE COMPANY' sur fond bleu) On continu en cherchant le fond d'écran bleu, on cherche logiquement DFF180, trés vite on arrive en : 204A2 MOVE.L A0,DFF180 A 204A2 ^204A2 NOP ; On desactive le 'fader' d'écran bleu ^204A4 NOP ^204A6 NOP On peut voir un joli trackload 20186 MOVE.W #2,1C(A1) ; Trackdisk.device en lecture 2018C MOVE.L #1800,24(A1) ; $1800 de Data chargée donc, 2 Tracks sous l'AR 20194 MOVE.L #40000,28(A1) ; Adr. mémoire de dest = $40000 2019C MOVE.L #400,2C(A1) ; à partir de 1a 1er track, du 1er bloc. 201A4 JSR -1C8(A6) ; Execution du trackload ... 201EA JSR 40000 ; Execution du code trackloadé ... 201F6 JMP 70000 ; Chargement du jeu Analyse du code en 70000 ... 70142 JSR 60000 70148 MOVE.L #70272,70296 ; Début de la musique ... -------------------------------------- On en profite pour virer la musique du début car, sur le jeu original, cette musique apparait au chargement de l'intro/animation du début du jeu. Intro/animation plus présente sur ce crack (manque de place?), donc, inutile de garder la musique ? Modification du bootsecteur en consequence : A 201F6 ^201F6 MOVE.L #4E714E71,$70148 ; Patch pour ne pas avoir la ziq de l'intro originale. ^20200 MOVE.L #4E714E71,$7014C ; ^2020A MOVE.L #4E714E71,$70150 ; ^20214 JMP 70000 *Bien sûr, si on veux garder la musique, on ne met que je JMP 70000 BOOTCHK 20000 ; Calcul du checksum pour le bootsecteur WT 0 1 20000 ; Ecrire de la track


Jumping Jack'Son (1990)(Infogrames)[cr MAD].adf
CRC32:4ECB20DC

CD S LM startup-sequence, 20000 DEL startup-sequence SM startup-sequence, 20006 2005F ; On supprime l'execution du fichier M.A.D qui est l'exec de la cracktro ; (présent donc au début du fichier startup-sequence)


North & South (1989)(Infogrames)(M5)[cr CP].adf
CRC32:C4DE7E53

RT 0 1 20000 Apres un appel au Trackdisk.device, est executé un joli JSR vers l'adresse de chargement du Trackload. 20020 MOVE.L #50000,28(A1) ; Adr de destination mémoire 20028 MOVEA.L 4.S,(A6) ; Trackdisk.device en mode lecture 2002C JSR -1C8(A6) ; TrackLoad de la cracktro ... 20038 JSR 50000 ; Execution du code Trackloadé (la cracktro donc) Il suffit donc de desactiver cet appel: A 20038 ^20038 NOP ^2003A NOP ^2003C NOP BOOTCHK 20000 WT 0 1 20000


Torvak the Warrior (1990)(Core)(Disk 1 of 2)[cr HZ].adf
CRC32:4FD6FCE6

Test du jeu : Plusieurs trackload en casquade et lancement de la cracktro. RT 0 1 20000 2000C BRA 20012 20012 .... 2001E BRA 20028 -> 20028 MOVE.W #0,DFF18 ; Background en noir 20030 MOVEA.L #4,A6 ; On recharge l'exec base au cas ou. (sert à rien au boot, mais bon...) 20036 MOVE.L #78000,28(A1) ; Adr. mémoire de dest = $78000 2003E MOVE.L #1000,24(A1) ; $1000 donné chargée donc, 1 Track sous l'AR 20046 MOVE.L #400,2C(A1) ; à partir de 1a 1er track, du 1er bloc 2004E MOVE.W #2,1C(A1) ; Trackdisk.device en lecture 20054 JSR -1C8(A6) ; Execution du trackload ... 2006E JMP 780000 ; Execution du code Trackloadé On pause une dead-loop en 2006E, on re-calcul le checksum, et on re-écrie le boot. A 2006E ^2006E BRA 2006E BOOTHK 20000 WT 0 1 20000 On reboot, on entre dans l'AR et on regarde en $78000 78000 MOVE.W #8210,DFF096 ; Conf DMACON ... 78020 BSR 7802A ; 78024 JMP 7000 ; ====================================== On pause un BreakPoint en 78024 et on saute au code en 78000 BS 78024 G 78000 Le trackLoad continue et se termine, puis l'on atteind notre BeakPoint On retourne au code X Aucun trackload visible mais execution de la cracktro On peut donc en déduire que : 78020 BSR 7802A ; Chargement de la cracktro 78024 JMP 7000 ; Sous routine d'execution de la cracktro ====================================== D'ailleurs, on regarde de plus prêt : D 7000 7000 JSR 12300 ; Execution de la cracktro (faite le test avec un BS, vous verrez) 7006 BRA 7024 ; Execution du chargement du jeu. Il faut donc supprimer ce JSR 1230 par des NOP Mais la réel question c'est... ou t'é kilai ? :=))) Bon, méthode brutale, on va charger les données de la disquette et chercher, tout simplement. Déjà on note l'Opcode D 7000 4E B9 00 01 23 00 60 1C 00 00 00 02 4E B9 00 01 23 00 = JSR 12300 60 1C = BRA 7024 Le reste on s'en fiche mais ca nous permet d'être sur de bien tomber sur la sequence hexa. On charge, on cherche. Je part du principe que l'on a un A500 sans extension donc 512 Ko de libre Mais... il y a le systeme et les zones à eviter donc on va y aller molo avec 384 Ko de donnée a chargé une track AmigaDos fait $1600 = !5632 Rappel de base : 1Ko = 1024 Octets 384*1024=393216 Octets 393216/5632=69 track, aller, on arrondi à 70 Let's Go RT 0 !70 10000 F 4E B9 00 01 23 00 60 1C 00 00 00 02, 10000 Rien ! suivant RT !70 !70 10000 Bingo ! trouvé en 2D400 Mais on chargé depuis l'adr $10000 Donc $2D400-$10000=$1D400 $1D400=119808 119808/5632=21,27 Et on a deja fait 70 pistes donc 70+21=91 Donc RT !91 1 10000 F 4E B9 00 01 23 00 60 1C 00 00 00 02, 10000 Trouvé (logique) en 10600 A 10600 ^10600 NOP ^10602 NOP ^10604 NOP Reste plus qu'a re-écrire le tout tjs au même endroit WT !91 1 10000 Et voila :) PS : Penser à desactiver la Dead-Loop dans le Bootsecteur préalablement mis.


Shadow of the Beast (1989)(Psygnosis)(Disk 1 of 2)[cr Band][t +2 Band].adf
CRC32:F0AE521C

Test du jeu : Trackload suivi d'une phase de deux phases de décompression et lancement de la cracktro RT 0 1 20000 2000C MOVE.W #2,1C(A1) ; Trackdisk.device mode lecture 20012 MOVE.L #60000,28(A1) ; Adr. mémoire de dest = $60000 2001A MOVE.L #F800,24(A1) ; $F800 donné chargée donc, 12 Tracks sous l'AR 20022 MOVE.L #BF200,2C(A1) ; à partir de la position disk BF200 $BF200=782848 782848/5632=139 139/2=69.5 ((Piste lue = 69)) 2002A MOVEA.L 4.S,A6 ; 2002E JSR -1C8(A6) ; Début du Trackload 20032 MOVEM.L D0-D6/A0-A6,-(A7) ; typique début de code, on sauvegarde les registres 20036 BSR 20100 ; On saute un petit peu plus loin dans le code. 2003A NOP 2003C MOVEM.L (A7)+,D0-D6/A0-A6 ; On restore les valeurs des registres 20040 MOVE.W #2,1C(A1) ; Second Trackload avec des valeurs différentes 20046 MOVE.L #68000,28(A1) ; voir quelques lignes au dessus pour comprendre le fonctionement de celui-ci 2004E MOVE.L #2C00,2C(A1) ; 20056 MOVE.L #1400,24(A1) ; 2005E MOVEA.L 4.S,A6 20062 JSR -1C8(A6) ; Début du second TrackLoad ... 20090 JMP 7FA50 ==================================== 20096 (Vide) ... 20100 JSR 60020 ; Saut dans le code préalablement trackloadé (voir plus haut), aka : #routine_decomp 20106 CLR.W DFF180 2010C CLR.W DFF182 20112 CLR.W DFF184 20118 LEA 7FA00,A0 ; Adr Source 2011E LEA 67F00,A1 ; Adr Destination 20124 MOVE.W #10,D0 ; Compteur $11*LongWor=$44 20128 MOVE.L (A0),(A1)+ ; ==> Boucle de copie 2012A DBF D0,20128 ; <== On boucle 2012E RTS ==================================== On pose une Dead-Loop à la place du BSR après le trackload Le 1er BSR etant visiblement une boucle de copie. A 20036 ^20036 BRA 20036 BOOTCHK 20000 WT 0 1 20000 D 60020 60020 MOVEQ #0,D7 60022 LEA 60108(PC),A0 60026 LEA DFF180,A5 ; Intéressant car c'est l'adr du fond d'écran (Color00), utilisé par les barres de décompression ... 6007C MOVE.W D7,(A5) ; Decomp barre de couleur 1er phase ; 3A 87 44 FC 00 10 E2 90 4E 75 ; à remplacer par un NOP ; 4E 71 44 FC 00 10 E2 90 4E 75 ... 600FA MOVE.W D0,(A5) ; 3A 80 10 C0 B3 CA 6D E2 4E F9 ; à remplacer par un NOP ; 4E 71 10 C0 B3 CA 6D E2 4E F9 60100 BLT 600E4 ; <-- Phase de décompression 60102 JMP 30000 ; Execution du code décompressé. ; 4E F9 00 03 00 00 78 2A E1 FC 1E 03 06 Ae 07 80 ; Il faudra donc remplacer ce JMP vers notre patch. On pause un BreakPoint en 60102 et on saute en 60020 BS 60102 G 60020 Une fois la décompression fini, notre BreakPoint est atteint, on entre automatiquement dans l'AR On regarde en 30000 30000 ... 30336 CMPI.L #6,43600 ; Test souris <-- a supprimer 30340 BEQ 3040A ; GoTo test_souris_qui_bouge? ========================================================= 3040A CMPI.L #1,43604 ; Test souris qui bouge ? 30414 BNE 30304 ; pas d'appuie, on boucle --> sinon, on continue à derouler le code de fin de CrackTro pour finir en 30500 RTS --> retour en 165E (apres le JSR #routine_decomp) 307D5 307D2 LEA 30DC0,A0 ; ça y ressemble. 307F5 307F2 LEA 30DC0,A0 ; aussi 309F9 309F9 LEA 30DC0,A0 ; et encore aussi :) Au premier abord il parrait simple de 'sauter' les tests souris et laisser le code de la cracktro s'executer. MAIS, on entends furtivement la musique de la cracktro se lancé... Après plusieurs tests et études du code décompacté, le tout semble assez imbriqué. Petit rappel, on cherche à bypasser RAPIDEMENT la cracktro, donc on ne vas pas se lancer dans une desactivation une par une des sous-routine de celle-ci On va faire simple... La musique lancé est, à coup sur, un MODule, on va se servir de l'AR pour chercher où se trouve celui-ci en mémoire. TRACKER Module trouvé : Address 31100 : Slong located in memory : 30DC0 On cherche l'endroit où le code utilise cette adresse : FA 30DC0 On regarde en 307D2 (logiquement car c'est le 1er appel) D 307D2 307D2 LEA 30DC0,A0 ; Adr. du MODule en mémoire 307D8 ADDA.L #3B8,A0 ; On saute le header ? du MODule 307DE MOVEQ #7F,D0 ; Variable/Compteur de la boucle de copie a venir 307E0 MOVEQ #0,D 307E2 MOVE.L D1,D2 ; ==> 307E4 SUBQ.W #1,D0 ; On décrémente notre Compteur en D0 307E6 MOVE.B (A0)+,D1 ; 307E8 CMP.B D2,D1 ; Check si boucle fini 307EA BGT 307E2 ; <== Boucle si pas fini On peut faire simple (crade mais simple). On change le pointeur vers une zone potentielement vide, on change la taille à copier à Zero (double ceinture) Ce qui nous donnes logiquement. 307D2 LEA 30DC0,A0 ; l'adresse du module en mémoire. ; 41 F9 00 03 0D C0 D1 FC 00 00 03 B8 70 7F ; a changer par LEA 0,A0 ; 41 F9 00 00 00 00 D1 FC 00 00 03 B8 70 7F 307DE MOVEQ #7F,D0 ; la longuer du module à copier ; 70 7F 72 00 24 01 53 40 12 18 B2 02 6E ; à changer par MOVEQ #0,D0 ; 70 00 72 00 24 01 53 40 12 18 B2 02 6E Voila, plus de module à jouer, plus de son du coup :) Ce qui nous donnes poru notre Patch : MOVE.B #60,30340 ; Remplace le BEQ par un BRA du 1er Test souris pour sauter directement au second test souris MOVE.L #4E714E71,30414 ; Supprime le test de detection 'move_ mousse', pour 'sauter' directement à la fin du code. MOVE.L #00000000,307D4 ; On supprime l'adresse du MODule mis en A0 MOVE.B #0,307DF ; On supprime la longueur du MODule mis en D0 JMP 30000 ; On saute à l'execution du code décompacté Il faut creer ce code en $1688 (bonne adresse qui est libre pour A500 et A500 avec extension) Ce qui nous donnerait en Opcode 13FC00600003034023FC4E714E710003041423FC00000000000307D413FC0000000307DF4EF900030000 On va déja s'attaque en DUR à nos 3 modifications. - Barres de couleur de décompression - Barres de couleur de décompression - Saut à modifier après décomp pour sauter en $1688 Tout ça se trouve dans le code Trackloadé donc, petit rappel (voir plus haut) 20022 MOVE.L #BF200,2C(A1) ; à partir de la position disk BF200 $BF200=782848 782848/5632=139 139/2=69.5 ((Piste lue = 69) Sous l'AR on fonctionne en TRACK (de 0 à 160 pour info), et non en terme Piste (0 à 80) Donc on va charger la Track 139 et vue que c'est au début du code (voir plus haut), on ve va finalement chargé qu'une Piste. RT !139 1 20000 ; Desactivation barre couleur decomp #1 F 44 FC 00 10 E2 90 4E 75 >2007E A 2007E-2 ^2007C NOP ;Desactivation barre couleur decomp #2 F 10 C0 B3 CA 6D E2 4E F9 >200FA A 200FC-2 ^200FA NOP ; Modification du jump vers notre code mémoire en $1688 F 4E F9 00 03 00 00 78 2A E1 FC 1E 03 ... >20102 M 20102 ^20102 4E F9 00 00 16 88 ... On re-écrie le tout. WT !139 1 20000 Pour finir, on revient à notre Patch Patch à placer dans le Bootsecteur AVANT le BSR 20100 On recharge le Bootsecteur et on déplace le code d'origine RT 0 1 20000 TRANS 2003A 20130 30000 A 20036 ^20036 MOVE.L #13FC0060,1688 ^20040 MOVE.L #00030340,168C ^2004A MOVE.L #23FC4E71,1690 ^20054 MOVE.L #4E710003,1694 ^2005E MOVE.L #041423FC,1698 ^20068 MOVE.L #00000000,169C ^20072 MOVE.L #000307D4,16A0 ^2007C MOVE.L #13FC0000,16A4 ^20086 MOVE.L #000307DF,16A8 ^20090 MOVE.L #4EF90003,16AC ^2009A MOVE.W #0000,16B0 ^200A2 BSR 20100 Et on recopie le tout à la suite TRANS 30000 3005C 200A4 TRANS 300C6 300F6 20100 ; et comme on a de la place entre, autant laisse le code en 20100 en 20100 :) BOOTCHK 20000 WT 0 1 20000


Apprentice (1990)(Rainbow Arts)[cr SR - Valhalla][h Decay][t +1 SR - Valhalla].adf
CRC32:A586093E

Test du jeu : Après un rapide chargement, la cracktro est decompacté et lancé. RT 0 1 20000 20000C MOVE.W #2,1C(A1) ; Trackdisk.device en lecture 20012 MOVE.L #30000,28(A1) ; Adr. mémoire de dest = 30000 2001A MOVE.L #400,2C(A1) ; à partir de 1a 1er track, du 1er bloc 20022 MOVE.L #1800,24(A1) ; $1800 donné chargée donc, 2 Tracks sous l'AR 2002A JSR -1C8(A6) 2002E JMP 30000 On pose une Dead-Loop pour travailler en direct : A 2002E 2002E BRA 2002E BOOTCHK 20000 WT 0 1 20000 On reboot, on entre dans l'AR, on regarde en 30000 Execution d'un trap #0 pour boucle de copie. ################################# 3002C MOVEQ #76,D0 ; Taille de la boucle (76+1) = 77 .. 3002E MOVE.L (A3)+,(A4)+ ; Boucle de copie en long word, donc $77 * 4 = $1DC bytes à copier ... 30030 DBF D0,3002E ; On boucle. ################################# On regarde globalement le reste du code qui est visiblement un code de decompression. En 30212 cela ne ressemble plus à du code. //Zone de donnée 'compressé' de 30212 à 3174C Sur le code de décompression beaucoup de JMP (A4), (A5), (A6) et un seul en (A0) 301F2 JUMP (A0) Test avec BreakPoint en 301F2 (ou deadLoop). C'est bien le jump effectuée en fin de decompression qui sautera en A0 à savoir 2E000 Il faudra à coup sur changer celui-ci vers notre patch. Soucis, le JMP(A0) est codé sur 2 octets, nous il nous en faudra à coup sur 6, donc 4 de plus il faut donc déjà dans un premier temps, décaller tout le code de 4 bytes. On part de la fin bien sûr, donc dabord les 'DATA' TRANS 30212 3174C 40000 ; On déplace vers une zone tampon en 40000 TRANS 40000 4153A 30216 ; Et on replace au même endroit mais +4 (donc 30212+4=30216) Maintenant les deux derniers routines. TRANS 301F4 30212 40000 TRANS 40000 4001E 301F8 'Time to modify the' JMP(A0) $1688 est une bonne adresse, il y a souvant rien. A 301F2 ^301F2 JMP 1688 ; Sautera à la fin de la décompression en $1688, notre futur patch. Dans le code executé au début du $3000, en TRAP 0, on peu voir à la fin de ce cette partie un : 3007E JMP (A4) et juste au dessus 3006E LEA 301F4(PC),A4 Ce jump ne fonctionnera pas vue que l'on a tout déplacer de 4 bytes, il faut donc le changer. A 3006E ^3006E LEA 301F8(PC),A4 ; on a fait plus 4 donc on fait aussi +4 ici Ainsi celui qui pointe sur les deux routines à la fin du code principal, juste avant le début des DATA *Toutes ces appels se trouve avec la commande FA A 3018A ^3018A LEA 30216(PC),A5 ; Même logique que précédement, donc +4 Sans oublier d'ajouter +4 aux donne copié au début du code en 30000 A 3002C 3002C MOVEQ #77,D0 ; Comme la boucle de copie fonctionne en LongWord (voir plus haut) ; il faut ajouter +1 et pas +4, donc 76+1=77 On supprimer les barres de couleurs (rechercher DFF180 on tombe sur A3, on regarde ce qui modifie A3 et on tombe rapidement sur) 30208 MOVE.W D3,(A3) à changer par un NOP A 30208 ^30208 NOP On recharge le boot RT 0 2 20000 Et on écrase par notre code modifié. TRANS 30000 31750 20400 Extra Info : Analyse du code decompressé (pose d'un BS à la fin de la décompression 301F2) Rappel : Saute en (A0) = 2E000 2E000 BRA 2E00A --> 2E00A MOVEM.L D1-D7/A0-A6,-(A7) ; Typique début de code, on sauve les regitres dans la pile. .... 2E020 MOVE.L #2E6C8,DFF080 ; Ras à l'écran 2E02A MOVE.W #85D0,96(A5) ; Ras à l'écran 2E030 MOVE.W #20,96(A5) ; Début affichage CrackTro <-- A changer vers un bra fin de Cracktro 'pour l'instant pas encore trouver) 2E036 ... ; Début code copper and co de la cracktro ... ; La cracktro attends que l'on appuie sur un des boutons de la souris, donc test de BFE001 à coup sur. Facile à trouver :) ; Bingo quelques lignes plus loin. 2E05C BTST #6,BFE001 ; Test bouton gauche appuyé ? 2E064 BNE 2E036 ; Nop, on boucle sur la routine de la cracktro 2E066 CLR.L 24.S ; C'est partie pour le chargement du jeu, on doit donc sauter à cette adresse. On doit docn changer le code en 2E030 par un BRA 2E066 Ce qui nous donne comme pacth en 1688 1688 MOVE.L #60340000,30(A0) ; A0 car à ce moment la il pointe vers le début du code décompacté (voir plus haut) et notre saut à modifier est en (A0)+30 = 2E030 1690 JMP (A0) ; On remet le saut d'origine En Opcode ca nous donnes : 21 7C 60 34 00 00 00 30 4E D0 On code ça dans notre bootsecteur : A 2002E ^2002E MOVE.L #217C6034,1688 ; OPCODE d'un MOVE.L #60340000,30(A0) ^20038 MOVE.L #30,168C ; Début OPCODE d'un JMP (A0) ^20042 MOVE.L #4ED00000,1690 ; Fin OPCODE d'un JMP (A0) ^2004C JMP 30000 ; On retourne au code décompacté avec l'OPCODE d'origine BOOTCHK 20000 WT 0 2 20000

06/04/2020