Index du Forum
IDENTIFICATION SERVEUR : 10.14.20.188 - CLIENT : 18.207.106.142

 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 

It's the pits (Anthony Ray, 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
toinet
Site Admin


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

MessagePosté le: Ven 21 Aoû 2020, 22:02    Sujet du message: It's the pits (Anthony Ray, 1983) Répondre en citant

#1037 - Thanks to ianoid, another rare title written by Anthony Ray in 1983. You must eat all the fruits on the map, and avoid birds. It is a simple game logic and one plays, and plays, and plays!

Disk structure
It seems to be a DOS 3.3 16-sec disk as it shows the DOS prompt. It is a single-sided title. Copy II Plus shows 35 tracks only.

Disk protection
I should have written on-disk protections as the title contains a lot of on-disk protections for... nothing. You'll see that the program is loaded in a single pass and that you can get it into memory with 6 lines of BASIC and ASM.
- DOS 3.3 tracks lie on half-track. For instance, T11 is located on T11.5
- T3-T10 are weirdly formatted
- Checksum of the address field is calculated differently than the original code (all EOR, here a combination of EOR/ORA)
- RWTS movearm routine is changed (that is normal as data is located on half-tracks)
- Nibble check of D5AAAC and address field values afterwards on early tracks
Once the program is loaded into memory, a check is performed, and if successful, the game is run. That's all and... weak.

How to load the program into memory
As usual...
Code:

We want to read T0/S0:
CALL-151
9600<C600.C6FFM
96F8:20 DA FD 4C 59 FF
9600G
*01
...and we see that it loads one sector only. We also see it is a standard DOS 3.3 loader.

Now, we want DOS 3.3 in memory, so we'll intercept before it inits it.
So, we call the monitor before it jumps to $9D84:
C600 > 801 > B700 > FF59
CALL-151
9600<C600.C6FFM
96F8:A9 4C 8D 4A 08 A9 00 8D 4B 08 A9 88 8D 4C 08 4C 01 08
8800:A9 80 8D 48 B7 A9 88 8D 49 B7 4C 00 B7
8880:A9 4C 8D 94 A3 A9 59 8D 95 A3 A9 FF 8D 96 A3 4C 84 9D
9600G

Now, we load DOS 3.3 and we load the boot program and we jump into the monitor before executing it:
C600 > 801 > B700 > 9D84 > FF59
CALL-151
9600<C600.C6FFM
96F8:A9 4C 8D 4A 08 A9 00 8D 4B 08 A9 88 8D 4C 08 4C 01 08
8800:A9 80 8D 48 B7 A9 88 8D 49 B7 4C 00 B7
8880:A9 4C 8D 94 A3 A9 A0 8D 95 A3 A9 88 8D 96 A3 4C 84 9D
88A0:4C 59 FF
9600G

We now know where the boot program is loaded and its length:
*AA72.AA73
AA72- 00 18
*AA60.AA61
AA60- 00 68
=> Boot program is named IT'S THE PITS and is loaded at $1800. Its length is $6800 bytes.

Now, thanks to the analysis further, we load the game, patch it, and we play it :-)
C600 > 801 > B700 > 9D84 > 88A0 > 1800
CALL-151
9600<C600.C6FFM
96F8:A9 4C 8D 4A 08 A9 00 8D 4B 08 A9 88 8D 4C 08 4C 01 08
8800:A9 80 8D 48 B7 A9 88 8D 49 B7 4C 00 B7
8880:A9 4C 8D 94 A3 A9 A0 8D 95 A3 A9 88 8D 96 A3 4C 84 9D
88A0:A9 EA 8D 13 18 A9 85 8D 14 18 A9 FC 8D 15 18 4C 00 18
9600G


How to skip the BRUN call
Non French-speaking persons do not own the great "Apple II DOS 3.3 Guide du programmeur" by Marcel Cottini, published by Sybex in 1986.
On page 171, the BRUN command is explained. Once the file is loaded, it calls JMP ($AA72) at $A394. So, we'll patch it to load the entire program in memory, and then jump into the monitor.

How to copy
We will not copy the program, we will just load it into memory, and we'll use the following code that is already shown above:
Code:

