Index du Forum
IDENTIFICATION SERVEUR : 51.77.218.217 - CLIENT : 3.233.215.231

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

The Bard's Tale II (Electronic Arts-Interplay, 1986-1987)

 
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Sam 02 Juil 2011, 22:37    Sujet du message: The Bard's Tale II (Electronic Arts-Interplay, 1986-1987) Répondre en citant

Bonsoir tout le monde !

* The Bard's Tale II - The Destiny Knight *

Pour ce crack, j'ai commencé par copier le tout au Locksmith 5.0, ce qui s'est bien passé... à part la piste $05 qui ne passe pas du tout. On s'attend à une vérif. quelconque sur cette piste.

La copie boote, l'écran de départ apparaît, puis le soft se plante... évidemment.
Un ctrl+reset nous gratifie d'un "BIP" singulier (à retenir) suivi d'un effacement d'écran et de l'affichage des lettres "EA" en haut de l'écran.

J'entame un tracé de boot pour voir que le soft charge les 5 premiers secteurs d'un coup (en $800, l'octet = $05).
Dès le départ, le code sent le truc écrit pour être bien illisible.... et donne le ton avec un saut qui se fait via la pile, comme un gros sournois.
voir ci-dessous....
Code:

$0828 : A9 A8      LDA #$A8  <---
$082A : 48         PHA
$082B : A9 01      LDA #$01
$082D : 20 00 0C   JSR $0C00
$0830 : A9 05      LDA #$05   <---  au prochain RTS, sautera en $A806
$0832 : 48         PHA
$0833 : A9 00      LDA #$00
$0835 : 20 C8 09   JSR $09C8
$0838 : AD C7 09   LDA $09C7
$083B : D0 C7      BNE $0804
$083D : 4C 05 0A   JMP $0A05 <--- simple routine de temporisation... le vrai saut se fait à la fin de la temporisation, au moment du RTS via le dépilage des adresses

La suite est pire....

$A806 : A0 00      LDY #$00
$A808 : 84 4C      STY $4C
$A80A : A9 20      LDA #$20
$A80C : 85 4D      STA $4D
$A80E : A9 FF      LDA #$FF
$A810 : 91 4C      STA ($4C),Y
$A812 : C8         INY
$A813 : D0 FB      BNE $A810
$A815 : E6 4D      INC $4D
$A817 : 10 F7      BPL $A810
$A819 : A2 00      LDX #$00
$A81B : 20 3A A8   JSR $A83A
$A81E : E8         INX
$A81F : E0 20      CPX #$20
$A821 : D0 F8      BNE $A81B
$A823 : A2 80      LDX #$80
$A825 : 20 3A A8   JSR $A83A
$A828 : E8         INX
$A829 : E0 A0      CPX #$A0
$A82B : D0 F8      BNE $A825
$A82D : EE 3F A8   INC $A83F
$A830 : AD 3F A8   LDA $A83F
$A833 : C9 40      CMP #$40
$A835 : D0 E2      BNE $A819
$A837 : 4C 49 A8   JMP $A849
$A83A : AD 00 B0   LDA $B000
$A83D : 9D 2C 20   STA $202C,X
$A840 : EE 3B A8   INC $A83B
$A843 : D0 03      BNE $A848
$A845 : EE 3C A8   INC $A83C
$A848 : 60         RTS
$A849 : A2 30      LDX #$30   
$A84B : 20 35 AA   JSR $AA35   <---- après ça, ça devient chaud...

La suite est difficilement traçable....
$AA35 : A5 48      LDA $48
$AA37 : 48         PHA
$AA38 : 98         TYA
$AA39 : 48         PHA
$AA3A : 20 99 AA   JSR $AA99
$AA3D : 68         PLA
$AA3E : 85 46      STA $46
$AA40 : 68         PLA
$AA41 : 85 47      STA $47
$AA43 : A0 04      LDY #$04
-----------------------------------------------------------
****** Vilaine boucle ******
-----------------------------------------------------------
$AA45 : B1 46      LDA ($46),Y  <<<--- routine appelée moult fois (sûrement une boucle d'interpréteur d'un pseudocode)
$AA47 : C8         INY
$AA48 : D0 02      BNE $AA4C
$AA4A : E6 47      INC $47
$AA4C : AA         TAX
$AA4D : BD 60 AA   LDA $AA60,X
$AA50 : 18         CLC
$AA51 : 69 72      ADC #$72
$AA53 : 8D 5E AA   STA $AA5E <<--- modifie le saut final
$AA56 : A9 AA      LDA #$AA
$AA58 : 69 00      ADC #$00
$AA5A : 8D 5F AA   STA $AA5F  <<--- modifie le saut final
$AA5D : 4C 72 AA   JMP $AA72 <<<---- l'adresse de ce saut varie sans cesse et est appelée des tonnes de fois (fin de la boucle d'interpréteur ?)
$AA60 : 00      BRK


