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 

POOYAN - (Datasoft-Konami, 1983)

 
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: Ven 15 Juil 2011, 22:05    Sujet du message: POOYAN - (Datasoft-Konami, 1983) Répondre en citant

Hello !

Antony a eu la gentillesse de me prêter récemment plein de softs originaux, alors j'en profite pour recommencer mes posts..
Voici le début du crack (en cours) de Pooyan, mon jeu (en arcade) préféré.
Si la version apple n'est pas à la hauteur de l'arcade à cause d'une maniabilité un chouilla bizarre, la protection est néanmoins super sympa.
Voici donc les premières investigations :

- copie au locksmith 5.0 rapide impossible... pas un secteur ne passe.
:'(

- après vérification avec Nibbles Away ][, on peut voir que :
* des marqueurs ont été changés (sur la piste $00 seulement...).
* les pistes $01 à $0F sont dans un format très spécial (encodage 4&4)... ça se repère facilement car les nibbles lus ne sont jamais inférieurs à #$AA
* les pistes $10 à $22 ne sont même pas formatées.

L'objectif premier et de faire une copie de "travail" afin de pouvoir lire / modifier les secteurs du bootstrap.

Pour les pistes $01 à $0F, rien à faire, il faut les copier pour le moment avec E.D.D. III. Ca passe impeccable.
Pour la piste $00, il suffit d'utiliser Advanced Demuffin avec une RWTS très légèrement modifiée :
$B991:CC (à la place de $DE)
Demuffin fait très bien la conversion.

Cette conversion est nécessaire car si l'on copie avec EDDIII la piste $00, le jeu se lance, mais il sera impossible de lire / modifier les secteurs sur cette piste, du coup, c'est pas cool.

C'est parti pour un boot tracing...
Very Happy
Code:

]CALL-151
*9600<C600.C6FFM
*96F8:0
*9600G

----BIP-----
96FA-    A=01 X=60 Y=00 P=31 S=DC
*801L

0801-   74          ???      
0802-   85 B0       STA   $B0
0804-   58          CLI   
0805-   6A          ROR   
0806-   EA          NOP   
0807-   73          ???   
0808-   4B          ???   
0809-   CD 53 CA    CMP   $CA53
080C-   C8          INY   
080D-   42          ???   
080E-   1A          ???   
080F-   3D 63 93    AND   $9363,X
0812-   53          ???   
0813-   4B          ???   
0814-   0A          ASL   
0815-   47          ??? 


Là, le piratin occasionnel commence à se gratter le cuir chevelu, c'est vraiment excellent !

Le premier opcode est l'un des fameux opcodes non documentés, c'est un DOP (non, pas le savon)... il agit comme un double NOP.
ce qui donne en fait :
Code:
0801-   EA          NOP
0802-   EA          NOP
0803-   B0 58       BCS   $085D   <<-- saut en fait inconditionnel
0805-   6A          ROR   
0806-   EA          NOP   
0807-   73          ???      << à partir d'ici, c'est encodé....
0808-   4B          ???   
0809-   CD 53 CA    CMP   $CA53
080C-   C8          INY   


