Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.129 - CLIENT : 54.162.227.37

 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 

Transylvania (Penguin/Polarware, 1982-1985)

 
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
toinet
Site Admin


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

MessagePosté le: Dim 15 Nov 2015, 18:38    Sujet du message: Transylvania (Penguin/Polarware, 1982-1985) Répondre en citant

This is an international crack. The idea was to share a copy of the original floppy to Qkumba and 4am, and see the method used to crack it. From boot tracing to using an emulator's save/restore state, going through disk editing, different methods were used, and, as usual, Qkumba went further and cracked it efficiently. I mean, Qkumba really cracked it.

Disk format
This is a standard ProDOS disk.
Both sides are copyable.
You reboot and the game freezes.

Things to note
- it boots like ProDOS but displays something else: ah ah, a modified ProDOS file
- the directory looks like a ProDOS one but BOOTER.SYSTEM loads files not present in the directory: weird but it confirms the modified ProDOS (see blocks $C3 & $C4)
- the diskette can be copied but does not boot: oh, a nibble check or (small) count somewhere
- no C089/C0E9/C08C/C0EC apart from ProDOS: hum.. some code to decypher
- the game hangs: hum... there's a loop someplace, if not a jump, find for 90FE/B0FE/D0FE/F0FE (we are lucky)

How to copy
Copy both sides with the Locksmith Fast Disk Backup utility, that's it.

How to crack
With Disk Fixer 4.0, select (O)ptions and set the PRODOS disk format, then:
On side one:
- T10/S2/B0: F0 FE -> F0 00
- T11/S1/B0: F0 FE -> F0 00 (useless, but we never know)
On side two:
- TT/S3/6A: 8D (STA) -> AD (LDA)

The San Inc crack is on Asimov. I put my copy (the one with the changes to the ProDOS directory) at http://www.brutaldeluxe.fr/crack/

Reboot and... congratulate Qkumba,

LoGo
11/2015
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: 2928
Localisation: Le Chesnay, France

MessagePosté le: Dim 15 Nov 2015, 18:45    Sujet du message: Répondre en citant

The first protection check is in file T0. It is called by the BOOTER.SYSTEM system file. The protection check is decyphered with an EOR #$FF

Code:

0000:A2 03          LDX   #$03          Save some zero page values
0002:B5 00          LDA   $00,X         
0004:48             PHA                 
0005:CA             DEX                 
0006:10 FA          BPL   $0002         
0008:A9 60          LDA   #$60          Put a RTS at $0000
000A:85 00          STA   $00           
000C:20 00 00       JSR   $0000         Call the RTS
000F:BA             TSX                 
0010:CA             DEX                 
0011:CA             DEX                 
0012:9A             TXS                 
0013:68             PLA                 
0014:85 00          STA   $00           We have our address
0016:68             PLA                 
0017:85 01          STA   $01           
0019:A0 89          LDY   #$89          And we decypher the code
001B:A9 FF          LDA   #$FF         
001D:51 00          EOR   ($00),Y       
001F:91 00          STA   ($00),Y       
0021:88             DEY                 
0022:C0 17          CPY   #$17         
0024:D0 F5          BNE   $001B         


And the decyphered code
Code:

0026:AE 30 BF       LDX   $BF30         Turn drive on
0029:BD 89 C0       LDA   $C089,X       
002C:A9 56          LDA   #$56          Number of tries
002E:85 03          STA   $03           
0030:A9 08          LDA   #$08         
0032:C6 02          DEC   $02           
0034:D0 04          BNE   $003A         
0036:C6 03          DEC   $03           
0038:F0 59          BEQ   $0093         exit
003A:BC 8C C0       LDY   $C08C,X       Look for nibbles
003D:10 FB          BPL   $003A         
003F:C0 FB          CPY   #$FB         
0041:D0 ED          BNE   $0030         
0043:F0 00          BEQ   $0045         
0045:EA             NOP                 
0046:EA             NOP                 
0047:BC 8C C0       LDY   $C08C,X       
004A:C0 08          CPY   #$08         
004C:2A             ROL                 
004D:B0 0B          BCS   $005A         
004F:BC 8C C0       LDY   $C08C,X       
0052:10 FB          BPL   $004F         
0054:C0 FF          CPY   #$FF         
0056:D0 D8          BNE   $0030         
0058:F0 EB          BEQ   $0045         
005A:C9 0A          CMP   #$0A         
005C:D0 D2          BNE   $0030         
005E:BD 8C C0       LDA   $C08C,X       
0061:10 FB          BPL   $005E         
0063:C9 D5          CMP   #$D5         
0065:D0 C9          BNE   $0030         
0067:F0 00          BEQ   $0069         
0069:BD 8C C0       LDA   $C08C,X       
006C:10 FB          BPL   $0069         
006E:C9 AA          CMP   #$AA         
0070:D0 BE          BNE   $0030         
0072:F0 00          BEQ   $0074         
0074:BD 8C C0       LDA   $C08C,X       
0077:10 FB          BPL   $0074         
0079:C9 96          CMP   #$96         
007B:D0 B3          BNE   $0030         
007D:F0 00          BEQ   $007F         
007F:BD 8C C0       LDA   $C08C,X       
0082:10 FB          BPL   $007F         
0084:C9 AA          CMP   #$AA         
0086:D0 A8          BNE   $0030         
0088:F0 00          BEQ   $008A         
008A:BD 8C C0       LDA   $C08C,X       The last nibble to check
008D:10 FB          BPL   $008A         
008F:C9 AB          CMP   #$AB         
0091:D0 9D          BNE   $0030         
0093:DD 88 C0       CMP   $C088,X       Stop the drive
0096:A0 89          LDY   #$89         


