Index du Forum
IDENTIFICATION SERVEUR : 10.14.20.215 - CLIENT : 34.205.93.2

 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 4th R -- Reasoning (MCE Inc, 1984)

 
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 11 Fév 2015, 20:38    Sujet du message: The 4th R -- Reasoning (MCE Inc, 1984) Répondre en citant

This is an educational title, about logical thinking and reasoning.

The disk is copyable except for sector 8 on track 0, and a couple of sectors on each of track $1C and $1D (but they're probably really bad sectors because the disk is old).
The copy reboots itself instantly, so let's start tracing.
Starts with regular DOS bootsector. I don't need to show that.

Code:
8600<C600.C6FCM
86F8:A9 4C 8D 4A 8 A9 5 8D 4B 8 A9 87 8D 4C 8 4C 1 8 4C 69 FF
8600G


We have DOS loaded and we're back to our monitor prompt.

Code:
B700                 JSR     sub_BB00   ;strange

;the rest is standard DOS stuff
B703                 STX     byte_B7F7
B706                 LDA     #1
B708                 STA     byte_B7F8
B70B                 STA     byte_B7EA
B70E                 LDA     byte_B7E0
B711                 STA     byte_B7E1
B714                 LDA     #2
B716                 STA     byte_B7EC
...


Let's see $BB00.

Code:
BB00                 DEC     byte_8FE
BB03                 INC     byte_8FF
BB06                 JSR     sub_BBCC
BB09                 JSR     sub_BB34
BB0C                 LDA     #$8E
BB0E                 STA     loc_B700
BB11                 LDA     #$E9
BB13                 STA     loc_B700+1
BB16                 LDA     #$B7
BB18                 STA     loc_B700+2   ;restore the first instruction
BB1B                 LDA     #$C6
BB1D                 STA     byte_3F2
BB20                 LDA     #$B6
BB22                 STA     byte_3F3
BB25                 EOR     #$A5
BB27                 STA     byte_3F4   ;hook reset vector
BB2A                 LDA     #$B6
BB2C                 STA     byte_B6D3
BB2F                 PLA
BB30                 PLA
BB31                 JMP     loc_B700


We'll start with the simplest part: the reset vector handler.

Code:
B6C6                 LDA     #$BF
B6C8                 STA     loc_0+1
B6CA                 LDA     #0
B6CC                 STA     loc_0
B6CE                 TAY
B6CF                 LDX     #$C
B6D1 loc_B6D1:
B6D1
B6D1                 LDA     loc_8E1,X   ;same as $B6E1 below
B6D4                 STA     loc_2,X
B6D6                 DEX
B6D7                 BPL     loc_B6D1
B6D9                 LDA     loc_C082
B6DC                 LDA     #$A0
B6DE                 JMP     loc_2
B6E1 loc_B6E1:
B6E1                 STA     (0),Y   ;fill a page with spaces
B6E3                 INY
B6E4                 BNE     loc_B6E1
B6E6                 DEC     loc_0+1
B6E8                 BNE     loc_B6E1   ;for all except page zero
B6EA                 JMP     (loc_FFFC)   ;old reset vector


Then the routine at $BBCC.

Code:
BBCC                 LDY     #$2F
BBCE
BBCE loc_BBCE:
BBCE                 LDA     $BC00,Y
BBD1                 STA     $3D0,Y
BBD4                 DEY
BBD5                 BPL     loc_BBCE
BBD7                 RTS


Actually, that one is very simple, too. ;-)
What it copies is the standard DOS vectors, so it's not interesting.
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: Mer 11 Fév 2015, 20:39    Sujet du message: Répondre en citant

That leaves the routine at $BB34.