$AA72 : 20 82 AA   JSR $AA82
$AA75 : A5 42      LDA $42
$AA77 : 85 46      STA $46
$AA79 : A5 43      LDA $43
$AA7B : 85 47      STA $47
$AA7D : A0 00      LDY #$00
$AA7F : 4C 45 AA   JMP $AA45 <<--- retourne à la vilaine boucle plus haut...
$AA82 : B1 46      LDA ($46),Y
$AA84 : 49 03      EOR #$03
$AA86 : C8         INY
$AA87 : D0 02      BNE $AA8B
$AA89 : E6 47      INC $47
$AA8B : 85 42      STA $42
$AA8D : B1 46      LDA ($46),Y
$AA8F : C8         INY
$AA90 : D0 02      BNE $AA94
$AA92 : E6 47      INC $47
$AA94 : 49 D9      EOR #$D9
$AA96 : 85 43      STA $43
$AA98 : 60         RTS


Bon, bref, ça décode à la volée, et ça ressemble à un pseudocode interprété.
J'ai passé pas mal de temps à essayer de tracer ce truc, et puis je me suis dit : soit je détricote le tout et ça me prend la semaine, soit je la joue bourrin...
Evidemment, je l'ai jouée bourrin...
Very Happy

Donc, on reprend tout... changement d'angle d'attaque. J'ai remarqué que le drive faisait un bruit spécifique lorsque la vérification est faite par la protection. Il faut que j'arrête le soft pendant ce processus et que je regarde le code, si je le trouve.
La revectorisation du reset me gène, il faut la faire sauter.