And the end of the code
Code:

0098:A9 FF          LDA   #$FF          Recode the protection check
009A:51 00          EOR   ($00),Y       
009C:91 00          STA   ($00),Y       
009E:88             DEY                 
009F:C0 17          CPY   #$17         
00A1:D0 F5          BNE   $0098         
00A3:A4 03          LDY   $03           Get the check result
00A5:A2 00          LDX   #$00          Restore the zero page
00A7:68             PLA                 
00A8:95 00          STA   $00,X         
00AA:E8             INX                 
00AB:E0 04          CPX   #$04         
00AD:D0 F8          BNE   $00A7         
00AF:98             TYA                 
00B0:F0 FE          BEQ   $00B0         Loop to self if Y=0
00B2:A9 00          LDA   #$00          Otherwise, tell it is OK
00B4:8D D0 9A       STA   $9AD0         
00B7:A9 C6          LDA   #$C6         
00B9:8D D1 9A       STA   $9AD1         
00BC:60             RTS                 


The F0 FE at $B0 is the change we do, we replace it with F0 00 to always go one step further.
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: 2928
Localisation: Le Chesnay, France

MessagePosté le: Dim 15 Nov 2015, 19:05    Sujet du message: Répondre en citant

And if you think you're done like I did, boot the game (but wonder why you have to switch to side 2 then come back to side 1) and enter the following commands:
Code:

N, W, N, E, PULL ANTLER


If you have an original disk, then a secret room will be accessible.
If you have a copy, the program will just write "It wobbles."

So... there's a second check on the disk. It is in file T1 at address $5C79. There is another key to decypher the code, the value is #$EF. Just to complicate the search, there is some modified code to make it harder.

Code:

00/5398: ADA64F                     LDA   $4FA6             
00/539B: C9FF                       CMP   #$FF             
00/539D: D00E                       BNE   $53AD             
00/539F: A94D                       LDA   #$4D              Replace a STA with an EOR
00/53A1: 8D6756                     STA   $5667             
00/53A4: 206256                     JSR   $5662             
00/53A7: 206557                     JSR   $5765             
00/53AA: C6FE                       DEC   $FE               
00/53AC: 60                         RTS                     


And the original then modified code:
Code:

00/5662: 202357                     JSR   $5723                                 
00/5665: B1FE                       LDA   ($FE),Y                               
00/5667: 991159                     STA   $5911,Y                               
00/566A: 91FE                       STA   ($FE),Y                               
00/566C: 88                         DEY                                         
00/566D: 10F6                       BPL   $5665                                 

00/5662: 202357                     JSR   $5723                                 
00/5665: B1FE                       LDA   ($FE),Y                               
00/5667: 4D1159                     EOR   $5911                                 
00/566A: 91FE                       STA   ($FE),Y                               
00/566C: 88                         DEY                                         
00/566D: 10F6                       BPL   $5665                                 
00/566F: 60                         RTS                                         


The code at $5723
Code:

0023:A4 FE          LDY   $FE           
0025:C8             INY                 
0026:84 FE          STY   $FE           
0028:88             DEY                 
0029:60             RTS                 


And the second decyphered protection check. The return value is stored and checked in the program. That's why Qkumba has changed the STA to a LDA.

Code:

