Playstation memory hackAlle Rettigheder forbeholdes. Denne her tekst og dertilhørende source kode må ikke hverken helt eller delvist danne grundlage for kommerciel produkter.Advarsel, dette hack har ikke til formål at gemme/skrive savegames på memory kort, men at levere et lille simplet men effektiv adgangs begrænsnings system til amiga`en.System består af en lille simple adaptor til parallel porten som muligøre brugen af playstation memory kort på amiga`en og en custom bootblock som kan installers på harddisk eller floppy. Ideen er simpel, når du reseter eller tænder din amiga, checker den alle drev for om der er en bootblock på dem. Her kommer den nye bootblock ind i billeded, så snart at bootblocken er læse ind i system, forsøgere den at læse 128bytes ind fra memory kortet som sidder på parallel porten, herefter bliver passwordet verificeret og hvis det er gyldigt boot amiga`en vider som inter var sket, men hvis passwordet er forket eller der ikke er noget memory kort på parallel porten, bliver man mødt af en advarsel og man kan ikke boot vidre ind i system. Selv om man går ind i early boot menu og disable eller vil boot på et andet drev( hvis der er flere bootable partioner eller drev) vil man ikke kunne omgåes den bootblock. eneste mulighed er at boot ind via en floppy disk men det er jo bare disable floppy drev, for helt ærligt hvor meget bruger man det i dag ? Infomation om hvordan du bygger interface`et mellem memory kort og parallel porten, ligger på aminet, jeg gider ikke lige at forklare det men det er ret nemt. boot blocken består af to dele, Boot_psxmem_crypt.S og reader.asm. Boot_psxmem_crypt.Sindeholder routiner til at finde udaf om det er kickstart 1.x eller en 2.x/3.x som er i maskinen og en routine til at pakke den næste del ud.reader.asmIndeholder selv læse routinen, password checkeren og advarsel delen. Denne del skal efter assemblering pakkes med CrunchMania.jeg har ikke lavede noget program til at installer bootblock`en på hd`en, det kan nemt klare med f.eks VirusZ. Der er heller ikke nogen program til at installer passwordet på memory kortet, men hente MCcontrol fra Aminet, formatere dit memory kort og download det, derefter kan du med en hexeditor skrive dig password ind i de første 4bytes i det images som MCcontroler har downloadet. Ellers kan du bruge psxmemcard_reader og psxmemcard_writer, reader læser et image ned i filen PROGDIR:psxmemcard.image og writeren skriver det tilbage. Sourcen til bootblocken er i ASMone format. Download koden som en lha pakke
Alle Rettigheder forbeholdes. Denne her tekst og dertilhørende source kode må ikke hverken helt eller delvist danne grundlage for kommerciel produkter.
Boot_psxmem_crypt.S
;APS000002AA000002AA000002AA000002AA000002AA000002AA000002AA000002AA000002AA000002AA
**
** Psxmemcard reader Bootblock v1.3
**
** læser 128 byte ind fra et psx memcard
** via parallel porten.
**
** et memcard kan max være 65536 frames af 128 blocks = 8Mb
**
** v1.0 første version
** v1.1 kommer med en alert hvis der en fejl
** v1.2 virker også på >kickstart 2.x
** v1.3 Rette alert texten så den kan være på en v1.x 60 tegens skærm også
**
**
** Jeg gider ikke at samle det hele i et lille program som alm.
** bruger også kan finde ud af det.
**
**
** todo:
**
** længer password og et lille program til at gemme password på
** memcardet.
**
**
** Assembler because it makes me feel good!
**
*DBUG = $1
WRITE = $1
IFD WRITE
AUTO ws\start\0\2\cc\
ENDC
printt "psx memcard bootblock reader"
printt "Options used:"
printt "-------------"
printt "current size "
printv end-start
printt "freespace "
printv 1024-(end-start)
printt "crypt size"
printv ce-cs
IFD DBUG
printt "Running in debug mode"
ENDC
incdir asm_includes:
include exec_lib.i
include exec/types.i
include exec/memory.i
include exec/execbase.i
include graphics/text.i
include graphics/gfx.i
include graphics/rastport.i
include intuition_lib.i
dataport = $bfe101
dirport = $bfe301
ctrlport = $bfd000
ctrldir = $bfd200
MEMCARD_SELECT = $81
MEMCARD_READ = $52
MEMCARD_WRITE = $57
Start:
IFND DBUG
dc.l $444f5300
dc.b "SUM!"
dc.l $370
ENDC
Main:
IFD DBUG
move.l 4.w,a6
ENDC
* cmp.w #37,lib_version(a6)
* blt.w init13
movem.l d0-d7/a0-a6,-(a7)
* jsr _LVOCacheClearU(a6)
* move.l #-1,d1 ;cache mask
* jsr _LVOCacheControl(a6) ;cache control
* lea.l oldcachebits(pc),a0
* move.l d0,(a0)
* bsr.w normalize
*******************************************
** fanger size på det udpakkede størelse **
*******************************************
lea.l cs(pc),a0 * Crm! header
move.l 6(a0),d0 * størelse på det upakkede
* move.l #600,d0 * size
move.l #[MEMF_FAST|MEMF_CLEAR],d1 * fastmem
jsr _LVOallocmem(a6)
move.l d0,a1
lea.l cs(pc),a0
bsr.w normaldecrunch
move.l a1,-(a7)
* move.l $4.w,a6
Restorecache: ;restore the cache bits
* lea.l oldcachebits(pc),a0
* tst.l (a0)
* beq.s noturbo
* lea.l oldcachebits(pc),a0
* move.l (a0),d0
* move.l #-1,d1 ;cache mask
* jsr -648(a6) ;cache control
noturbo:
* lea.l cs(pc),A0
* jmp (A0)
jsr _LVOCacheClearU(a6)
move.l (a7)+,a0
jmp (a0)
* BRA cs
***------------------------------------------------------------------------
*** This is the ultimate Data-Decrunch-Routine
*** for Crunch-Mania V1.4
*** (c) 1991 by FRESH THRASH of CERBERUS, all rights reserved
*** You may use this piece of code as long as you don't claim that
*** you have written it. In any case the author (me) has to be
*** mentioned someplace in your proggy.
*** Note: Source- and Destinationaddresses have to be always even Addresses
***------------------------------------------------------------------------
*** Here is the Format of the Header:
*** Type Offset Contents Function
*** LONG 0 "CrM!" to recongnize crunched files
*** WORD 4 Minimum Security Distance to savely decrunch data when
*** Source and Dest is in the same
*** Memoryblock
*** LONG 6 Original Len Datalen before packing
*** LONG 10 ($a) Crunched Len Datalen after packing without
*** Header
**-----------------------------------------------------------
** Jump here to decrunch some data without any overlap checks
** The Regs have to loaded with:
** a0: Adr of Source (with Header)
** a1: Adr of Dest
**-----------------------------------------------------------
NormalDecrunch:
movem.l d0-d7/a0-a6,-(sp)
cmp.l #"CrM!",(a0)+
bne.s .NotCrunched
tst.w (a0)+ ;skip MinSecDist
move.l (a0)+,d1 ;OrgLen
move.l (a0)+,d2 ;CrLen
move.l a0,a2
bsr.s FastDecruncher
.NotCrunched:
movem.l (sp)+,d0-d7/a0-a6
rts
**-------------------------------------------------------------------
** This is the pure Decrunch-Routine
** The Registers have to be loaded with the following values:
** a1: Adr of Destination (normal) ** a2: Adr of Source (packed)
** d1: Len of Destination ** d2: Len of Source
**-------------------------------------------------------------------
FastDecruncher:
move.l a1,a5 ;Decrunched Anfang (hier Ende des Decrunchens)
add.l d1,a1
add.l d2,a2
move.w -(a2),d0 ;Anz Bits in letztem Wort
move.l -(a2),d6 ;1.LW
moveq #16,d7 ;Anz Bits
sub.w d0,d7 ;Anz Bits, die rotiert werden müssen
lsr.l d7,d6 ;1.Bits an Anfang bringen
move.w d0,d7 ;Anz Bits, die noch im Wort sind
moveq #16,d3
moveq #0,d4
.DecrLoop:
cmp.l a5,a1
ble.L .DecrEnd ;a1=a5: fertig (a1
reader.asm;APS000013B3000013B3000013B3000013B3000013B3000013B3000013B3000013B3000013B3000013B3 ** ** reader v1.3 ** ** v1.0 først version som virker ** v1.1 bruger nu en alert til at fortælle om access denide ** v1.2 virker på >kickstart 2.x ** v1.3 Rette alert texten så den kan være på en v1.x 60 tegens skærm også ** ** Mmmm, der er ikke noget bedre end at sidde og se om man ikke ** lige kan vinde et par bytes ekstra... ** ** Assembler because it makes me feel good! ** incdir asm_includes: include exec_lib.i include exec/types.i include exec/memory.i include exec/execbase.i include graphics/text.i include graphics/gfx.i include graphics/rastport.i include intuition_lib.i printt "size of reader part :" printv ce-cs RECOVERY_ALERT = $00000000 ; the system can recover from this DEADEND_ALERT = $80000000 ; no recovery possible, this is it dataport = $bfe101 dirport = $bfe301 ctrlport = $bfd000 ctrldir = $bfd200 MEMCARD_SELECT = $81 MEMCARD_READ = $52 MEMCARD_WRITE = $57 * auto wb\cs\ce\ move.l $4.w,A6 cs: ** først allocere vi ram til at læsememcard`et over i move.l #128,d0 * size move.l #[MEMF_FAST|MEMF_CLEAR],d1 * fastmem jsr _LVOallocmem(a6) tst.l d0 beq.w deadend * tjek lea.l buffer(pc),a0 move.l d0,(a0) * gemmer pointeren til det bufferen ** vi begynder nu at sætte paralleporten op MOVE.B #7,DIRPORT * d0,d1,d2 til output MOVE.B #$FF,DATAPORT * Output HIGH BCLR #1,DATAPORT * SELCET memorycard * her følger comando header til memcardet * * skal laver om til et komando array istedet fylder mindre * move.l #MEMCARD_SELECT,D0 bsr.w write_byte moveq #MEMCARD_READ,D0 bsr.w write_byte * da write_byte ikke ødelægger D0 genbruger vi den moveq #00,D0 ** 2 bytes start data, 2 bytes high low, 1 byte ack, 1 byte header ** 2 byte data address ialt 8 bytes move.l #7,d4 .loop: bsr.w write_byte dbra d4,.loop bsr.w wait * data block read * move.l #00,d5 lea.l buffer(pc),a1 move.l (a1),a0 move.l #127,d5 .read: bsr.w read_byte bsr.w wait dbra d5,.read * Xor code * bsr.w write_byte * end flag * bsr.w write_byte ** her følger check del for at se om den ** indeholder den rigtig kode for at boot vidre lea.l buffer(pc),a1 lea.l password(pc),a0 move.l #[end_password-password],d0 .readloop: cmpm.b (a0)+,(a1)+ beq deadend dbra d0,.readloop movem.l (a7)+,d0-d7/a0-a6 cmp.w #37,lib_version(a6) blt.b init13 *tjek exec.libary for 2.x eller højre *** Standard 2.0+ bootblock code Init20: lea expansion.name(pc),a1 moveq #37,d0 jsr -552(a6) ;OpenLibrary() tst.l d0 beq.b init13 move.l d0,a1 bset #6,34(a1) jsr -414(a6) ;CloseLibrary() init13: lea dos.name(pc),a1 jsr -96(a6) ;FindResident() tst.l d0 beq.b .nodos move.l d0,a0 move.l 22(a0),a0 moveq #0,d0 rts .nodos moveq #-1,d0 rts ******************* ** Underroutiner ** ******************* deadend: MOVE.L #DEADEND_ALERT,D4 show: lea.l intuition.name(pc),a1 moveq #00,d0 jsr _LVOopenlibrary(a6) * lea.l intuitionbase(pc),a0 * move.l d0,(a0) move.l d0,a6 move.l d4,d0 * moveq #00,d0 lea.l alert_message(PC),a0 move.l #100,d1 jsr _LVOdisplayalert(a6) .fejl bra.b .fejl * M$(tm) windows 2000 Main Loop wait: movem.l d0-d2,-(a7) move.l #50,d0 .wait: MOVEQ #$09,D2 MOVEQ #$01,D1 MULU.W #$0002,D1 ADD.L D1,D1 DIVU.W #$0007,D1 MULU.W #$0009,D1 ADDQ.W #1,D1 LSL.W #8,D1 SUBQ.L #1,D0 BNE.B .wait movem.l (a7)+,d0-d2 RTS write_byte: MOVEQ #00,D1 MOVEQ #07,D2 MOVEQ #00,D3 ** oversætter command_data byten til en serier på 8bits som sendes over busy pinen ** på parallel porten .put_loop: BTST D1,D0 BNE.B .put_set BCLR #0,DATAPORT * BUSY low BRA.B .put_exit .put_set: BSET #0,DATAPORT * BUSY high .put_exit: BCLR #2,DATAPORT * SELECT high BTST #0,CTRLPORT BEQ.B .noret_set BSET D1,D3 .noret_set: ORI.B #$04,DATAPORT BSET #2,DATAPORT * SELECT ADDQ.L #01,D1 DBRA D2,.put_loop rts read_byte: MOVEQ #00,D1 MOVEQ #07,D2 MOVEQ #$00,D4 ** oversætter command_data byten til en serier på 8bits som sendes over busy pinen ** på parallel porten .loop: BTST D1,D0 BNE.B .set BCLR #0,DATAPORT * BUSY LOW BRA.B .exit .set: BSET #0,DATAPORT * BUSY HIGH .exit: BCLR #2,DATAPORT * SELECT LOW * tjeker busy pin for 0 eller 1 * BTST #0,CTRLPORT * BUSY BNE.B .setdatabit BCLR D1,D4 BRA.B .ud .setdatabit: BSET D1,D4 .ud: .nosave: BSET #2,DATAPORT * SELECT HIGH ADDQ #01,D1 DBRA D2,.loop MOVE.B D4,(A0)+ rts expansion.name dc.b 'expansion.library',0 dos.name dc.b 'dos.library',0 intuition.name dc.b 'intuition.library',0 alert_message: dc.b 0,$f0,$14,'Access denied',0,1 dc.b 0,$c0,$1e,'Kan du læse dette er det fordi',0,1 dc.b 0,$80,$27,'du ikke har noget at gøre på Denne computer!',0,1 dc.b 0,$d0,$40,'så Smut fister futmælk!',0,0,0,0 password: dc.b 'RA11' end_password: intuitionbase dc.l 0 buffer: dc.l 0 ce: |