Voici la routine en $085D
Code:
085D-   A9 CA       LDA   #$CA      <-- Valeur de décodage
085F-   8D 9D 08    STA   $089D      <-- automodifie le code
0862-   B0 31       BCS   $0895      <-- en fait, saut inconditionnel vers [youpi]....
--------------------------------------
0864-   24 B5       BIT   $B5
0866-   CD 24 B5    CMP   $B524
0869-   CD 6C E1    CMP   $E16C
.
bla bla
.
0890-   1A          ???   
0891-   3E 86 CA    ROL   $CA86,X
0894-   0C          ???   
------------------------------------- [youpi]
0895-   8A          TXA   
0896-   48          PHA   
0897-   A0 98       LDY   #$98
0899-   B9 00 08    LDA   $0800,Y   <-- prends les valeurs de $800 à $898
089C-   49 AA       EOR   #$AA      <-- non, non, c'est en fait un EOR #$CA qui décode...
089E-   99 00 07    STA   $0700,Y   <-- stocke le tout en $700 (erf, pas cool, c'est la page text !)
08A1-   88          DEY   
08A2-   D0 F5       BNE   $0899
08A4-   68          PLA   
08A5-   4A          LSR   
08A6-   4A          LSR   
08A7-   4A          LSR   
08A8-   4A          LSR   
08A9-   99 81 C0    STA   $C081,Y
08AC-   09 C0       ORA   #$C0      <<--   important, ces deux instructions stockent en $3F l'adresse haute
08AE-   85 3F       STA   $3F         de la routine de boot de la carte contrôleur ($C6 chez moi...)
08B0-   8D 94 07    STA   $0794      <<--   ... on la met en $0794 aussi ^^

08B3-   4C 05 07    JMP   $0705      <-- saute à la routine relogée...


Voici la routine relogée en page text et décodée :

Code:

routine décodée et relogée
-------------------------------------
Relogeage et revectorisation du reset
-------------------------------------
$0705 : A0 20      LDY #$20   <<-- reloge la routine de gestion du reset
$0707 : B9 81 07   LDA $0781,Y
$070A : 99 00 02   STA $0200,Y   <<-- dans le buffer clavier (saligaud !)
$070D : 88         DEY
$070E : D0 F7      BNE $0707
$0710 : A9 00      LDA #$00   <<-- revectorise
$0712 : 99 81 C0   STA $C081,Y
$0715 : 8D F2 03   STA $03F2   <<-- le reset en $0200
$0718 : 8D FC FF   STA $FFFC
$071B : A9 02      LDA #$02   << hop
$071D : 8D F3 03   STA $03F3
$0720 : 8D FD FF   STA $FFFD
$0723 : A9 A7      LDA #$A7   << hop (remplace le EOR (déjà calculé))
$0725 : 8D F4 03   STA $03F4

--------------------------------------
vidage (mais pas vraiment) de la page
du 1er secteur de boot...
--------------------------------------
$0728 : A9 40      LDA #$40   <<--    valeur qui vide la page $08
$072A : A0 00      LDY #$00      /!\ à retenir, on ne remplit pas la page avec #$00
$072C : 99 00 08   STA $0800,Y      et ce n'est pas pour rien ! (#$40, c'est l'opcode de RTI !)
$072F : 88         DEY
$0730 : D0 FA      BNE $072C
------------------------- fin vidage page $08

$0732 : 99 80 C0   STA $C080,Y
$0735 : A9 5C      LDA #$5C   <<-- fabrique l'adresse $C65C
$0737 : C8         INY      <<-- Y = 1
$0738 : 85 3E      STA $3E      <<-- ayé, adresse basse ok
$073A : 8C 00 08   STY $0800   <<-- $0800 = 1 maintenant... (important)

----------------------------------
adresse de retour
----------------------------------
$073D : AC 80 07   LDY $0780   <<-- $780 == 02 (nb de secteurs encore à charger)
$0740 : F0 22      BEQ $0764   <<-- saute à $0764 s'ils sont chargés...
$0742 : A9 07      LDA #$07   <<-- empile tranquillos une partie de l'adresse de retour ($073D)
$0744 : 48         PHA      <<-- hop ! ni vu ni connu.... ^^
$0745 : B9 6F 07   LDA $076F,Y   <<-- en $076F+2 se trouve le n° du prochain secteur à charger (s:$0B qui est en fait le secteur 2)
$0748 : 85 3D      STA $3D      <<-- le passe en paramètre...........
$074A : CE 80 07   DEC $0780   <<-- comme on va charger un secteur, on diminue le nb restant à charger
$074D : AD 7F 07   LDA $077F   <<--    en $077F se trouve l'adresse haute du buffer de
$0750 : 85 27      STA $27      <<--   chargement du prochain secteur (chargé en $0500)
$0752 : A9 3D      LDA #$3D   <<-- empile tranquillos la 2eme partie de l'adresse de retour ($073D)
$0754 : 48         PHA      <<-- hop ! ni vu ni connu.... ^^
$0755 : CE 7F 07   DEC $077F   <<-- la suite sera chargée en $0400 ($077F est décrémenté)
$0758 : 98         TYA      <<-- A == 1
$0759 : 48         PHA      <<-- empile pour équilibrer le retour d'interruption...
$075A : 6C 3E 00   JMP ($003E)   <<-- saute en $C65C (dans la carte contrôleur disque)
.
.
.
--------------------------------------------------------
Une fois les deux secteurs suivants chargés on saute ici
--------------------------------------------------------
$0764 : EE 7F 07   INC $077F
$0767 : EE 7F 07   INC $077F
$076A : A6 2B      LDX $2B
$076C : 4C 84 04   JMP $0484   <<-- le bon gros saut en page TEXT...

-------------------------------------------------------------------------------
micro-table des secteurs à charger (d'abord $0B en $0500, puis $0D en $0400)
ces secteurs ($0B et $0D) sont les secteurs logiques correspondants aux
secteurs PHYSIQUES $01 et $02
-------------------------------------------------------------------------------
$076F : 00         BRK
$0770 : 0D 0B 09   ORA $090B



Là le piratin occasionnel est un peu (beaucoup) perdu... l'appel en $C65C charge certes un secteur, mais la routine se finit par le traditionnel :
JMP $0801.
Cette routine va donc charger des données en $0500, et malgré tout démarrer le code en $0801...
Souvenez-vous que le vidage de cet espace mémoire a été fait avec des valeurs #$40. C'est l'opcode de l'instruction RTI, qui va dépiler 3 octets et effectuer un branchement sur 2 des 3 valeurs reprises sur la pile (en l'occurrence, cette routine empile l'adresse $073D).

On a donc là une routine qui utilise une sous-routine du contrôleur pour charger le secteur 2 en $0500 et ensuite, se rappelle elle même via un retour d'interruption appelé par la carte contrôleur pour charger le secteur 1 en $0400, puis exécuter ceci :
Code:

---------------------------------------
POINT D'ENTREE
---------------------------------------
$0484 : A9 5F      LDA #$5F   <<-- **** point d'entrée ****
$0486 : 48         PHA      <<-- début de "pushage" de l'adresse finale de retour ($5FFF+1 = $6000)
$0487 : 8D 50 C0   STA $C050
$048A : 8D 57 C0   STA $C057   << passage en HGR1
$048D : A9 0D      LDA #$0D
$048F : 8D 52 C0   STA $C052
$0492 : 8D 55 C0   STA $C055   << passage en HGR2 via un STA (inhabituel)
$0495 : 85 FE      STA $FE      <<-- important : adresse haute du buffer de lecture des pistes (l'adresse sera $0D00)
$0497 : A6 2B      LDX $2B      << $2B = slot 6
$0499 : BD 89 C0   LDA $C089,X   << allumage moteur
----------------------------------------
$049C : A0 20      LDY #$20
$049E : B9 86 07   LDA $0786,Y   << relogeage routine RESET
$04A1 : 99 00 02   STA $0200,Y
$04A4 : 88         DEY
$04A5 : 10 F7      BPL $049E
----------------------------------------
  $F7+$F8 contiennent l'adresse $0CB4
    $FD = #$00 |  $2B = #$60 | Y=0
----------------------------------------
$04A7 : A9 B4      LDA #$B4
$04A9 : 85 F7      STA $F7
$04AB : A0 00      LDY #$00
$04AD : 84 FD      STY $FD
$04AF : 86 2B      STX $2B
$04B1 : A9 0C      LDA #$0C
$04B3 : 85 F8      STA $F8
----------------------------------------
$04B5 : 99 81 C0   STA $C081,Y   
$04B8 : A9 02      LDA #$02
$04BA : 8D F3 03   STA $03F3
$04BD : A9 00      LDA #$00
$04BF : 8D F2 03   STA $03F2
$04C2 : A9 A7      LDA #$A7
$04C4 : 8D F4 03   STA $03F4   << revecto reset en $0200
----------------------------------------
$04C7 : A9 FF      LDA #$FF
$04C9 : 48         PHA      <<-- fin de "pushage" de l'adresse finale de retour ($5FFF+1 = $6000)
-------------------------BOUCLE
$04CA : AD 60 05   LDA $0560   << A<=0
$04CD : 18         CLC
$04CE : 69 02      ADC #$02   << A<=2
$04D0 : 20 00 04   JSR $0400   <<-- avance d'une piste (bouge le bras) ?
$04D3 : 20 00 05   JSR $0500   <<-- charge la piste entière
$04D6 : C6 F8      DEC $F8
$04D8 : D0 F0      BNE $04CA   << boucle si toutes les pistes ne sont pas chargées..
$04DA : BD 88 C0   LDA $C088,X   << éteint le moteur
$04DD : 60         RTS      << devrait sauter en $6000.... ;) on remplace ce RTS pas un JMP $FF59 et on a la main.

-----------------------------------
Déplacement bras etc...
-----------------------------------
$0400 : 85 FA      STA $FA      <<-- $FA <= 2
$0402 : CD 60 05   CMP $0560   <<-- égal 0 ?
$0405 : F0 53      BEQ $045A   <<-- si oui, saut FINI
-------------------------------------
$0407 : A9 00      LDA #$00   <<-- sinon pas fini
$0409 : 85 FC      STA $FC
$040B : AD 60 05   LDA $0560
$040E : 85 FB      STA $FB
$0410 : 38         SEC
$0411 : E5 FA      SBC $FA
$0413 : F0 33      BEQ $0448
$0415 : B0 07      BCS $041E
$0417 : 49 FF      EOR #$FF
$0419 : EE 60 05   INC $0560
$041C : 90 05      BCC $0423
$041E : 69 FE      ADC #$FE
$0420 : CE 60 05   DEC $0560
$0423 : C5 FC      CMP $FC
$0425 : 90 02      BCC $0429
$0427 : A5 FC      LDA $FC
------------------------------------
$0429 : C9 0C      CMP #$0C
$042B : B0 01      BCS $042E
$042D : A8         TAY
$042E : 38         SEC
$042F : 20 4C 04   JSR $044C   <<-- bouge le bras
$0432 : B9 6C 04   LDA $046C,Y
$0435 : 20 5B 04   JSR $045B   <<-- appel temporisation
$0438 : A5 FB      LDA $FB
$043A : 18         CLC
$043B : 20 4F 04   JSR $044F   <<-- bouge le bras
$043E : B9 78 04   LDA $0478,Y
$0441 : 20 5B 04   JSR $045B   <<-- appel temporisation
$0444 : E6 FC      INC $FC
$0446 : D0 C3      BNE $040B
----------------------------------
$0448 : 20 5B 04   JSR $045B   <<-- appel temporisation
$044B : 18         CLC
----------------------------------
$044C : AD 60 05   LDA $0560
$044F : 29 03      AND #$03
$0451 : 2A         ROL
$0452 : 05 2B      ORA $2B      <<-- l'adresse $2B contient le n° de slot
$0454 : AA         TAX
$0455 : BD 80 C0   LDA $C080,X   <<-- bouge ton bras, petit diskII
$0458 : A6 2B      LDX $2B

--------------------------------FINI
$045A : 60         RTS
--------------------------------

--------------------------------
Temporisation
--------------------------------
$045B : A2 11      LDX #$11
$045D : CA         DEX
$045E : D0 FD      BNE $045D
$0460 : E6 46      INC $46
$0462 : D0 02      BNE $0466
$0464 : E6 47      INC $47
$0466 : 38         SEC
$0467 : E9 01      SBC #$01
$0469 : D0 F0      BNE $045B
$046B : 60         RTS
---------------------------------

--------------------------------------------
Lecture et décodage d'une piste complète
--------------------------------------------
$0500 : A9 0C      LDA #$0C
$0502 : 85 FF      STA $FF
$0504 : E6 4E      INC $4E
$0506 : D0 02      BNE $050A
$0508 : E6 4F      INC $4F
$050A : BD 89 C0   LDA $C089,X   << allumage
------------------------------------
en-tête
------------------------------------
$050D : A0 00      LDY #$00
$050F : BD 8C C0   LDA $C08C,X
$0512 : 10 FB      BPL $050F
$0514 : C9 CB      CMP #$CB   << cherche un en-tête (juste après les octets de synchro) : [CB DA FC FF B4]
$0516 : D0 E8      BNE $0500
$0518 : BD 8C C0   LDA $C08C,X
$051B : 10 FB      BPL $0518
$051D : 49 DA      EOR #$DA
$051F : D0 DF      BNE $0500
$0521 : BD 8C C0   LDA $C08C,X
$0524 : 10 FB      BPL $0521
$0526 : C9 FC      CMP #$FC
$0528 : D0 D6      BNE $0500
$052A : BD 8C C0   LDA $C08C,X
$052D : 10 FB      BPL $052A
$052F : C9 FF      CMP #$FF
$0531 : D0 CD      BNE $0500
$0533 : BD 8C C0   LDA $C08C,X
$0536 : 10 FB      BPL $0533
$0538 : C9 B4      CMP #$B4
$053A : D0 C4      BNE $0500
------------------------------------
décodage piste
------------------------------------
$053C : BD 8C C0   LDA $C08C,X   << lecture nibble
$053F : 10 FB      BPL $053C
$0541 : 2A         ROL      << roule mon pote (typique 4&4)
$0542 : 85 F6      STA $F6      << demi-octet temporaire
$0544 : BD 8C C0   LDA $C08C,X   << lecture nibble suivant
$0547 : 10 FB      BPL $0544
$0549 : 25 F6      AND $F6      << octet complété
$054B : 91 FD      STA ($FD),Y   << le stocker dans l'adresse qui se trouve à $FD+$FE + Y ($0D00 et plus)
$054D : C8         INY
$054E : D0 EC      BNE $053C   << remplit une page de RAM avec 256 octets
----------------------------------
$0550 : BD 8C C0   LDA $C08C,X
$0553 : 10 FB      BPL $0550
$0555 : 38         SEC
$0556 : E6 FE      INC $FE      << page de RAM suivante pour la suite ($0E00)
$0558 : C6 FF      DEC $FF      << fini ?
$055A : D0 E0      BNE $053C   << non...
$055C : 60         RTS      << si oui, OK on revient.
$055D : 4C 84 04   JMP $0484


Bon, en gros, ce soft charge des pistes "complètes" faites d'un GROS secteur encodé en 4&4, puis, comme l'a dit Antoine, il réside ensuite en RAM... ce qui fait qu'on va pouvoir le "dumper" sur un disque dos 3.3 normal.

Enfin, j'ai détaillé un peu le tout pour le fun, mais ça n'est pas du tout nécessaire de le comprendre pour cracker Pooyan.

Cette protection contre le tracé de boot, c'est un peu comme blinder sa porte en laissant les fenêtres ouvertes O_O....
Parce qu'on n'a pas besoin de tracer le boot, sauf pour s'amuser ^^
En effet, si l'on a pris soin de passer le track 0 à Demuffin (et seulement si on l'a fait !), on peut lire la routine de chargement directement sur les 2 premiers secteurs avec copy II+ 5.0... et modifier le RTS qui saute en $6000 pour y mettre un JMP $FF59 qui va nous donner la main une fois le tout chargé en RAM.
Very Happy

Il me reste à dumper le tout et peut-être un peu comprendre comment ça démarre.... je reviens une fois que ce sera fait.
_________________
hin hin ^^


Dernière édition par blk le Dim 17 Juil 2011, 13:01; édité 2 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


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

MessagePosté le: Sam 16 Juil 2011, 0:00    Sujet du message: Répondre en citant

j'peux l'avoir, j'peux l'avoir ?
av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
amauget



Inscrit le: 06 Déc 2009
Messages: 962
Localisation: Nantes

MessagePosté le: Sam 16 Juil 2011, 6:36    Sujet du message: Répondre en citant

Hello,

C'est tout simplement excellent et ça à l'air tellement facile Laughing

@toinet : of course !
_________________
Antony
Apple II forever
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


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

MessagePosté le: Sam 16 Juil 2011, 7:40    Sujet du message: Répondre en citant

Ca sent quand même le soft qui va être vachement protégé en mémoire parce qu'il se charge en une seule fois.

Je parie qu'il va y avoir du code pour virer les wildcards et autres cartes d'interruptions !

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: Sam 16 Juil 2011, 9:21    Sujet du message: Répondre en citant

Bon moi, c'est décidé je ne mets plus les pieds dans cette section !
toinet et blk sont en train de tout re-cracker avec moult explications et détails...
On va avoir l'air de quoi quand on va s'y attaquer nous après ?! Wink

(good job guys !)
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: Sam 16 Juil 2011, 12:41    Sujet du message: Répondre en citant

Eheh...
Post n°1 complété.... mais pas fini.

Bien vu toinet Very Happy
En effet, c'est un jeu qui se charge entièrement en RAM et qui n'accède plus au disque, ce qui lui permet d'avoir un chargement bien barbare et pas conventionnel (pas besoin de DOS ensuite).
Smile
a+
blk
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
blk



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

MessagePosté le: Sam 16 Juil 2011, 17:05    Sujet du message: Répondre en citant

Hello ^^
Double post dans lequel je vous mets la suite...
:-°

lorsqu'on reprend la main en mode "moniteur", et qu'on lance le jeu en $6000 manuellement, il plante... voici pourquoi :
Code:

$6000 : 20 89 FE   JSR $FE89  <<-- SetKBD
$6003 : 20 93 FE   JSR $FE93  <<-- setVID
$6006 : 20 CB 7B   JSR $7BCB  <<-- routine de 'relogeage' 1
$6009 : 20 7B 81   JSR $817B  <<-- routine de 'relogeage' 2
$600C : A9 03      LDA #$03
$600E : 8D FF 0D   STA $0DFF
$6011 : 8D FE 0D   STA $0DFE
$6014 : A9 00      LDA #$00
$6016 : A2 17      LDX #$17
$6018 : 9D 70 0F   STA $0F70,X
$601B : CA         DEX
$601C : 10 FA      BPL $6018
$601E : A2 01      LDX #$01
$6020 : 8E 84 0F   STX $0F84
$6023 : 8E 85 0F   STX $0F85
$6026 : BD AF 84   LDA $84AF,X
$6029 : 8D 80 0F   STA $0F80
$602C : 8D 81 0F   STA $0F81
$602F : A9 04      LDA #$04
$6031 : 8D 82 0F   STA $0F82
$6034 : A9 FF      LDA #$FF
$6036 : 85 5F      STA $5F
$6038 : 8D 83 0F   STA $0F83
$603B : A9 00      LDA #$00
$603D : 85 54      STA $54
$603F : 85 A3      STA $A3
$6041 : 85 A4      STA $A4
$6043 : 85 52      STA $52
$6045 : 8D 86 0F   STA $0F86
$6048 : 8D 87 0F   STA $0F87
$604B : 85 9D      STA $9D
$604D : 85 93      STA $93
$604F : 8D 10 C0   STA $C010
$6052 : 20 9C 81   JSR $819C  <<-- !!! charge l'image de présentation !!! (en utilisant les routines en $400 et $500, qui évidemment ne sont plus là puisqu'elles étaient en page text). cet écran de présentation permet de choisir 1 ou 2 players...
$6055 : 20 49 81   JSR $8149
$6058 : AD 54 C0   LDA $C054
$605B : AD 52 C0   LDA $C052
$605E : 4C 64 60   JMP $6064 <<-- démarre le jeu