Je recherche avec Copy][+ 5.0 un marqueur du petit "beep" spécifique lors du reset... donc un accès au HP ($C030) et je trouve rapidement ceci :
track $01 secteur $06 octet $48
Code:

$0848 : 20 58 FC   JSR $FC58 <--- effacement d'écran
$084B : A9 FF      LDA #$FF   <--- routine du "bip"
$084D : A2 A0      LDX #$A0
$084F : CA         DEX
$0850 : D0 FD      BNE $084F
$0852 : 2C 30 C0   BIT $C030  <---- HP
$0855 : 38         SEC
$0856 : E9 01      SBC #$01
$0858 : D0 F3      BNE $084D <--- fin routine du "bip"
$085A : A9 C5      LDA #$C5   <--- C5 = "E"
$085C : 8D 00 04   STA $0400  <--- 1er caractère écran
$085F : A9 C1      LDA #$C1   <--- C1 = "A"
$0861 : 8D 01 04   STA $0401   <---- second caractère écran
$0864 : 4C 00 C6   JMP $C600   <--- reboot...


C'est bien la routine appelée par le reset. il suffit de la modifier directement sur le disque pour retomber dans le moniteur lors d'un ctrl+reset.

Je reboote et je break avec ctrl+reset en pleine vérification de la protection (à l'oreille, on ne peut pas se tromper)
Une fois dans le moniteur, je me dis : "si cette routine a été appelée via un JSR, l'adresse de retour est peut-être dans la pile"... je jette un oeil sur la pile et je trouve vite une adresse empilée qui sent bon la zone mémoire maudite : l'adresse $AAB7, qui doit revenir en $AAB8 de l'appel qui précède sûrement.
Code:

$AAB5 : 20 C2 AA   JSR $AAC2   <<<--- appel
$AAB8 : 85 48      STA $48   <<<--- bingo, c'est bien une adresse de retour de sous-routine.
$AABA : 68         PLA
$AABB : A8         TAY
$AABC : 4C 45 AA   JMP $AA45 <<<--- remember la vilaine boucle ? O_o"

Donc, qu'y a t-il en $AAC2 ?
$AAC2 : 6C 42 00 JMP ($0042) <<--- ce qui revient à sauter en $A000 car les valeurs en $0042 et $0043 sont #$00 et #$A0

La routine en $A000 est LA routine de test de la protection.
Je ne vous la copie / colle pas ici, car elle est aussi illisible que la vilaine boucle plus haut (quasi intraçable pour moi)...
Je la lance à la main avec un A000G pour voir ce qu'elle fait.
Elle plante quand la copie est dans le drive, et elle revient gentiment au moniteur quand l'original est dans le drive.
Very Happy
Après vérification des registres, je constate qu'elle ne retourne pas de valeur particulière. Les registres sont au retour totalement identiques à ce qu'ils étaient avant l'appel... du coup, peut-être est-il possible de la virer purement et simplement si elle ne retourne pas une valeur particulière dans un coin de la RAM ?

On essaie...
Toujours avec Copy][+ 5.0, je recherche sur la disquette la signature du début de cette routine :
$A000 : 4C 69 A0 A0 20 88

Trouvé piste $01, secteur $0F, octet $00.
Je remplace le $4C par un RTS ($60) qui va éviter d'exécuter la vérif.

Je reboote. Le soft se bloque en affichant un "?" en haut à gauche de l'écran.
Tiens tiens ^^ .... c'est nouveau... et ça sent bon le test en ram qui vérifie l'intégrité....
Vu qu'à l'époque ça se passait à coup de EOR ou d'addition, je tente le coup de rééquilibrer mon crack en fonction d'un éventuel checksum de la ram.

l'original :
$A000 : 4C 69 A0 A0 20 88 (4C + 69 = B5)

mon crack qui plante (le 1er octet est un RTS)
$A000 : 60 69 A0 A0 20 88 (60 + 69 = C9)

Je le remplace par :
$A000 : 60 55 A0 A0 20 88 (60 + 55 = B5)

Je reboote....
Ca marche !
\o/

Et je suis tout content ^^ ... bourrin, mais content.
_________________
hin hin ^^


Dernière édition par blk le Dim 03 Juil 2011, 8:34; édité 1 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Archange427



Inscrit le: 01 Avr 2011
Messages: 535
Localisation: 92

MessagePosté le: Dim 03 Juil 2011, 0:19    Sujet du message: Répondre en citant

J'adore Smile
Cela démontre toute l'astuce du cracker et les différents angles d'attaques possibles !
A vouloir trop en faire, (le bip particulier et le EA qui s'affiche), ils ouvrent la porte à leur propre perte.
Cela me rappelle certains trucs sur PC (où j'ai un peu plus d'expérience que sur Apple en fait)...

Et le contournement du checksum... trop classe : simplicité, efficacité (et là encore EA pas bien malin en apparence mais à leur décharge, ils leur fallaient bien faire un truc qui soit rapide et qui ne prenne pas non plus 1 heure à s'éxécuter...)

A propos, toute petite erreur de typo :
"$A000 : 4C 69 A0 A0 20 88 (4C + 64 = B5)" <- 4C + 69 = B5

En tout cas, blk, on en veut encore ! Bravo !

PS : Coïncidence, je me suis battu tout l'aprem avec Marble Madness, pas pour le cracker mais juste pour que le jeu (original) se lance !
Visiblement la disquette a un petit souci Sad
Et il me semble bien à l'oreille, que la protection doit être dans le même genre. Y compris le coup du ctrl+reset avec le bip particulier. Je vérifie demain (sinon je vais réveiller tout le monde là vu le boucan du drive !)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Dim 03 Juil 2011, 8:35    Sujet du message: Répondre en citant

Super, bravo ! Le coup du checksum est excellent.

Tu t'es confronté au célebre track-arcing d'electronic arts noyé au fond de leur M-Code, langage interprété pouvant mélanger leur code et du 6502.

J'en parle dans un thread lointain sur The seven cities of gold, http://www.hackzapple.com/phpBB2/viewtopic.php?t=63

Antoine
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Dim 03 Juil 2011, 8:39    Sujet du message: Répondre en citant

Smile
Arf, bien vu la pétouille !
J'ai corrigé.

A la différence du x86, sur apple II, y'avait pas trop de mode 'step' inclus au 6502, donc pas vraiment de Softice ou équivalent pour tracer en pas à pas... du coup, le code vraiment tordu devenait bien bien rock'n roll à comprendre Wink...
L'imprimante, ça aidait, mais là, j'ai pas le courage de la ressortir.
Very Happy

@toinet...
du M-Code ?.... ça me rappelle vaguement quelque chose.... ça avait dû faire jaser à l'époque...
Merci pour le lien, je vais jeter un oeil ^^
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Archange427



Inscrit le: 01 Avr 2011
Messages: 535
Localisation: 92

MessagePosté le: Dim 03 Juil 2011, 9:23    Sujet du message: Répondre en citant

@blk : ah oui sur Apple II, tout se fait (ou se faisait plutôt) en "dead listing" forcément... Et effectivement quand le code est alambiqué, migraine assurée. D'où une nouvelle fois, toute l'intelligence de ton astuce pour shunter tout ça Smile
C'est vrai que sur Apple, on peut aussi cracker à l'oreille Wink

@toinet : sur GS il n' y a pas possibilité de suivre instruction par instruction ce qui se passe dans la partie "émulation Apple II" ?

C'est aussi pour ça que j'aime bien AppleWin, rien que pour sa partie debug !
Mais évidemment, aucune utilité pour le crack d'originaux ça c'est sûr !
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Dim 03 Juil 2011, 9:32    Sujet du message: Répondre en citant

Sur GS, il y a deux modes : le Step et le Trace
je ne les ai jamais utilisés pour un crack, c'est probablement utile,

av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Archange427



Inscrit le: 01 Avr 2011
Messages: 535
Localisation: 92

MessagePosté le: Dim 03 Juil 2011, 9:59    Sujet du message: Répondre en citant

STEP et TRACE (si on parle bien de la même chose) existaient déjà sur l'Apple II d'origine.
C'est avec la ROM Autostart qu'elles ont dégagé visiblement (pour faire de la place ?) sur II+ et ensuite sur IIe.

Elles sont par contre réapparues sur l'Apple IIc (je viens de vérifier sur un ROM4, elles sont bien là).

Mais bizarrement, on ne les trouve pas non plus sur les IIe 65C02 Enhanced...

D'ailleurs ça pourrait être sympa de se faire une ROM perso en les ré-implémentant....
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Dim 03 Juil 2011, 10:32    Sujet du message: Répondre en citant

Excellent ton lien toinet ! C'est pile poil le même code ! mêmes adresses etc... je vois que tu ne l'as pas abordé en mode 'feignasse', comme moi... et que tu as plutôt cherché à dépiauter le bousin.... chapeau !


@Archange427 : Il me semble bien qu'il existait quelques traceurs sur appleII... peut-être même dans Locksmith ?..
Pour le IIgs, je n'y connais rien (j'ai lâché le monde apple en 1987 et le seul que j'ai approché à l'époque fut, je crois, chez Godfather).
Quoiqu'il en soit, ces traceurs n'avaient rien à voir avec avec la souplesse et l'efficacité d'un debugger système "ring0" en x86....
Rolling Eyes
N'empêche qu'on se marrait bien quand même Very Happy
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com