CALL-151
9600<C600.C6FFM
96F8:A9 4C 8D 4A 08 A9 00 8D 4B 08 A9 88 8D 4C 08 4C 01 08
8800:A9 80 8D 48 B7 A9 88 8D 49 B7 4C 00 B7
8880:A9 4C 8D 94 A3 A9 A0 8D 95 A3 A9 88 8D 96 A3 4C 84 9D
88A0:4C 59 FF
9600G


It is now up to you to either copy the $1800..$7FFF area into aux RAM or (if IIgs emulators supported woz files) into another bank.

How to make a bootable disk
The easiest way is to boot a master DOS 3.3 disk, and follow the instructions hereafter:
Code:

NEW
10 REM LOGO WAS HERE 8/2020
20 PRINT CHR$(4)"BRUN IT'S THE PITS"
INIT HELLO
BSAVE IT'S THE PITS,A$1800,L$6800


What have we learned?
We saw that DOS 3.3 can live on half tracks.
We saw that a couple of on-disk protections are useless if not used. Here, there is no benefit from them as you can get the program with 6 lines of code.
We know how to interrupt the DOS 3.3 initialization and its BRUN command.

The disk image is available at http://www.brutaldeluxe.fr/crack/

Reboot and... enjoy,

LoGo
8/2020
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: Ven 21 Aoû 2020, 22:02    Sujet du message: Répondre en citant

The following message shows excerpts from the game program, the call of the protection (at $3F00), and the check.

Code:

THE ENTRY POINT OF THE PROGRAM

The Flaming Bird Disassembler    Written by Ferox - (c) 1994 Phoenix corporation
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
00/1800: BA           L1800         TSX             ;
00/1801: 8679                       STX   $79       ; save stack pointer
00/1803: 78                         SEI             ; no interrupts
00/1804: A92E                       LDA   #$2E      ; set reset vector
00/1806: 8DF203                     STA   SOFTEV    ;
00/1809: A918                       LDA   #$18      ;
00/180B: 8DF303                     STA   SOFTEV+1  ;
00/180E: 49A5                       EOR   #$A5      ;
00/1810: 8DF403                     STA   PWREDUP   ;
00/1813: 20003F                     JSR   L3F00     ; call protection
00/1816: A5FC                       LDA   $FC       ; check protection result
00/1818: D017                       BNE   $1831     ; <>0, original disk

00/181A: A980                       LDA   #$80      ; we have a copy
00/181C: 85C4                       STA   $C4       ; erase RAM
00/181E: A940                       LDA   #$40      ;
00/1820: 85C2                       STA   $C2       ;
00/1822: A900                       LDA   #$00      ;
00/1824: 85C3                       STA   $C3       ;
00/1826: 85C1                       STA   $C1       ;
00/1828: 20661A                     JSR   $1A66     ; one time
00/182B: 20661A                     JSR   $1A66     ; two times
00/182E: 4C2E18                     JMP   $182E     ; infinite loop

00/1831: A95A                       LDA   #$5A      ; set reset vector
00/1833: 8DF203                     STA   SOFTEV    ; again and
00/1836: A918                       LDA   #$18      ; prepare
00/1838: 8DF303                     STA   SOFTEV+1  ; to
00/183B: 49A5                       EOR   #$A5      ; play
00/183D: 8DF403                     STA   PWREDUP   ; yeah!
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

THE PROTECTION CHECK

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
00/3F00: A904         L3F00         LDA   #$04      ; number of tries
00/3F02: 85FD                       STA   $FD       ;
00/3F04: 20103F                     JSR   $3F10     ; call protection
00/3F07: A5FC                       LDA   $FC       ; if we have an
00/3F09: D004                       BNE   $3F0F     ; original disk, exit
00/3F0B: C6FD                       DEC   $FD       ; if not, loop
00/3F0D: D0F5                       BNE   $3F04     ; until the edn
00/3F0F: 60                         RTS             ;

* In the following code, the movearm routine is not standard

00/3F10: 20E303                     JSR   $03E3     ; get my IOB table pointer
00/3F13: 8400                       STY   $00       ; save in zero page
00/3F15: 8501                       STA   $01       ;
00/3F17: A900                       LDA   #$00      ;
00/3F19: A004                       LDY   #$04      ; Track
00/3F1B: 9100                       STA   ($00),Y   ; $B7EC = $00
00/3F1D: A00C                       LDY   #$0C      ; Command Seek
00/3F1F: 9100                       STA   ($00),Y   ; $B7F4 = $00
00/3F21: A003                       LDY   #$03      ; Volume
00/3F23: 9100                       STA   ($00),Y   ; $B7EB = $00
00/3F25: 20E303                     JSR   $03E3     ; get my modified table pointer again
00/3F28: 20D903                     JSR   $03D9     ; and call the RWTS