Alors, comment faire ?
Comme ça :
]CALL -151
*800 : CC
*801<800.BFFFM
(remplit la mémoire d'octets reconnaissables ($CC))
*6 (+CTRL P) avec le jeu (modifié préalablement pour "breaker" tout seul) dans le drive.

***BIP***
*800.BFFF
(fait défiler la RAM et permet de savoir quelle étendue de RAM est concernée)...
on sait que le soft a chargé des données de $0D00 à $9D00, ce qui ne peut pas être sauvegardé en une fois....
:/
tant pis, on met une disquette dos 3.3 vide dans le drive, puis :
*6 (+CTRL P) pour rebooter et charger le DOS

]BSAVE POO1,A$D00,L$7000

]BSAVE POO2,A$7D00,L$2000

C'est bon, mais on n'a pas encore la page graphique "de garde"...
Il faut rebooter le jeu original, puis ouvrir le drive et faire un simple CTRL+RESET lorsque cette page s'affiche....
Le disque reboot sans abîmer la page. Insérer la disquette dos 3.3 et faire un simple :
]BSAVE IMAGE,A$2000,L$2000.

On a maintenant tous les éléments pour modifier les routines de 'relogeage' afin de gagner de la place et avoir notre image de garde en $2000.
Il sera aussi nécessaire de coder une petite routine qui sauve cette image (détruite par le jeu qui utilise les pages HGR1 et HGR2) autre part en RAM et la remet en $2000 lors de l'écran de sélection du nombre de joueurs.
En l'état actuel, il me semble impératif d'utiliser l'extension RAM des 64Ko pour loger cette image...
Du coup, le jeu ne sera plus jouable sur un simple apple II 48ko.
:'(
C'est grave, ou bien ça compte quand même ?
Si vous avez une meilleure solution, je prends volontiers ^^
Very Happy

