Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.65 - CLIENT : 54.235.48.106

 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 

Sammy Lightfoot (Sierra On-Line, 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
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Ven 20 Nov 2015, 21:36    Sujet du message: Sammy Lightfoot (Sierra On-Line, 1983) Répondre en citant

This is a platform game with several levels, where you dodge balls, jump on trampolines, swing on rope, and even ride on a flying carpet!

The first protection check is noticable immediately - you can't start any level, it just reboots instead.
Since it happens right after it displays the level number, we can break to monitor and disassemble the code to look for "suspicious" calls.
And we find one fairly quickly:

Code:
6F6A-   20 00 96    JSR   $9600


a further disassembly shows us something even more suspicious:

Code:
9895-   CD 01 02    CMP   $0201
9898-   D0 01       BNE   $989B
989A-   F0 20       BEQ   $98BC
989C-   00          BRK
989D-   9E 20 26    STZ   $2620,X


what's that? Where's $989B? Ah, it's hidden by the false "BEQ".

Code:
989B-   20 00 9E    JSR   $9E00


and at $9E00, but which I had to move to $2E00...

Code:
2E00-   CE 03 9E    DEC   $9E03 ;decrement next instruction
2E03-   EF          ???   
2E04-   03          ???   
2E05-   9E          ???   


etc. Obviously, not the real code. When executed, the #$EF becomes #$EE, the INC instruction. It modifies itself back to the #$EF, but continues to run.

Code:
2E06-   AD 28 9E    LDA   $9E28
2E09-   49 8A       EOR   #$8A
2E0B-   D0 01       BNE   $2E0E
2E0D-   20 8D 28    JSR   $288D ;hidden instruction

2E0E-   8D 28 9E    STA   $9E28
2E11-   18          CLC   
2E12-   D0 01       BNE   $2E15 ;hidden instruction
2E14-   4C A0 29    JMP   $29A0

2E15-   A0 29       LDY   #$29
2E17-   98          TYA   
2E18-   90 01       BCC   $2E1B ;hidden instruction
2E1A-   20 59 00    JSR   $0059

2E1B-   59 00 9E    EOR   $9E00,Y
2E1E-   99 00 9E    STA   $9E00,Y
2E21-   C8          INY   
2E22-   D0 F3       BNE   $2E17
2E24-   88          DEY   
2E25-   30 01       BMI   $2E28 ;hidden instruction
2E27-   4C 60 E1    JMP   $E160

2E28-   60          RTS ;but modified to NOP on first pass by decoder
                        ;restored and used as RTS on second pass


and then there's this:

Code:
2E28-   EA          NOP   
2E29-   C8          INY   
2E2A-   8C F4 B7    STY   $B7F4
2E2D-   8C EC B7    STY   $B7EC
2E30-   A9 B7       LDA   #$B7
2E32-   A0 E8       LDY   #$E8
2E34-   20 B5 B7    JSR   $B7B5
2E37-   BD 89 C0    LDA   $C089,X
2E3A-   A9 05       LDA   #$05
2E3C-   8D 00 BB    STA   $BB00
2E3F-   20 90 9E    JSR   $9E90 ;read special data prologue
2E42-   10 01       BPL   $2E45 ;hidden instruction
2E44-   20 C8 C0    JSR   $C0C8

2E45-   C8          INY
2E46-   C0 30       CPY   #$30
2E48-   5D 8C C0    EOR   $C08C, X
2E4B-   90 F8       BCC   $2E45
2E4D-   BD 8C C0    LDA   $C08C,X
2E50-   10 0A       BPL   $2E5C
2E52-   C9 C9       CMP   #$C9
2E54-   D0 0D       BNE   $2E63
2E56-   BD 88 C0    LDA   $C088,X
2E59-   4C 00 9E    JMP   $9E00


simple protection check. All we need to do is patch $2E55 to #$00 and recode it...
That certainly seems to work. The game boots and we can play a level.
For anyone who has deprotected Aquatron, this protection will be very familiar.
Right after this protection is another layer.
It's called shortly after the first one returns, but the effect doesn't show until you finish the level!

Code:
2F00-   0E 03 9F    ASL   $9F03 ;decode next instruction
2F03-   37          ???   
2F04-   03          ???   
2F05-   9F          ???   


When executed, the #$37 becomes #$6E, the ROR instruction. It modifies itself back to the #$37, but continues to run.

Code:
2F06-   AD 27 9F    LDA   $9F27
2F09-   4D 0E 9F    EOR   $9F0E
2F0C-   D0 01       BNE   $2F0F ;broken attempt at hidden instruction
2F0E-   F8          SED   
2F0F-   8D 27 9F    STA   $9F27
2F12-   D0 01       BNE   $2F15
2F14-   20 A0 E9    JSR   $E9A0 ;hidden instruction

2F15-   A0 E9       LDY   #$E9 ;big offset
2F17-   98          TYA   
2F18-   90 01       BCC   $2F1B
2F1A-   4C 59 3F    JMP   $3F59 ;hidden instruction

2F1B-   59 3F 9E    EOR   $9E3F,Y ;reaches $9F26...
2F1E-   99 3F 9E    STA   $9E3F,Y
2F21-   C8          INY   
2F22-   D0 F3       BNE   $2F17
2F24-   90 01       BCC   $2F27 ;hidden instruction
2F26-   20 60 B0    JSR   $B060

2F26-   60          RTS


and then there's this:

Code:
2F27-   98          TYA
2F28-   59 00 9E    EOR   $9E00,Y
2F2B-   C8          INY
2F2C-   D0 FA       BNE   $2F28
2F2E-   A0 01       LDY   #$01
2F30-   8C 01 02    STY   $0201 ;mark protection passed
2F33-   C9 6D       CMP   #$6D ;check checksum
2F35-   F0 C9       BEQ   $9F00 ;back to re-encode
2F37-   A0 60       LDY   #$60
2F39-   8C 01 02    STY   $0201 ;mark protection failed
2F3C-   4C 00 9F    JMP   $9F00 ;back to re-encode


the protection state is checked later, and the game hangs if the value is wrong.
It's also the reason why we can't just not call the routine at all.
However, we can change the checksum to match our new value, and then everything is fine.
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: 2949
Localisation: Le Chesnay, France

MessagePosté le: Sam 21 Nov 2015, 11:02    Sujet du message: Répondre en citant

What if we change at $2F37 the value of Y and put 01 instead of 60? Would it pass or is the value in A used?
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Sam 21 Nov 2015, 22:57    Sujet du message: Répondre en citant

toinet a écrit:
What if we change at $2F37 the value of Y and put 01 instead of 60? Would it pass or is the value in A used?


That would work, too.
Aquatron required that the first protection routine was called, and set a value which the second layer also checked. I used the same technique there.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
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