00/3F2B: A900                       LDA   #$00      ; set default values
00/3F2D: 8548                       STA   $48       ; for the write address field routine
00/3F2F: 853F                       STA   $3F       ; Volume
00/3F31: 8541                       STA   $41       ; Track
00/3F33: 8544                       STA   $44       ; Sector

00/3F35: A001                       LDY   #$01      ; get slot*16
00/3F37: B100                       LDA   ($00),Y   ;
00/3F39: AA                         TAX             ; use it to
00/3F3A: BD89C0                     LDA   $C089,X   ; turn disk on
00/3F3D: A9AC                       LDA   #$AC      ; third address field prolog marker
00/3F3F: 8D84BC                     STA   $BC84     ; changed from $96 to $AC

* In the following code, the movearm routine is standard

00/3F42: 209C3F                     JSR   $3F9C     ; patch the movearm routine to normal
00/3F45: A912                       LDA   #$12      ; start counter at $12
00/3F47: 85FF                       STA   $FF       ;
00/3F49: 20A0B9                     JSR   $B9A0     ; move arm
00/3F4C: 20673F                     JSR   $3F67     ; read D5AAAC
00/3F4F: B008                       BCS   $3F59     ; nope, error
00/3F51: E6FF                       INC   $FF       ; counter++
00/3F53: A5FF                       LDA   $FF       ;
00/3F55: C916                       CMP   #$16      ; until $16
00/3F57: 90F0                       BCC   $3F49     ; loop if not all phases read

00/3F59: A900                       LDA   #$00      ; move arm again
00/3F5B: 20A0B9                     JSR   $B9A0     ; to track 0
00/3F5E: BD88C0                     LDA   $C088,X   ; stop disk drive
00/3F61: A996                       LDA   #$96      ; set third address field prolog marker
00/3F63: 8D84BC                     STA   $BC84     ; to default value
00/3F66: 60                         RTS             ; return

00/3F67: A040                       LDY   #$40      ; we must read
00/3F69: 8426                       STY   $26       ; D5AAAC instead of D5AA96
00/3F6B: C8                         INY             ;
00/3F6C: D004                       BNE   $3F72     ;
00/3F6E: E626                       INC   $26       ;
00/3F70: F024                       BEQ   $3F96     ;
00/3F72: BD8CC0                     LDA   $C08C,X   ;
00/3F75: 10FB                       BPL   $3F72     ;
00/3F77: C9D5                       CMP   #$D5      ; D5
00/3F79: D0F0                       BNE   $3F6B     ;
00/3F7B: EA                         NOP             ;
00/3F7C: BD8CC0                     LDA   $C08C,X   ;
00/3F7F: 10FB                       BPL   $3F7C     ;
00/3F81: C9AA                       CMP   #$AA      ; AA
00/3F83: D0F2                       BNE   $3F77     ;
00/3F85: A003                       LDY   #$03      ;
00/3F87: BD8CC0                     LDA   $C08C,X   ;
00/3F8A: 10FB                       BPL   $3F87     ;
00/3F8C: C9AC                       CMP   #$AC      ; AC
00/3F8E: D0E7                       BNE   $3F77     ;

00/3F90: A901                       LDA   #$01      ; we have an original disk
00/3F92: 85FC                       STA   $FC       ; exit with great satisfaction
00/3F94: 18                         CLC             ; and with the carry clear
00/3F95: 60                         RTS             ;

00/3F96: A900                       LDA   #$00      ; we have a copy
00/3F98: 85FC                       STA   $FC       ; exit with error
00/3F9A: 38                         SEC             ; and the carry set
00/3F9B: 60                         RTS             ;

00/3F9C: A986                       LDA   #$86      ; reset the movearm
00/3F9E: 8DA0B9                     STA   $B9A0     ; routine entry code
00/3FA1: A92B                       LDA   #$2B      ;
00/3FA3: 8DA1B9                     STA   $B9A1     ; STX $2B
00/3FA6: A985                       LDA   #$85      ; STA $2A
00/3FA8: 8DA2B9                     STA   $B9A2     ;
00/3FAB: A92A                       LDA   #$2A      ;
00/3FAD: 8DA3B9                     STA   $B9A3     ; with default values
00/3FB0: 60                         RTS             ; and return
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