----------------
Suite et FIN
----------------
Voilà c'est fait. Je résume donc :
Une fois vos deux fichiers dispos sur la disquette dos 3.3, il suffit de faire :
]BLOAD POO1
]BLOAD POO2
]CALL-151
*817C: 50 <--- modifie l'origine des données à reloger (en $5000)
Ensuite, pour libérer la page graphique, on reloge la partie $2000-$2700 en $5000 comme ceci :
*5000<2000.2700M

Il reste à charger la page graphique de pooyan, en $2000 par :
*BLOAD IMAGE

Ensuite, entrer en mode moniteur le petit programme suivant :
Code:

*819C : A9 00 8D 83
*81A0 : C0 8D 83 C0 CD F4 03 F0 13 8D F4 03 A9 D0 8D D9
*81B0 : 81 A9 20 8D D6 81 20 D0 81 4C C9 81 A9 D0 8D D6
*81C0 : 81 A9 20 8D D9 81 20 D0 81 8D 82 C0 8D 54 C0 60
*81D0 : A2 00 A0 20 BD 00 FF 9D 00 FF CA D0 F7 EE D6 81
*81E0 : EE D9 81 88 D0 EE 60


Ce qui donne ceci, en clair :
Code:

-----------------------------------
Routine qui remplace le chargement
     de l'image de Pooyan
