|
|
IDENTIFICATION SERVEUR : 10.14.20.22 - CLIENT : 3.239.242.55 |
|
Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
blk
Inscrit le: 05 Sep 2007 Messages: 114 Localisation: Zimbabwé
|
Posté le: Dim 14 Aoû 2011, 12:36 Sujet du message: SkyFox (EOA - 1984) |
|
|
Bonjour !
Voici le crack de SkyFox, un jeu pour les TopGun dans l'âme...
C'est un Electronic Arts de 1984...
Tout d'abord, le passage au Locksmith rapide se présente très mal.... seules les pistes $00 $01 $02 et $05 passent.
En jetant un coup d'oeil avec un éditeur de nibbles, on peut voir que les pistes récalcitrantes (sauf la piste $04) ont seulement deux marqueurs modifiés :
- D5 BB CF à la place de D5 AA AD.
On remarque également que les pistes $05 et $06 sont formatées en secteurs "normaux" mais ces secteurs sont remplis uniquement avec d'inutiles "$B7" que je vois mal être des données exploitables (sauf pour une protection tordue ^^)...
Il nous faut une disquette qui passe au locksmith 5.0, donc, il nous reste à :
1 - formater une disquette vierge (avec le DOS 3.3 ou Copy][+5.0)
2 - copier les tracks 0 à 2 avec un copieur au choix (va pour disk muncher)
3 - copier les tracks 3 à 4 et 7 à $22 avec advanced demuffin en changeant les marqueurs D5 AA AD d'une RWTS normale en D5 BB CF.
Chez moi, je retourne au moniteur, puis :
*B8F1 : BB
*B8FC : CF
*800G <---- relance Demuffin
....et "convert disk" en choisissant les bons tracks
On oublie les tracks 5 & 6, qui apparemment, sont vilains.
Ayé ! on a une jolie disquette qui passe avec ADT.
Je signale que sur la disquette originale dont je dispose actuellement, le secteur $03 Track $22 ne passe pas... :/ peut-être un souci de démagnétisation ? Ce n'est pas très gênant de toute façon...
Bien entendu, le soft ne boote pas... pas de miracle -_-" ... on a quand même droit à l'écran de présentation suivi d'un joli plantage.
Le moment du fameux boot-tracing est venu...
Alors, boot-traçons...
*4600<C600.C6FFM
*46F8:4C 59 FF
*4600G
* BIP *
Code: |
0800- 05 <- 5 secteurs de chargés au boot
;******************************
; BOOT 0
;******************************
0801- 4C 04 08 JMP $0804
0804- A9 00 LDA #$00
0806- 8D F2 03 STA $03F2 ;RESET
0809- A9 C6 LDA #$C6
080B- 8D F3 03 STA $03F3 ;RESET
080E- 49 A5 EOR #$A5
0810- 8D F4 03 STA $03F4 ;RESET
0813- A9 00 LDA #$00
0815- 8D C7 09 STA $09C7 ; ErrorCount = 0
0818- AD E9 C0 LDA $C0E9 ; allumage moteur
081B- A9 B0 LDA #$B0 ; adresse d'implantation : $B000...
081D- 85 3E STA $3E
081F- A9 02 LDA #$02 ; Track 2
0821- 20 00 0C JSR $0C00 ; load TRACK
0824- A9 A0 LDA #$A0 ; adresse d'implantation : $A000
0826- 85 3E STA $3E
0828- A9 A8 LDA #$A8 ; ?
082A- 48 PHA ; biaise le retour au prochain RTS : retour en $A8.. ?
082B- A9 01 LDA #$01 ; track 1
082D- 20 00 0C JSR $0C00 ; load TRACK
0830- A9 05 LDA #$05
0832- 48 PHA ; Ah ah ! .... retour en $A805+1 = $A806 ?? ;)
0833- A9 00 LDA #$00 ; track 0
0835- 20 C8 09 JSR $09C8 ; RECALIBRE LE BRAS
0838- AD C7 09 LDA $09C7 ; erreur ?
083B- D0 C7 BNE $0804 ; ouaip, on recommence tout
083D- 4C 05 0A JMP $0A05 ; SAUT BOOT 1 ($A806) !!!!!!!!! via le RTS de la routine d'attente...
.
.
bla
.
.
.
;******************************
; LOAD TRACK
;******************************
0C00- 20 C8 09 JSR $09C8 ; seek - déplace le bras
0C03- A0 0F LDY #$0F
0C05- B9 48 0C LDA $0C48,Y
0C08- 18 CLC
0C09- 65 3E ADC $3E ; additionne l'offset RAM
0C0B- 99 58 0C STA $0C58,Y
0C0E- 88 DEY
0C0F- 10 F4 BPL $0C05
0C11- A6 2B LDX $2B ; slot ?
0C13- A9 60 LDA #$60 ; compteur d'essais
0C15- 85 40 STA $40
0C17- C6 40 DEC $40
0C19- F0 29 BEQ $0C44 ; trop d'essais ? alors ErrorCount +1
0C1B- 20 15 0A JSR $0A15 ; lecture entête ?
0C1E- B0 F7 BCS $0C17 ; en cas d'erreur, on boucle
0C20- A4 2D LDY $2D ; n° secteur trouvé sous la tête
0C22- B9 58 0C LDA $0C58,Y ; secteur déjà lu ?
0C25- F0 F0 BEQ $0C17 ; ok, déjà lu, on boucle
0C27- 85 45 STA $45 ; memHigh
0C29- A9 00 LDA #$00 ; 00
0C2B- 85 44 STA $44 ; dans memLow
0C2D- 20 02 09 JSR $0902 ; charger le secteur
0C30- B0 E5 BCS $0C17 ; si erreur, on recommence
0C32- A4 2D LDY $2D ; n° secteur
0C34- A9 00 LDA #$00 ; le désactive dans la table
0C36- 99 58 0C STA $0C58,Y ; hop !
0C39- A0 0F LDY #$0F
0C3B- B9 58 0C LDA $0C58,Y
0C3E- D0 D7 BNE $0C17 ; si toute la table n'est pas à 0, on continue
0C40- 88 DEY
0C41- 10 F8 BPL $0C3B
0C43- 60 RTS ; sinon, RETOUR !
0C44- EE C7 09 INC $09C7 ; errorcount +1
0C47- 60 RTS
;****** table des secteurs
0C48- 0F ???
0C49- 08 PHP
0C4A- 01 09 ORA ($09,X)
0C4C- 02 ???
0C4D- 0A ASL
0C4E- 03 ???
0C4F- 0B ???
0C50- 04 ???
0C51- 0C ???
0C52- 05 0D ORA $0D
0C54- 06 0E ASL $0E
0C56- 07 ???
0C57- 00 BRK
;---------------------------------------
; table d'implantation en RAM en fction de Y
0C58- 00 BRK
0C59- 00 BRK
0C5A- 00 BRK
0C5B- 00 BRK
0C5C- 00 BRK
0C5D- 00 BRK
0C5E- 00 BRK
0C5F- 00 BRK
0C60- 00 BRK
0C61- 00 BRK
0C62- 00 BRK
0C63- 00 BRK
0C64- 00 BRK
0C65- 00 BRK
0C66- 00 BRK
0C67- 00 BRK
;---------------------------------------
|
Le détail du chargement de la suite est sans importance, je n'ai rajouté la partie en $0C00 que pour son aspect *rigolo*. En effet, le fait de charger les secteurs à la louche, comme ils arrivent sous la tête de lecture est caractéristique des "fastboots" de l'époque... donc c'est marrant et ça explique pourquoi l'image de départ arrive à fond la caisse.
Ils faisaient les choses bien chez EOA !
Il faut maintenant modifier le secteur 0 piste 0, offset $3D pour changer ce JMP $0a05 en JMP $FF59
original : 4C 05 0A
modifié : 4C 59 FF
A ce stade, il est intéressant de bien regarder le code chargé en $A000 et $B000, ça peut toujours servir, par simple curiosité... et surtout, ça nous permettra de repérer la routine de lecture qui, souvenez-vous cherche des "D5 BB CF" à la place de "D5 AA AD". Il faut remettre les bons marqueurs si l'on veut que ça fonctionne un peu...
C'est fait, et au passage, j'ai vu de chouettes trucs... comme des routines qui aiment les "$B7" ! (remember ?)
Code: |
BC10- A9 00 LDA #$00
BC12- A4 45 LDY $45
BC14- 8D AE BC STA $BCAE
BC17- 8C AF BC STY $BCAF
BC1A- 38 SEC
BC1B- E9 54 SBC #$54
BC1D- B0 02 BCS $BC21
BC1F- 88 DEY
BC20- 38 SEC
BC21- 8D 96 BC STA $BC96
BC24- 8C 97 BC STY $BC97
BC27- E9 57 SBC #$57
BC29- B0 01 BCS $BC2C
BC2B- 88 DEY
BC2C- 8D 6F BC STA $BC6F
BC2F- 8C 70 BC STY $BC70
BC32- A0 20 LDY #$20
BC34- 88 DEY
BC35- F0 D7 BEQ $BC0E
BC37- AD EC C0 LDA $C0EC
BC3A- 10 FB BPL $BC37
BC3C- 49 D5 EOR #$D5
BC3E- D0 F4 BNE $BC34
BC40- EA NOP
BC41- AD EC C0 LDA $C0EC
BC44- 10 FB BPL $BC41
BC46- C9 BB CMP #$BB <-- Bingo ! (chercher avec Copy ][+5.0 la séquence : 10 FB C9 BB D0 F2 pour remettre ça en place)
BC48- D0 F2 BNE $BC3C
BC4A- EA NOP
BC4B- AD EC C0 LDA $C0EC
BC4E- 10 FB BPL $BC4B
BC50- C9 CF CMP #$CF
BC52- D0 E8 BNE $BC3C
BC54- A0 AA LDY #$AA
BC56- A9 00 LDA #$00
BC58- 85 4A STA $4A
BC5A- AE EC C0 LDX $C0EC
BC5D- 10 FB BPL $BC5A
BC5F- BD 00 BD LDA $BD00,X
|
Copy ][+ 5.0 nous trouve gentiment ça ici :
T$02 S$03 B$47 : BB (à remplacer par "AA")
même piste et secteur, mais au b$51 : CF (à remplacer par "AD")
Réécrire le Track 2 secteur 3... et c'est fait.
On vérifie que l'adresse a806 est bien le boot1 en rebootant. Au prompt du moniteur, un simple :
*A806G
... lance effectivement la suite du chargement... qui finit par se bloquer dans une boucle infinie... le plantage un peu "voyant" du début n'a plus lieu puisqu'on a modifié la routine de lecture afin de le rendre capable de lire ses propres secteurs... Il plante maintenant lors de la protection...
Voyons le boot 1 maintenant.
Code: |
*******************************
BOOT 1
*******************************
A806- A0 00 LDY #$00 ; Eh eh !
A808- 84 4C STY $4C
A80A- A9 20 LDA #$20
A80C- 85 4D STA $4D
A80E- A9 00 LDA #$00
A810- 91 4C STA ($4C),Y ; vide les pages $20 à $80
A812- C8 INY
A813- D0 FB BNE $A810
A815- E6 4D INC $4D
A817- 10 F7 BPL $A810
A819- 20 00 B0 JSR $B000 ; hin hin !
A81C- 4C 1F A8 JMP $A81F
A81F- A2 30 LDX #$30
A821- 20 2A AA JSR $AA2A ; hin hin 2 ! :D
A824- CA DEX
A825- 10 F8 BPL $A81F
;****** hin hin 2 !*******************
AA2A- A5 48 LDA $48
AA2C- 48 PHA
AA2D- 98 TYA
AA2E- 48 PHA
AA2F- 20 8E AA JSR $AA8E
AA32- 68 PLA
AA33- 85 46 STA $46
AA35- 68 PLA
AA36- 85 47 STA $47
AA38- A0 04 LDY #$04
AA3A- B1 46 LDA ($46),Y
AA3C- C8 INY
AA3D- D0 02 BNE $AA41
AA3F- E6 47 INC $47
AA41- AA TAX
AA42- BD 55 AA LDA $AA55,X
AA45- 18 CLC
AA46- 69 67 ADC #$67
AA48- 8D 53 AA STA $AA53
AA4B- A9 AA LDA #$AA
AA4D- 69 00 ADC #$00
AA4F- 8D 54 AA STA $AA54 ; bloquer ici ! et mater les adresses en AA52+AA53
AA52- 4C 67 AA JMP $AA67 ; voir le saut une fois décodé
;(JMP $AAD2 la première fois)
;(JMP $AAAD la 2eme fois)
;(JMP $AAAD la 3eme fois)
;(JMP $AABA la 4eme fois)
;(JMP $AABA la 5eme fois)
;(JMP $AA67 la 6eme fois)
;(JMP $AA69 la 7eme fois)
;(JMP $AA69 la 8eme fois)
;(JMP $AA69 la 7eme fois)
;(JMP $AA69 la 8eme fois)
;... la suite
AAD2- 20 77 AA JSR $AA77 ; décryptage zarbi
AAD5- A2 00 LDX #$00
AAD7- A1 42 LDA ($42,X)
AAD9- 85 48 STA $48
AADB- 4C 3A AA JMP $AA3A ; recalcule un nouveau saut... :/
AAAD- 85 48 STA $48
AAAF- 68 PLA
AAB0- A8 TAY
AAB1- 4C 3A AA JMP $AA3A ; encore !
AABA- 20 77 AA JSR $AA77
AABD- A5 48 LDA $48
AABF- F0 A9 BEQ $AA6A
AAC1- 4C 3A AA JMP $AA3A ; encore !
AA67- 20 77 AA JSR $AA77 ; // ou bien "TAX" si on appelle $AA69
AA6A- A5 42 LDA $42
AA6C- 85 46 STA $46
AA6E- A5 43 LDA $43
AA70- 85 47 STA $47
AA72- A0 00 LDY #$00
AA74- 4C 3A AA JMP $AA3A ; encore ! |
Bon, bref, c'est cuit pour le tracing à la main... On est encore en présence d'un pseudo-code interprété par une boucle infine. Si c'est le fameux M-code, je ne l'aime pas trop, et c'est trop long de tenter de voir comment c'est fait.
Adieu boot-tracing, changement d'attaque.
Le point d'attaque suivant est simple, puisque j'ai un peu examiné la RAM (aux points de chargement) et que j'y ai vu des trucs rigolos comme l'extrait ci-dessous qui ne cache pas sa nature un peu louche ^^ :
Code: |
A003- A0 20 LDY #$20
A005- 88 DEY
A006- F0 58 BEQ $A060
A008- AD EC C0 LDA $C0EC
A00B- 10 FB BPL $A008
A00D- 49 D5 EOR #$D5 <- D5
A00F- D0 F4 BNE $A005
A011- AD EC C0 LDA $C0EC
A014- 10 FB BPL $A011
A016- C9 AA CMP #$AA <- AA
A018- D0 F3 BNE $A00D
A01A- AD EC C0 LDA $C0EC
A01D- 10 FB BPL $A01A
A01F- C9 AD CMP #$AD <- AD, donc, les données suivent maintenant...
A021- D0 EA BNE $A00D
A023- 48 PHA
A024- 68 PLA
A025- A0 56 LDY #$56
A027- AD EC C0 LDA $C0EC
A02A- 10 FB BPL $A027
A02C- 2C 00 C0 BIT $C000
A02F- C9 B7 CMP #$B7 <- Oh ! $B7 !!!!
A031- D0 31 BNE $A064
A033- 88 DEY
A034- D0 F1 BNE $A027
A036- A0 00 LDY #$00
A038- AD EC C0 LDA $C0EC
A03B- 10 FB BPL $A038
A03D- 2C 00 C0 BIT $C000
A040- C9 B7 CMP #$B7 <- Ohhh !!!! pareil !
A042- D0 20 BNE $A064
A044- 88 DEY
A045- D0 F1 BNE $A038
A047- AC EC C0 LDY $C0EC
A04A- 10 FB BPL $A047
A04C- 48 PHA
A04D- 68 PLA
A04E- AD EC C0 LDA $C0EC
A051- 10 FB BPL $A04E
A053- C9 DE CMP #$DE
A055- D0 09 BNE $A060
A057- AD EC C0 LDA $C0EC
A05A- 10 FB BPL $A057
A05C- C9 AA CMP #$AA <-- finito
A05E- F0 02 BEQ $A062
A060- 38 SEC <-- pas glop !
A061- 60 RTS
A062- 18 CLC <-- glop glop !
A063- 60 RTS
|
J'ai glissé un petit JMP $FF59 en $A003 pour revenir au moniteur et voir ce que ça donnait, mais ...... ça n'a pas marché !
O_O"
pas de moniteur... au lancement par un A806G, le jeu charge, et se plante en boucle infinie...
Mmmmmm.... ça sent de nouveau le test d'intégrité en ram via EOR ou addition et qui plante le soft si l'on touche aux endroits cruciaux... donc, c'est bon signe, on est dans une routine importante ^^
Je vous passe les détails, mais en effet, c'est une routine de checksum (donc par addition) qui vérifie l'intégrité de la ram, il va falloir ruser en équilibrant la somme finale :
*A004:68 68 8D F0 B0 68 8D F1 B0 4C 59 FF FF
Ce patch garde intact le checksum et nous donne l'adresse de retour de cette routine en la stockant en $B0F0 et $B0F1.
On continue :
A806G
...... chargement...... * BIP ! * moniteur ! youpi !
* B0F0
B0F0- 67
A1 87 87 83........
Cette routine revient en $A167+1 = $A168... allons jeter un oeil.
Code: |
A15C- 18 CLC
A15D- A2 01 LDX #$01
A15F- 60 RTS
A160- 20 12 A1 JSR $A112
A163- B0 03 BCS $A168
A165- 20 03 A0 JSR $A003 <-- notre routine
A168- A9 00 LDA #$00 <-- 00 ? étrange... possible que ça se modifie...
A16A- 6D E2 A2 ADC $A2E2 <-- incrémente un compteur
A16D- 8D E2 A2 STA $A2E2 <-- remet la nouvelle valeur...
A170- AD E0 C0 LDA $C0E0
A173- AD E2 C0 LDA $C0E2
A176- AD E4 C0 LDA $C0E4
A179- AD E6 C0 LDA $C0E6
A17C- 60 RTS
|
Et si ce compteur étrange était un compteur d'erreurs liées à la protection ? Modifions-le afin qu'il ne restocke pas la valeur incrémentée au bon endroit, afin que l'adresse $A2E2 reste toujours à sa valeur d'origine.
Evidemment, ce code est protégé par un check en RAM comme le précédent...
Essayons ceci :
*A16F:F2
*A175:70
ce qui nous donne :
A16D- 8D E2 F2 STA $F2E2 <-- stockage en ROM : lol...
A170- AD E0 C0 LDA $C0E0
A173- AD E2 70 LDA $70E2 <-- ne change rien, ce switch est inutile
A176- AD E4 C0 LDA $C0E4
Ca empêche la modification de l'adresse $A2E2 et ça préserve le checksum en équilibrant les valeurs hexa. cool ^^
On teste, mais avant, allons voir l'adresse du reset en $3F2 et $3F3 (pour plus tard, la deuxième protection, vous verrez...)
*3F2- AA BF (donc, le reset est géré par une routine en $BFAA)
Allez, testons...
*A806G
\o/ Bingo ! Le jeu démarre... c'est la fête !
Vite, une modif sur le disque avec Copy ][+ 5.0... on cherche :
6D E2 A2 8D E2 A2
On trouve ça piste $01 secteur $0E
On change les deux octets suivants :
- T$01 S$0E B$6F : F2 à la place de A2
- T$01 S$0E B$75 : 70 à la place de C0
Et le jeu boote maintenant !. Il est quasi cracké... avec pour le moment 4 octets modifiés (sans compter le JMP $FF59 que l'on peut enlever piste 0 secteur 0) :
- les deux marqueurs
- le check de la protection (c'est chouette, on garde le son caractéristique de la vérif sur la copie ! j'adore ^^)
Reste à virer un second check vicieux que je développerai plus tard.
ps : ci-joint, le soft à cracker soi-même en .dsk
http://download35.mediafire.com/tzqpdq2k8szg/dtz37yi7auabh2d/SKYFOX_prot%C3%A9g%C3%A9.rar
---------------------
2eme partie...
Lorsqu'on démarre une partie, le drive s'allume, et il est suivi d'un beau reboot caractéristique du RESET appeulesque (genre $FA62) précédé d'une sorte de vidage mémoire. (on voit des sortes de AEAEAEAEAEAE plein l'écran text).
Ce reboot est totalement similaire au reboot lors d'un CTRL+reset fait à peu près au même moment (un peu avant)... Il est plus probable que ce soit la même routine qui gère les deux.
Le Reset est redirigé en $BFAA, comme on l'a vu (artificiellement) plus haut.
Du coup, cherchons les appels à cette routine sur la disquette avec Copy][+ 5.0
On trouve ça piste $0A secteur $02
byte F8 : 20 7D 67 JSR $677D <-- un petit RTS ici serait de bon aloi !
byte FB : 4C AA BF JMP $BFAA
Donc : T$0A S$02 B$F8 : 60 au lieu de 20
Et voilà, c'est définitivement cracké.
Il y a d'autres occurences de ce test, mais ça ne semble pas nécessaire de les modifier.
Donc, pour résumer le cracke en 5 octets modifiés :
- T$02 S$03 B$47 : AA
- T$02 S$03 B$51 : AD (les marqueurs)
- T$01 S$0E B$6F : F2
- T$01 S$0E B$75 : 70 (le premier test de la protection)
- T$0A S$02 B$F8 : 60 (le second test)
Voici la version crackée :
http://download1468.mediafire.com/f2latv88bb0g/00bukg0muvq74yu/SKYFOX_cracked.zip
Amusez-vous bien.
blk. _________________ hin hin ^^ |
|
Revenir en haut de page |
|
 |
toinet Site Admin
Inscrit le: 15 Juin 2007 Messages: 3062 Localisation: Le Chesnay, France
|
Posté le: Dim 14 Aoû 2011, 18:36 Sujet du message: |
|
|
Bravo méchant pirate!
On parle de ce soft sur comp.sys.apple2 en ce moment et on se demandait si les versions crackées que l'on connaissait étaient correctes.
En effet, joue avec le jeu, va dans les nuages. Si ton crack est OK, tu pourras continuer de jouer sinon... reboot...
Antoine |
|
Revenir en haut de page |
|
 |
blk
Inscrit le: 05 Sep 2007 Messages: 114 Localisation: Zimbabwé
|
Posté le: Dim 14 Aoû 2011, 18:54 Sujet du message: |
|
|
Ah ah !
super !
En effet, les nuages, c'est très rigolo ^^
Je vais corriger ça...
>_<" _________________ hin hin ^^ |
|
Revenir en haut de page |
|
 |
blk
Inscrit le: 05 Sep 2007 Messages: 114 Localisation: Zimbabwé
|
|
Revenir en haut de page |
|
 |
toinet Site Admin
Inscrit le: 15 Juin 2007 Messages: 3062 Localisation: Le Chesnay, France
|
Posté le: Dim 14 Aoû 2011, 21:38 Sujet du message: |
|
|
Congratulations, man!
Je vais le dire sur csa2
av |
|
Revenir en haut de page |
|
 |
toinet Site Admin
Inscrit le: 15 Juin 2007 Messages: 3062 Localisation: Le Chesnay, France
|
Posté le: Lun 15 Aoû 2011, 10:40 Sujet du message: |
|
|
csa2 a dit : ton crack ne fonctionne pas sur IIgs ! |
|
Revenir en haut de page |
|
 |
blk
Inscrit le: 05 Sep 2007 Messages: 114 Localisation: Zimbabwé
|
Posté le: Lun 15 Aoû 2011, 14:17 Sujet du message: |
|
|
normal, c'est pour les vrais apple
>_<"
ps : j'ai fait l'effort de tester sur un émulateur IIgs avec une rom01, ça marche très bien... alors, mystère ...
edit:
Je crois que le petit sacripant qui prétend que ça ne fonctionne pas ne le boote pas sur un slot 6
:/ _________________ hin hin ^^ |
|
Revenir en haut de page |
|
 |
|
|
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
|
|