MOVE ARM ROUTINE AT $B9A0 CALLS $BA69

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
00/B9A0: 2069BA                     JSR   $BA69     ; call modified movearm
                                    NOP             ;
                ...             ; the routine is as before and moves the arm

--- The modified version (at least, the entry of it)

00/BA69: 862B                       STX   $2B       ; save slot*16
00/BA6B: 852A                       STA   $2A       ; save required phase (or half-track)
00/BA6D: C9A0                       CMP   #$A0      ; is that 160d
00/BA6F: F006                       BEQ   $BA77     ; yes, jump
00/BA71: C906                       CMP   #$06      ; or less than 6d
00/BA73: 9002                       BCC   $BA77     ; yes, jump
00/BA75: E62A                       INC   $2A       ; no, increase phase

00/BA77: AD7804                     LDA   $0478     ; where was the head before?
00/BA7A: C906                       CMP   #$06      ; on less than 6d
00/BA7C: 9003                       BCC   $BA81     ; yes, jump
00/BA7E: EE7804                     INC   $0478     ; no, increase previous phase
00/BA81: A52A                       LDA   $2A       ; and get required halftrack back
00/BA83: 60                         RTS             ; return
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

LAST CHANGE, THE CHECK OF THE SECOND ADDRESS FIELD EPILOG MARKER (THE #$AA)

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
00/B979: BD8CC0                     LDA   $C08C,X   ;
00/B97C: 10FB                       BPL   $B979     ;
00/B97E: 2526                       AND   $26       ;
00/B980: 992C00                     STA   |$002C,Y  ;
00/B983: 4527                       EOR   $27       ;
00/B985: 88                         DEY             ;
00/B986: 10E7                       BPL   $B96F     ;
00/B988: A8                         TAY             ;
00/B989: C9B7                       CMP   #$B7      ; does nothing
00/B98B: BD8CC0                     LDA   $C08C,X   ;
00/B98E: 10FB                       BPL   $B98B     ;
00/B990: C9DE                       CMP   #$DE      ;
00/B992: D0AE                       BNE   $B942     ;
00/B994: EA                         NOP             ;
00/B995: BD8CC0                     LDA   $C08C,X   ;
00/B998: 10FB                       BPL   $B995     ;
00/B99A: 4CEDBF                     JMP   $BFED     ; does something (see below)
00/B99D: EA                         NOP             ;
00/B99E: 18                         CLC             ;
00/B99F: 60                         RTS             ;
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

AND THE SOMETHING... (NOT FAIR, YOU KNOW)

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
00/BFED: C9AA                       CMP   #$AA      ; check marker
00/BFEF: D00E                       BNE   $BFFF     ; not AA, crash

00/BFF1: A52F                       LDA   $2F       ; check T/S/V/CHECKSUM
00/BFF3: 452E                       EOR   $2E       ; EOR
00/BFF5: 052D                       ORA   $2D       ; ORA (hum, see below)
00/BFF7: 452C                       EOR   $2C       ; EOR
00/BFF9: D004                       BNE   $BFFF     ; must be zero
00/BFFB: A9AA                       LDA   #$AA      ; OK, we are good
00/BFFD: 18                         CLC             ; return
00/BFFE: 60                         RTS             ; with no error
00/BFFF: 38                         SEC             ;
                                    ...   welcome to the softswitch area

When a sector is written onto disk, the routine at $BC56 also uses the same
EOR/ORA checksum calculation, that is why a standard disk routine cannot read
a sector!
   00/BC97: A541                       LDA   $41
   00/BC99: 4544                       EOR   $44
   00/BC9B: 053F                       ORA   $3F
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

--- Where does the arm go?

87FC:A2 60 86 2B
8800:48 20 DA FD A9 A0 20 ED
8808:FD AD 78 04 20 DA FD A9
8810:AE 20 ED FD 68 A2 60 20
8818:69 BA 48 20 DA FD A9 A0
8820:20 ED FD AD 78 04 20 DA
8828:FD A9 8D 20 ED FD 68 A2
8830:60 60
B9A0:20 FC 87 EA
3F00G

It shows
00.30-00.31 on entry
If you reset
00.00-00.00, and that's it
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