-----------------------------------
$819C : A9 00      LDA #$00
$819E : 8D 83 C0   STA $C083   <- prépare l'extension RAM
$81A1 : 8D 83 C0   STA $C083   <- faut le faire 2 fois... >_<"
$81A4 : CD F4 03   CMP $03F4   <- d'une pierre 2 coups, ça sert à savoir si la copie a déjà été faite vers la carte langage ($03f4 à 0) et ça permet d'avoir un reset qui reboote au lieu de bloquer l'apple.
$81A7 : F0 13      BEQ $81BC   <- saute à recopie de $D000 vers $2000

----recopie de $2000 vers $D000----
- cette routine n'est appelée que -
-       la première fois          -
$81A9 : 8D F4 03   STA $03F4   <- flag qui dit que la recopie vers la carte langage est faite
$81AC : A9 D0      LDA #$D0   <- adresse de destination
$81AE : 8D D9 81   STA $81D9
$81B1 : A9 20      LDA #$20   <- adresse de source
$81B3 : 8D D6 81   STA $81D6
$81B6 : 20 D0 81   JSR $81D0   <-- COPIE
$81B9 : 4C C9 81   JMP $81C9   <-- saute vers FIN

----recopie de $D000 vers $2000---
$81BC : A9 D0      LDA #$D0   <-- source
$81BE : 8D D6 81   STA $81D6
$81C1 : A9 20      LDA #$20   <-- destination
$81C3 : 8D D9 81   STA $81D9
$81C6 : 20 D0 81   JSR $81D0   <-- COPIE