007C:D0 02          BNE   $0080         
007E:00             BRK                 
007F:A0             LDY
* Start of decyphered code
0080:A5 82          LDA   $82           save some values
0082:48             PHA                 
0083:A5 8F          LDA   $8F           
0085:48             PHA                 
0086:AE 30 BF       LDX   $BF30         turn the drive on
0089:BD 89 C0       LDA   $C089,X       
008C:A9 56          LDA   #$56          set the retry count
008E:85 8F          STA   $8F           
0090:A9 08          LDA   #$08          A is 8
0092:C6 82          DEC   $82           
0094:D0 04          BNE   $009A         
0096:C6 8F          DEC   $8F           
0098:F0 59          BEQ   $00F3         
009A:BC 8C C0       LDY   $C08C,X       look for nibbles
009D:10 FB          BPL   $009A         
009F:C0 FB          CPY   #$FB         
00A1:D0 ED          BNE   $0090         
00A3:F0 00          BEQ   $00A5         
00A5:EA             NOP                 
00A6:EA             NOP                 
00A7:BC 8C C0       LDY   $C08C,X       again
00AA:C0 08          CPY   #$08         
00AC:2A             ROL                 
00AD:B0 0B          BCS   $00BA         
00AF:BC 8C C0       LDY   $C08C,X       again
00B2:10 FB          BPL   $00AF         
00B4:C0 FF          CPY   #$FF         
00B6:D0 D8          BNE   $0090         
00B8:F0 EB          BEQ   $00A5         
00BA:C9 0A          CMP   #$0A          check A
00BC:D0 D2          BNE   $0090         
00BE:BD 8C C0       LDA   $C08C,X       again
00C1:10 FB          BPL   $00BE         
00C3:C9 D5          CMP   #$D5         
00C5:D0 C9          BNE   $0090         
00C7:F0 00          BEQ   $00C9         
00C9:BD 8C C0       LDA   $C08C,X       again
00CC:10 FB          BPL   $00C9         
00CE:C9 AA          CMP   #$AA         
00D0:D0 BE          BNE   $0090         
00D2:F0 00          BEQ   $00D4         
00D4:BD 8C C0       LDA   $C08C,X       again
00D7:10 FB          BPL   $00D4         
00D9:C9 96          CMP   #$96         
00DB:D0 B3          BNE   $0090         
00DD:F0 00          BEQ   $00DF         
00DF:BD 8C C0       LDA   $C08C,X       again
00E2:10 FB          BPL   $00DF         
00E4:C9 AA          CMP   #$AA         
00E6:D0 A8          BNE   $0090         
00E8:F0 00          BEQ   $00EA         
00EA:BD 8C C0       LDA   $C08C,X       again
00ED:10 FB          BPL   $00EA         
00EF:C9 AB          CMP   #$AB         
00F1:D0 9D          BNE   $0090         
00F3:DD 88 C0       CMP   $C088,X       stop the drive
00F6:A4 8F          LDY   $8F           the result is in Y
00F8:68             PLA                 
00F9:85 8F          STA   $8F           
00FB:68             PLA                 
00FC:85 82          STA   $82           restore the values
00FE:98             TYA                 and return
00FF:60             RTS                 


The code at $5765, the one that calls the protection and used to store its result at $57B8. With an original, the return value is <>0 and 0 with a copy.

Code:

0065:C6 FE          DEC   $FE           
0067:20 7C 59       JSR   $597C         Call the protection
006A:AD B8 57       LDA   $57B8         Used to STA the result
006D:20 62 56       JSR   $5662         
0070:A9 99          LDA   #$99         
0072:8D 67 56       STA   $5667         
0075:60             RTS                 


There are some other checks in the program, there is no need to change the following as our crack does not change the checked values:
Code:

00/50D2: A200                       LDX   #$00                                 
00/50D4: BD9158                     LDA   $5891,X                               
00/50D7: C9AD                       CMP   #$AD                                 
00/50D9: D011                       BNE   $50EC                                 
00/50DB: BD9258                     LDA   $5892,X                               
00/50DE: C9B8                       CMP   #$B8                                 
00/50E0: D00A                       BNE   $50EC                                 
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: 174

MessagePosté le: Mer 18 Nov 2015, 6:08    Sujet du message: Répondre en citant

After defeating the protection on side 1, we find indeed that the game cannot be completed because of a secondary protection.
If we dig deep into the interpreter, we find this p-code sequence being interpreted:

Code:
7832:
05 15      ;in room 15?
59 11      ;if yes, is magic value 0?
8E 44 80   ;if yes, print "the wall spins..." (to enter room)
85 16      ;else...
05 16      ;in room 16?
59 11      ;if yes, is magic value 0?
8E 44 80   ;if yes, print "the wall spins..." (to exit room)
85 15      ;else...
04         ;reset state
05 15      ;in room 15?
05 16      ;or room 16?
8E 73 80   ;if yes, print "it wobbles"


the magic value is fetched this way:

Code:
5649: LDA $4FA6
564C: AND #$07
564E: TAX
564F: LDA $4FA6
5652: LSR
5653: LSR
5654: LSR
5655: TAY
5656: LDA $5B3F, Y ;<-$5B41


tracing backwards, we find it being set this way:

Code:
53EE: JSR $5649
53F1: ORA $565A, X ;<-$565B
53F4: STA $5B3F, Y ;->$5B41


tracing backwards, this routine is called after this check:

Code:
5891: LDA $57B8
5894: BNE $58A2
5896: LDA $FE
5898: EOR #$37
589A: EOR $FF
589C: STA $4FA6
589F: JSR $53EE


so we have to find out what causes $57B8 to become zero. That happens after we make our first move.

Code:
5767: JSR $597C
576A: STA $57B8


and stepping into $597C... we find a nibble check, which returns zero on failure. That's why we change the STA to an LDA.
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