Code:
BB34                 LDA     #$10
BB36                 STA     loc_FF
BB38 loc_BB38:
BB38                 DEC     loc_FF
BB3A                 BNE     loc_BBA6
BB3C                 JMP     loc_B6C6
BB3F loc_BB3F:
BB3F                 JSR     sub_B944   ;standard DOS read sector address
BB42                 BCS     loc_BB38
BB44                 LDA     loc_2D
BB46                 CMP     #8      ;watch for sector 8 (that we couldn't read earlier)
BB48                 BNE     loc_BB3F
BB4A                 LDY     #0
BB4C loc_BB4C:
BB4C                 LDA     $C08C,X
BB4F                 BPL     loc_BB4C
BB51 loc_BB51:
BB51                 CMP     $BBD8,Y   ;watch for sector data.  It's even standard prologue
BB54                 BEQ     loc_BB5E
BB56                 CPY     #0
BB58                 BEQ     loc_BB4C
BB5A                 LDY     #0
BB5C                 BEQ     loc_BB51
BB5E loc_BB5E:
BB5E                 INY
BB5F                 CPY     #4
BB61                 BNE     loc_BB4C
BB63 loc_BB63:
BB63                 LDA     $C08C,X
BB66                 BPL     loc_BB63
BB68 loc_BB68:
BB68                 LDA     $C08C,X
BB6B                 BMI     loc_BB68   ;skip one nibble
BB6D loc_BB6D:
BB6D                 LDA     $C08C,X
BB70                 BPL     loc_BB6D
BB72                 STA     $C08D,X   ;desynch
BB75                 NOP
BB76 loc_BB76:
BB76                 LDA     $C08C,X
BB79                 BMI     loc_BB76   ;skip one nibble
BB7B loc_BB7B:
BB7B                 LDA     $C08C,X
BB7E                 BPL     loc_BB7B
BB80 loc_BB80:
BB80                 LDA     $C08C,X
BB83                 BMI     loc_BB80   ;skip one nibble
BB85 loc_BB85:
BB85                 LDA     $C08C,X
BB88                 BPL     loc_BB85
BB8A                 LDY     #$F
BB8C                 LDA     #0
BB8E                 STA     loc_70
BB90                 STA     loc_71
BB92                 CLC
BB93 loc_BB93:
BB93                 LDA     $C08C,X
BB96                 BPL     loc_BB93
BB98                 STA     $BBDC,Y   ;now read a sequence
BB9B                 EOR     loc_70
BB9D                 STA     loc_70
BB9F                 ADC     loc_71
BBA1                 STA     loc_71   ;and "checksum" it
BBA3                 DEY
BBA4                 BPL     loc_BB93
BBA6 loc_BBA6:
BBA6                 LDA     loc_70   ;fetch key index
BBA8                 AND     #$F
BBAA                 TAY
BBAB                 LDA     $BBDC,Y   ;fetch decoding key1 (see below)
BBAE                 STA     byte_3F0   ;save for later
BBB1                 INY
BBB2                 TYA
BBB3                 AND     #$F
BBB5                 TAY
BBB6                 LDA     $BBDC,Y   ;fetch decoding key2 (see below)
BBB9                 STA     byte_3F1   ;save for later
BBBC                 LDA     loc_71
BBBE                 CMP     #2
BBC0                 BEQ     loc_BBC5
BBC2                 JMP     loc_BB38   ;retry if checksum failed
BBC5                 LDA     #0
BBC7                 STA     loc_70
BBC9                 STA     loc_71   ;hide key indexes
BBCB                 RTS
...
BBD8                 .BYTE $FF, $D5, $AA, $AD


Okay, so if we ignore (or overlooked, as I did initially) the writes to $3F0-3F1, we might decide to bypass this routine completely.
That would be a mistake. The disk would start to boot, and then crash to the monitor.
Even using the disk's own DOS to copy everything would result in the same behaviour.
The problem was that every sector read in my copy returned different content compared to the original disk, using exactly the same read routine.
Of course, if I booted the original and then swapped disks, the read was correct.
I checked the address and data prologues and epilogues, I tried zeroing the volume label, I tried ignoring read errors, and more.
In short, I tried everything except checking how $3F0-3F1 is used, and even when I reached that point, I still had trouble finding it.
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: Mer 11 Fév 2015, 20:41    Sujet du message: Répondre en citant

Obviously, I found it eventually. Glance at the denibbilisation routine, and see if you can spot it, too.

Code:
B8C2                 LDY     #0
B8C4 loc_B8C4:
B8C4                 LDX     #$56
B8C6 loc_B8C6:
B8C6                 DEX
B8C7                 BMI     loc_B8C4
B8C9                 LDA     $BB00,Y
B8CC                 LSR     $BC00,X
B8CF                 ROL     A
B8D0                 LSR     $BC00,X
B8D3                 JSR     sub_BCEF   ;right here!
B8D6                 INY
B8D7                 CPY     loc_25+1
B8D9                 BNE     loc_B8C6
B8DB                 RTS


What's at $BCEF? Why, a decoding routine.

Code:
BCEF                 ROL     A
BCF0                 BIT     byte_BCFF
BCF3                 BMI     loc_BCFC
BCF5                 SEC
BCF6                 SBC     byte_3F1   ;key2
BCF9                 EOR     byte_3F0   ;key1
BCFC loc_BCFC:
BCFC                 STA     ($3E),Y
BCFE                 RTS


DOS 3.3 has unused bytes in the region $BCDF-BCFF. For this program, there's an encoder at $BCDF to allow writing to the disk, and the decoder at $BCEF.
Yes, almost the entire disk is encoded sectors. Once I found that, it was a simple matter to capture the key and fix the protection routine.
I left the encoding in place.
It's my standard to change as few bytes as possible, so I even let the protection routine run, but just override the result.
What does that look like? Just two bytes to change in the code, and two bytes in the data.

Code:
BBA6                 LDA     loc_70   ;fetch key index


becomes

Code:
BBA6                 LDA     #$67


and

Code:
BBC2                 JMP     loc_BB38   ;retry if checksum failed


becomes

Code:
BBC2                 JMP     loc_BBC5   ;continue unconditionally


The #$67 for the key points to $BBE3 in the table, so we place the keys there.

Code:
BBE3                 .BYTE $D7, $F9


That's it. The game boots.
It's funny that the crack took me about two hours to complete because I was under strict time limits. Without that stress (and thus able to think more clearly), I probably could have done it sooner.
Maybe I should play this game to improve my reasoning skills. ;-)
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 14 Fév 2015, 5:45    Sujet du message: Répondre en citant

nice one. a program that uses its protection routine to decypher data.
yeah!
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