------------------FIN------------
$81C9 : 8D 82 C0   STA $C082   <-- remet la carte langage en mode normal
$81CC : 8D 54 C0   STA $C054   <-- commute la page HGR1
$81CF : 60         RTS      <-- retour

---------------COPIE---------------
$81D0 : A2 00      LDX #$00
$81D2 : A0 20      LDY #$20
$81D4 : BD 00 FF   LDA $FF00,X   <-- source automodifée
$81D7 : 9D 00 FF   STA $FF00,X   <-- destination automodifiée
$81DA : CA         DEX
$81DB : D0 F7      BNE $81D4
$81DD : EE D6 81   INC $81D6
$81E0 : EE D9 81   INC $81D9
$81E3 : 88      DEY
$81E4 : D0 EE      BNE $81D4
$81E6 : 60         RTS


Pour sauvegarder le tout :
*BSAVE GOODPOOYAN,A$D00,L$7F00

un petit CTRL+C pour passer en BASIC et taper ce petit loader :
Code:

5  HOME
6  PRINT " " : REM DANS CE PRINT Y'A UN CTRL+G
7  INVERSE
10  PRINT " (K) COCHONOU CRACK BAND 2011 (EH OUAIS!)"
15  NORMAL : PRINT "PLEASE WAIT BECAUSE LE DOS 3.3 EST LENT"
17  PRINT "": PRINT "": PRINT "64KO IS ABSOLUMENT NEEDED FOR THIS CRACK"
20  PRINT " BLOADGOODPOOYAN" : REM DANS CE PRINT ON A UN CTRL+D AVANT LE BLOAD
25  POKE 49232,0: POKE 49239,0: POKE 49236,0
30  CALL 24576


