Index du Forum
IDENTIFICATION SERVEUR : 10.14.20.168 - CLIENT : 3.237.94.109

 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 

Drelbs (Synapse, 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: Mer 13 Mai 2015, 19:03    Sujet du message: Drelbs (Synapse, 1983) Répondre en citant

Action game, similar to Lady Bug, but you have to get one creature to shoot the other one, while avoiding being shot yourself or touched by either of them.

The game is on a standard DOS format disk, and even has an AppleSoft autostart file ("HI") that runs the binary file ("DRELBS").
The DRELBS file switches to direct RWTS for the protection check and to load the rest of the code.
The disk completely is copyable, except for track $19. This is important.
Let's look at the loader.

Code:
0A00       LDA    $C030
0A03       LDA    #1
0A05       STA    $02 ;command (read)
0A07       LDA    #$D ;start reading to $D00
0A09       STA    $04
0A0B       LDA    #$94 ;finish reading after $9400
0A0D       STA    $05
0A0F       LDA    #$19 ;first track to read (protection track)
0A11       STA    $03
0A13       JSR    sub_A36 ;fill rest of IOB
0A16       LDA    $02
0A18       JSR    sub_A5C ;(implicit) protection check
0A1B       STA    $03 ;funny effect
0A1D       JSR    sub_A36 ;update IOB (specifically, the track)
0A20 loc_A20:
0A20       LDA    $02
0A22       JSR    sub_A5C ;read sector
0A25       JSR    sub_A89 ;update track/sector and address
0A28       INC    $04
0A2A       LDA    $04
0A2C       SEC
0A2D       CMP    $05
0A2F       BCC    loc_A20
0A31       BEQ    loc_A20 ;branch until greater
0A33 loc_A33:
0A33       JMP    0000 ;hmmm... self-modified? yes.


Boring stuff here:

Code:
0A36 sub_A36:
0A36       JSR    $3E3 ;get IOB address
0A39       STY    $00
0A3B       STA    $01
0A3D       LDA    #0
0A3F       STA    $06
0A41       STA    $07
0A43       LDY    #3
0A45       STA    (0),Y ;drive 1
0A47       LDY    #5
0A49       STA    (0),Y ;sector 0
0A4B       LDY    #8
0A4D       STA    (0),Y ;low address (0)
0A4F       LDY    #9
0A51       LDA    $04
0A53       STA    (0),Y ;high address
0A55       LDY    #4
0A57       LDA    $03
0A59       STA    (0),Y ;track
0A5B       RTS


and here:

Code:
0A89 sub_A89:
0A89       LDY    #9
0A8B       LDA    (0),Y
0A8D       CLC
0A8E       ADC    #1
0A90       STA    (0),Y
0A92       LDY    #5
0A94       LDA    (0),Y
0A96       CLC
0A97       ADC    #1
0A99       STA    (0),Y
0A9B       AND    #$F0
0A9D       BEQ    locret_AAC
0A9F       LDA    #0
0AA1       STA    (0),Y
0AA3       LDY    #4
0AA5       LDA    (0),Y
0AA7       CLC
0AA8       ADC    #1
0AAA       STA    (0),Y
0AAC locret_AAC:
0AAC       RTS


Save the best for last. The protection check.

Code:
0A5C sub_A5C:
0A5C       LDY    #$C
0A5E       STA    (0),Y ;set command
0A60       LDY    #$D
0A62       LDA    #0
0A64       STA    (0),Y ;clear return code
0A66       LDY    #$B
0A68       STA    (0),Y ;entire sector
0A6A       LDY    $00
0A6C       LDA    $01
0A6E       JSR    $3D9 ;read sector
0A71       BCC    loc_A7A ;skip if no error
0A73       INC    $07 ;irrelevant
0A75       ROR    loc_A33+2 ;aha!
0A78       BCC    loc_A7C ;should be clear now
0A7A loc_A7A:
0A7A       INC    $06 ;irrelevant in any case
0A7C loc_A7C:
0A7C       LDA    #0
0A7E       STA    $48
0A80       LDY    #$D
0A82       LDA    (0),Y ;fetch return code
0A84       LSR    A
0A85       LSR    A
0A86       LSR    A
0A87       LSR    A ;divide by 16...
0A88       RTS


So we have two interesting things here. The first thing is that when $A5C is called for the first time, it tries to read track $19.
Only if the read fails, then the JMP address at $A33 is updated to $8000. It means that on a clean copy where the read succeeds, that JMP goes to $0000 and crashes.
We defeat that by simply changing the JMP address to $8000 always.
The second thing is the return code. If the read fails, then the return code will be $40 (drive error). After dividing by 16, the value is 4. This value is stored at $03, as we see here:

Code:
0A18       JSR    sub_A5C ;(implicit) protection check
0A1B       STA    $03 ;funny effect
0A1D       JSR    sub_A36 ;update IOB (specifically, the track)


and is used here:

Code:
0A55       LDY    #4
0A57       LDA    $03
0A59       STA    (0),Y ;track


So if the read fails, then the starting track will be 4, otherwise it will be 0. It means that on a clean copy where the read succeeds, the data will be loaded from the wrong tracks.
We defeat that by simply changing the LDA (0),Y to LDA #$40.
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: 3055
Localisation: Le Chesnay, France

MessagePosté le: Sam 23 Mai 2015, 20:05    Sujet du message: Répondre en citant

Interesting thing!

Last line: is it #$40 or #$04?!?

LoGo

edit: OK, got it. You put a LDA #$40 before the four LSR!
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