Example #1
0
void patch_drm(SceModule2 *module) {
    kprintf("Patching scePspNpDrm_user\n");
    sceNpDrmSetLicenseeKey_func = NULL;
    // sceNpDrmSetLicenseeKey
    if(hook_import_bynid(module, "scePspNpDrm_user", 0xA1336091, np_setkey, 1) < 0) {
         kprintf(">> hook to sceNpDrmSetLicenseeKey failed\n");
         // sceNpDrmEdataSetupKey
         sceNpDrmEdataSetupKey_func = NULL;
         if(hook_import_bynid(module, "scePspNpDrm_user", 0x08D98894, np_setup, 1) >= 0) {
             lolwut_found = 1;
             kprintf("lolwut? using npdrm without initializing the drm seed??\n");
             kprintf(">> hook to sceNpDrmEdataSetupKey succeeded\n");
         }
    }
}
Example #2
0
static int popcorn_patch_chain(SceModule2 *mod)
{
	printk("%s: %s\n", __func__, mod->modname);

	if (0 == strcmp(mod->modname, "pops")) {
		u32 text_addr = mod->text_addr;

		printk("%s: patching pops\n", __func__);

		if(g_is_custom_ps1) {
			patch_decompress_data(text_addr);
		}

		if(g_icon0_status) {
			patch_icon0_size(text_addr);
		}

		sceMeAudio_67CD7972 = (void*)sctrlHENFindFunction("scePops_Manager", "sceMeAudio", g_offs->pops_patch.sceMeAudio_67CD7972_NID);
		hook_import_bynid((SceModule*)mod, "sceMeAudio", g_offs->pops_patch.sceMeAudio_67CD7972_NID, _sceMeAudio_67CD7972, 1);
		_sw(0x24020001, text_addr + g_offs->pops_patch.manualNameCheck[psp_model]);

		sync_cache();
	}

	if( conf.noanalog ) {
		patch_analog_imports((SceModule*)mod);
	}

	if(g_previous)
		return g_previous(mod);
	
	return 0;
}
Example #3
0
void patch_drm_imports(SceModule *mod)
{
	u32 i;

	for(i=0; i<NELEMS(g_nodrm_hook_map); ++i) {
		hook_import_bynid(mod, g_nodrm_hook_map[i].libname, g_nodrm_hook_map[i].nid, g_nodrm_hook_map[i].hook_addr, 1);
	}
}
Example #4
0
void patch_module_for_version_spoof(SceModule *mod1)
{
	u32 text_addr;
	SceModule2 *mod = (SceModule2*)mod1;
	
	if (mod == NULL) {
		return;
	}

	text_addr = mod->text_addr;

	if(text_addr & 0x80000000) {
		// kernel module
		hook_import_bynid((SceModule*)mod, "sceResmgr_driver", 0x9DC14891, (void*)versionspoofer, 0);
	} else {
		// user module (hooking requires 0x4001 export in exports.exp)
		hook_import_bynid((SceModule*)mod, "sceResmgr", 0x9DC14891, (void*)versionspoofer, 1);
	}
}
Example #5
0
static void patch_scePops_Manager(void)
{
	SceModule2 *mod;
	u32 text_addr;
	size_t i;

	mod = (SceModule2*) sceKernelFindModuleByName("scePops_Manager");
	text_addr = mod->text_addr;

	for(i=0; i<NELEMS(g_io_hooks); ++i) {
		hook_import_bynid((SceModule*)mod, "IoFileMgrForKernel", g_io_hooks[i].nid, g_io_hooks[i].fp, 0);
	}

	if(g_offs->popsman_patch.get_rif_path != 0xDEADBEEF) {
		_get_rif_path = (void*)(text_addr + g_offs->popsman_patch.get_rif_path);
		_sw(MAKE_CALL(&get_rif_path), text_addr + g_offs->popsman_patch.get_rif_path_call1);
		_sw(MAKE_CALL(&get_rif_path), text_addr + g_offs->popsman_patch.get_rif_path_call2);
	}

	sceNpDrmGetVersionKey = (void*)sctrlHENFindFunction("scePspNpDrm_Driver", "scePspNpDrm_driver", 0x0F9547E6);
	scePspNpDrm_driver_9A34AC9F = (void*)sctrlHENFindFunction("scePspNpDrm_Driver", "scePspNpDrm_driver", 0x9A34AC9F);

	if(g_offs->popsman_patch.sceNpDrmGetVersionKeyCall != 0xDEADBEEF) {
		_sw(MAKE_CALL(_sceNpDrmGetVersionKey), text_addr + g_offs->popsman_patch.sceNpDrmGetVersionKeyCall);
	}

	if(g_offs->popsman_patch.scePspNpDrm_driver_9A34AC9F_Call != 0xDEADBEEF) {
		_sw(MAKE_CALL(_scePspNpDrm_driver_9A34AC9F), text_addr + g_offs->popsman_patch.scePspNpDrm_driver_9A34AC9F_Call);
	}

	// remove the check in scePopsManLoadModule that only allows loading module below the FW 3.XX
	if(g_offs->popsman_patch.scePopsManLoadModuleCheck != 0xDEADBEEF) {
		_sw(NOP, text_addr + g_offs->popsman_patch.scePopsManLoadModuleCheck);
	}

	if (g_is_custom_ps1) {
		for(i=0; i<NELEMS(g_amctrl_hooks); ++i) {
			hook_import_bynid((SceModule*)mod, "sceAmctrl_driver", g_amctrl_hooks[i].nid, g_amctrl_hooks[i].fp, 0);
		}
	}
}
Example #6
0
void patch_load_module(SceModule *mod)
{
	hook_import_bynid(mod, "ModuleMgrForUser", 0x977DE386, &myKernelLoadModule, 1);
}
static void patch_sceUmdMan_driver(SceModule* mod)
{
	if(is_homebrews_runlevel()) {
		hook_import_bynid(mod, "InitForKernel", 0x27932388, _sceKernelBootFromForUmdMan, 0);
	}
}
static int syspatch_module_chain(SceModule2 *mod)
{
	int apitype;

	apitype = sceKernelInitApitype();
	
#ifdef DEBUG
	printk("Starting %s Apitype: 0x%X\n", mod->modname, apitype);
	hook_import_bynid((SceModule*)mod, "KDebugForKernel", 0x84F370BC, printk, 0);
#endif

	if (is_system_booted()) {
		if(0 == strcmp(mod->modname, "sceNpSignupPlugin_Module")) {
			patch_npsignup(mod->text_addr);
			sync_cache();
			goto exit;
		}

		if(0 == strcmp(mod->modname, "sceVshNpSignin_Module")) {
			patch_npsignin(mod->text_addr);
			sync_cache();
			goto exit;
		}

		if(0 == strcmp(mod->modname, "sceNp")) {
			patch_np(mod->text_addr, 9, 90);
			sync_cache();
			goto exit;
		}

		if(conf.usbversion && 0 == strcmp(mod->modname, "sceUSB_Stor_Ms_Driver")) {
			patch_sceUSB_Stor_Ms_Driver((SceModule*)mod);
			goto exit;
		}

		system_booted_action();
		patch_module_for_version_spoof((SceModule*)mod);
		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceLoadExec")) {
		u32 key_config;

		key_config = sceKernelApplicationType();
		
		if (key_config == PSP_INIT_KEYCONFIG_GAME) {
			if(PSP_1000 != psp_model) {
				prepatch_partitions();
				sync_cache();
			}
		}

		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceSYSCON_Driver")) {
		resolve_syscon_driver((SceModule*)mod);
		goto exit;
	}

	// load after lflash
	if(0 == strcmp(mod->modname, "sceDisplay_Service")) {
		load_config();
		patch_sceLoadExec();
		sync_cache();
		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceMediaSync")) {
		patch_sceMediaSync(mod->text_addr);
		sync_cache();
		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceUmdMan_driver")) {
		patch_sceUmdMan_driver((SceModule*)mod);
		sync_cache();
		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceUmdCache_driver")) {
		patch_umdcache(mod->text_addr);
		sync_cache();
		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceWlan_Driver")) {
		patch_sceWlan_Driver(mod->text_addr);
		sync_cache();
		goto exit;
	}

	if(0 == strcmp(mod->modname, "scePower_Service")) {
		patch_scePower_Service(mod->text_addr);
		sync_cache();
		goto exit;
	}

	if(0 == strcmp(mod->modname, "sceMesgLed")) {
		patch_mesgled((SceModule*)mod);
		sync_cache();
		goto exit;
	}

	if (0 == strcmp(mod->modname, "sceImpose_Driver")) {
		patch_sceChkreg();
		disable_PauseGame(mod->text_addr);
		usb_charge();
		sync_cache();
		goto exit;
	} 

	if(psp_model == PSP_GO && 0 == strcmp(mod->modname, "pspMarch33_Driver")) {
		patch_pspMarch33_Driver(mod->text_addr);
		sync_cache();
		goto exit;
	}

#ifdef DEBUG
	if(0 == strcmp(mod->modname, "sceKernelLibrary")) {
		printk_sync();
		printk("printk synchronized\n");
		goto exit;
	}
#endif

exit:
	if (previous)
		return (*previous)(mod);

	return 0;
}
void patch_sceLoaderCore(void)
{
	//find module
	SceModule2 * loadcore = (SceModule2 *)sctrlKernelFindModuleByName("sceLoaderCore");

	//patch sceKernelCheckExecFile (sub_0C10)
	_sw((unsigned int)_sceKernelCheckExecFile, loadcore->text_addr + g_offs->loadercore_patch.sceKernelCheckExecFilePtr);
	_sw(MAKE_CALL(_sceKernelCheckExecFile), loadcore->text_addr + g_offs->loadercore_patch.sceKernelCheckExecFileCall1);
	_sw(MAKE_CALL(_sceKernelCheckExecFile), loadcore->text_addr + g_offs->loadercore_patch.sceKernelCheckExecFileCall2);
	_sw(MAKE_CALL(_sceKernelCheckExecFile), loadcore->text_addr + g_offs->loadercore_patch.sceKernelCheckExecFileCall3);

	//6.35 relocation fix for rt7
	//fake relocation type 7 to be treated like 0
	//patches handler table so jr $t5 returns properly on type 7 ;)
	u32 faketype = 0;
	u32 origtype = 7;
	_sw(*(u32 *)(loadcore->text_addr + g_offs->loadercore_patch.ReloactionTable + faketype * 4), loadcore->text_addr + g_offs->loadercore_patch.ReloactionTable + origtype * 4);

	//patch ProbeExec1 (sub_001AC)
	ProbeExec1 = (void*)loadcore->text_addr + g_offs->loadercore_patch.ProbeExec1; //dword_6248
	_sw(MAKE_CALL(_ProbeExec1), loadcore->text_addr + g_offs->loadercore_patch.ProbeExec1Call);

	//patch ProbeExec2 (sub_004E8)
	ProbeExec2 = (void*)loadcore->text_addr + g_offs->loadercore_patch.ProbeExec2; //dword_6364
	_sw(MAKE_CALL(_ProbeExec2), loadcore->text_addr + g_offs->loadercore_patch.ProbeExec2Call1);
	_sw(MAKE_CALL(_ProbeExec2), loadcore->text_addr + g_offs->loadercore_patch.ProbeExec2Call2);

	//enable syscall exports (?)
	_sw(0x3C090000, loadcore->text_addr + g_offs->loadercore_patch.EnableSyscallExport);
	
	//undo check #1
	_sw(0, loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreCheck1); //bnez

	//undo check #2
	_sw(0, loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreCheck2); //beqzl
	_sw(0, loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreCheck2 + 4); //lui (likely branch instruction)

	//undo check #3
	_sw(0, loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreCheck3); //beqzl
	_sw(0, loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreCheck3 + 4); //lui (likely branch instruction)

	// pops version check
	_sw(0x1000FFCB, loadcore->text_addr + g_offs->loadercore_patch.pops_version_check); // b loc_000075B4

	//undo rebootex patches
	void * memlmd_323366CA = (void*)sctrlHENFindFunction("sceMemlmd", "memlmd", g_offs->loadercore_patch.memlmd_323366CA_NID);
	_sw(MAKE_CALL(memlmd_323366CA), loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreUndo1Call1);
	_sw(MAKE_CALL(memlmd_323366CA), loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreUndo1Call2);
	_sw(MAKE_CALL(memlmd_323366CA), loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreUndo1Call3);
	void * memlmd_7CF1CD3E = (void*)sctrlHENFindFunction("sceMemlmd", "memlmd", g_offs->loadercore_patch.memlmd_7CF1CD3E_NID);
	_sw(MAKE_CALL(memlmd_7CF1CD3E), loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreUndo2Call1);
	_sw(MAKE_CALL(memlmd_7CF1CD3E), loadcore->text_addr + g_offs->loadercore_patch.LoaderCoreUndo2Call2);

	/* undo my own patches */
	_sw(0x1040002C, loadcore->text_addr + 0x58E0);
	_sw(0x0040F809, loadcore->text_addr + 0x58E8);

	void * sub_3E80 = (void*)loadcore->text_addr + 0x3E80;

	_sw(MAKE_CALL(sub_3E80), loadcore->text_addr + 0x3E00);
	_sw(MAKE_CALL(sub_3E80), loadcore->text_addr + 0x3F58);
	_sw(MAKE_CALL(sub_3E80), loadcore->text_addr + 0x58F8);
	_sw(MAKE_CALL(sub_3E80), loadcore->text_addr + 0x5908);

	_sw(0x10400009, loadcore->text_addr + 0x5944);
	_sw(0x0040F809, loadcore->text_addr + 0x5950);

	setup_nid_resolver();

#ifdef DEBUG
	hook_import_bynid((SceModule*)loadcore, "KDebugForKernel", 0x84F370BC, printk, 0);
#endif

	patch_sceKernelStartModule(loadcore->text_addr);
}