Un INIT HELLO sur une disquette vierge, puis la recopie du fichier binaire "GOODPOOYAN" sur cette même disquette et le crack est fini !
Very Happy
\o/

L'image disque à downloader se trouve ICI :
http://download1351.mediafire.com/wwc4z719woug/5g7m5j178qujd8w/POOYAN-64K-CCB2011.zip
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


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

MessagePosté le: Dim 17 Juil 2011, 7:58    Sujet du message: Répondre en citant

Wouah ! le Cochonou Crack Band, quel honneur !

Tes explications me confortent dans mon opinion que le IIgs est la meilleure machine pour déplomber les softs : à la fin du chargement du jeu où toute la mémoire est remplie, je ferais 10/800<00/800.BFFFM et zou, le soft en mémoire...

Si je reçois un jour le soft, le but ne sera pas de refaire le crack que tu as bien expliqué mais de refaire les routines de load/save afin d'avoir une image "fidèle" à l'original. C'est ce que j'avais fait pour Moon Patrol (cf. http://www.brutaldeluxe.fr/crack/) pour lequel j'ai l'image de la base de départ du moon patrol qui a été enlevée sur les versions déplombées qui circulent.

Et comme tu l'as dit, Pooyan ne fonctionne plus sur 48 Ko et ça, c'est pas cool Smile C'est cher la RAM, non mais !

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 17 Juil 2011, 8:48    Sujet du message: Répondre en citant

mmm... perfectionnisme, quand tu nous tiens !
Laughing
_________________
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