--------Cross Country California------- A 4am crack 2015-06-09 --------------------------------------- Name: Cross Country California Genre: educational Year: 1987 Authors: Darcy Allen, Dave Vincent Publisher: Didatech Software Media: double-sided 5.25-inch floppy OS: Pronto-DOS Other versions: none (preserved here for the first time) Side B is unprotected but unbootable. Side A is bootable but protected. Life is like that. That is not a haiku. ~ Chapter 0 In Which Various Automated Tools Fail In Interesting Ways COPYA fails on first pass Locksmith Fast Disk Backup can read every sector except T02,S07; copy displays title screen then quits to BASIC prompt with DOS disconnected EDD 4 bit copy (no sync, no count) ditto Copy ][+ nibble editor There's an address field for T02,S07, but no data Disk Fixer T00 -> DOS 3.3-shaped RWTS T11 -> DOS 3.3 disk catalog T01,S09 -> startup program is named "COPYRIGHT 1987" Why didn't COPYA work? intentionally unreadable sector on track $02 Why didn't Locksmith FDB / EDD work? probably a nibble check that checks that unreadable sector Next steps: 1. Trace startup program 2. Find nibble check and disable it 3. There is no step 3 (I hope) ~ Chapter 1 In Which You Ain't Gonna Need It (Until You Do) [S6,D1=non-working copy (side A)] [S5,D1=my work disk] ]PR#5 ... CAPTURING BOOT0 ...reboots slot 6... ...reboots slot 5... SAVING BOOT0 CAPTURING BOOT1 ...reboots slot 6... ...reboots slot 5... SAVING BOOT1 SAVING RWTS I probably don't need that since the disk is (539/540)% copyable, but OK. ]BLOAD COPYRIGHT 1987,S6,D1 ]CALL -151 ; under Diversi-DOS 64K, the last BLOAD ; address is at $BF55, and length is at ; $BF51 *BF55.BF56 BF55- 02 08 ; A$802 *BF51.BF52 BF51- 42 04 ; L$442 *802L 0802- 4C E1 BC JMP $BCE1 Well then. Glad I captured the RWTS after all. *BLOAD RWTS,A$3800,S5,D1 *B800<3800.3EFFM *BCE1L ; decrypt the code at $0805 (which is ; part of the startup program we just ; loaded) BCE1- A2 04 LDX #$04 BCE3- A0 05 LDY #$05 BCE5- A9 96 LDA #$96 BCE7- 59 00 08 EOR $0800,Y BCEA- 99 00 08 STA $0800,Y BCED- C8 INY BCEE- D0 F5 BNE $BCE5 BCF0- EE E9 BC INC $BCE9 BCF3- EE EC BC INC $BCEC BCF6- CA DEX BCF7- D0 EC BNE $BCE5 BCF9- 4C 89 BA JMP $BA89 *BA89L ; wipe the previous decryption routine BA89- A2 1C LDX #$1C BA8B- 98 TYA BA8C- 9D E0 BC STA $BCE0,X BA8F- CA DEX BA90- D0 FA BNE $BA8C BA92- 4C 05 08 JMP $0805 *BA92:60 ; exit via RTS instead of JMP *BEC1G ; run decryption routine *805L ; DOS command "MAXFILES 1" ; (I checked -- that's really what it ; is; they didn't sneak something else ; into the DOS area) 0805- A9 01 LDA #$01 0807- 85 44 STA $44 0809- 20 51 A2 JSR $A251 ; turn off GS acceleration 080C- AD 36 C0 LDA $C036 080F- 29 7F AND #$7F 0811- 8D 36 C0 STA $C036 ; my "Peeks, Pokes and Pointers" poster ; tells me this clears the hi-res ; graphics screen to black 0814- A9 20 LDA #$20 0816- 9D 64 1F STA $1F64,X 0819- 85 E6 STA $E6 081B- 20 F2 F3 JSR $F3F2 081E- A2 00 LDX #$00 0820- 86 1D STX $1D ; show hi-res graphics screen 0822- 8E 10 C0 STX $C010 0825- AD 54 C0 LDA $C054 0828- AD 57 C0 LDA $C057 082B- AD 52 C0 LDA $C052 082E- AD 50 C0 LDA $C050 0831- A9 01 LDA #$01 0833- 20 C6 09 JSR $09C6 *9C6L 09C6- 48 PHA 09C7- A0 00 LDY #$00 09C9- 84 62 STY $62 09CB- 20 D6 09 JSR $09D6 09CE- 68 PLA 09CF- A8 TAY 09D0- 20 D6 09 JSR $09D6 ; this gets a starting address from a ; table (given at $09EF for the low ; bytes and $09FE for the high bytes) ; and passes bytes to $0A47... 09D6- B9 EF 09 LDA $09EF,Y 09D9- 85 08 STA $08 09DB- B9 FE 09 LDA $09FE,Y 09DE- 85 09 STA $09 09E0- A0 00 LDY #$00 09E2- B1 08 LDA ($08),Y 09E4- C9 FC CMP #$FC 09E6- F0 06 BEQ $09EE 09E8- 20 47 0A JSR $0A47 09EB- C8 INY 09EC- D0 F4 BNE $09E2 09EE- 60 RTS ; ...which stores them in the DOS input ; buffer at $0200 0A47- A6 62 LDX $62 0A49- 9D 00 02 STA $0200,X 0A4C- E6 62 INC $62 0A4E- 60 RTS *9D3L 09D3- 4C 45 0A JMP $0A45 *A45L ; and ends with a carriage return (this ; falls through to $0A47, listed above) 0A45- A9 8D LDA #$8D *836L ; this tells DOS to execute the command ; in the input buffer 0836- 20 4F 0A JSR $0A4F This code is a little hard to follow, but looking at the actual strings helps a lot. $09EF/$09FE points to $0A0D. *FC58G N 400