fc2ブログ

2012 11 02
libmenu 1.6のDLリンクが切れていたようなので
ファイルを別の場所へアップロードし直しました。

http://magicsave.blog25.fc2.com/blog-entry-50.html
スポンサーサイト



MagicSave Ver 3.63 リリース

2012 11 01

MagicSave Ver 3.63 リリース


しばらくPSPから離れていた為、更新がかなり遅れましたが、
今さらながらCFW 6.60に対応しました。




続2 > MagicSaveがCFW 6.60で動作しない件について

2012 10 30
続1 > MagicSaveがCFW 6.60で動作しない件について
この件はあれから解決出来たので、
このまま問題がなければ遅くても今週中には
CFW 6.60対応 MagicSaveをリリースします。

続1 > MagicSaveがCFW 6.60で動作しない件について

2012 10 29
MagicSave include/hook.c hookFindSyscallAddr関数 参照
asm( "cfc0 %0, $12;" : "=r"( cop0_ctrl_register_12 ) );
MagicSaveが動かない原因はここにあって
構造体の変更によりsyscallテーブル取得がうまく出来なくなっている!?らしい。

もしくはCFW側によってプラグイン起動前にsyscall置き換えがされてしまっている。

別方法による関数フックが必要でsceChnnlsv関係のはどうにかなるかもしれないけど
sceIoReadのフックがどうも上手くいかない。
sceIoReadを含むFW6.60のiofilemgr.prxをprxtoolで
disassembleして見ると以下のようになっている。
; Subroutine IoFileMgrForUser_6A638D83 - Address 0x000040E0 - Aliases: IoFileMgrForKernel_6A638D83
; Exported in IoFileMgrForUser
; Exported in IoFileMgrForKernel
IoFileMgrForUser_6A638D83:		; Refs: 0x00000638 
	0x000040E0: 0x27BDFFF0 '...'' - addiu      $sp, $sp, -16
	0x000040E4: 0xAFBF0000 '....' - sw         $ra, 0($sp)
	0x000040E8: 0x0C00134F 'O...' - jal        sub_00004D3C
	0x000040EC: 0x00003821 '!8..' - move       $a3, $zr
	0x000040F0: 0x8FBF0000 '....' - lw         $ra, 0($sp)
	0x000040F4: 0x03E00008 '....' - jr         $ra
	0x000040F8: 0x27BD0010 '...'' - addiu      $sp, $sp, 16
そこで

#define MAKE_CALL(a, f)	_sw(0x0C000000 | (((u32)(f) >> 2) & 0x03FFFFFF), a);

typedef struct SceModule2 {
    struct SceModule2   *next;
    unsigned short      attribute;
    unsigned char       version[2];
    char                modname[27];
    char                terminal;
    unsigned int        unknown1;
    unsigned int        unknown2;
    SceUID              modid;
    unsigned int        unknown3[2];
    u32         mpid_text;  // 0x38
    u32         mpid_data; // 0x3C
    void *              ent_top;
    unsigned int        ent_size;
    void *              stub_top;
    unsigned int        stub_size;
    unsigned int        unknown4[5];
    unsigned int        entry_addr;
    unsigned int        gp_value;
    unsigned int        text_addr;
    unsigned int        text_size;
    unsigned int        data_size;
    unsigned int        bss_size;
    unsigned int        nsegment;
    unsigned int        segmentaddr[4];
    unsigned int        segmentsize[4];
} SceModule2;

int (*_sceIoRead)(SceUID , void *, SceSize ) = NULL;

int hk_sceIoRead(SceUID fd, void *data, SceSize size)
{
	int k1 = pspSdkSetK1( 0 );
		
	int ret = _sceIoRead(fd,data,size);
	
	pspSdkSetK1( k1 );
	
	return ret;
}

void ClearCaches(void)
{
	sceKernelDcacheWritebackAll();
	sceKernelIcacheClearAll();
}

void hook()
{
	SceModule2 *module = (SceModule2 *)sceKernelFindModuleByName( "sceIOFileManager" );
	u32 tex_addr;

	if( module )
	{
		_sceIoRead = (void*)(module->text_addr + 0x4D3C);
		text_addr = (u32)(module->text_addr + 0x40E8);

		MAKE_CALL(text_addr, hk_sceIoRead);
		ClearCaches();
	}
}
このように一般的な方法でフックしてみても瞬時にフリーズ
うーん、間違いや別の打開法などなどあれば情報を

sceKernelQuerySystemCallを使う方法もあるけれど
それは戻り値が-1でダメなようだ。

FW6.60でのsceKernelQuerySystemCallは以下のmodname、libname、nid
sceInterruptManager、InterruptManagerForKernel,0xF153B371

MagicSaveがCFW 6.60で動作しない件について

2012 10 24
お久しぶりです、しばらくPSPから離れていたため更新が遅れました。

MagicSaveを動作させる為に必要な関数へのHookが
CFW 6.60では何らかの原因により既存の方法では正常に行われていない模様
その為、現在は動作不可になっていました。

断言は出来ませんが別の方法で対処可能だと思われるので
しばらくお待ちください。
 | HOME | Next »