Playstation memory hack

Alle 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.S

indeholder 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.asm

Indeholder 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 (a1d0:Bits

	move.w	d6,d0			;d6:Akt Wort

	lsr.l	d1,d6			;nächste Bits nach vorne bringen

	sub.w	d1,d7			;d7:Anz Bits, die noch im Wort sind

	bgt.s	.GBNoLoop

;	add.w	#16,d7			;BitCounter korrigieren

	add.w	d3,d7			;BitCounter korrigieren

	ror.l	d7,d6			;restliche Bits re rausschieben

	move.w	-(a2),d6		;nächstes Wort holen

	rol.l	d7,d6			;und zurückrotieren

.GBNoLoop:

	add.w	d1,d1			;*2 (in Tab sind Ws)

	and.w	.AndData-2(pc,d1.w),d0	;unerwünschte Bits rausschmeißen

	rts

*----------

.AndData:

	dc.w	%1,%11,%111,%1111,%11111,%111111,%1111111

	dc.w	%11111111,%111111111,%1111111111

	dc.w	%11111111111,%111111111111

	dc.w	%1111111111111,%11111111111111

*-----------

.DecrEnd:

	rts		;a5: Start of decrunched Data







*	Dc.b	'CrM2'

cs:



	incbin	'asmpro:sources/psxboot/v3/reader.crm2'



ce:

oldcachebits:	dc.l	0

message:	dc.b	'psxmemcard reader bootblock v1.3 '

end_message:

		%gettime

		dc.b	0

		%getdate

end:

	dcb.b	1024-(end-start),0

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:

home