Compare commits
39 Commits
Author | SHA1 | Date |
---|---|---|
random() | f0c0fadd27 | |
random() | 5e4077f119 | |
random() | 33e88b4c67 | |
random() | 95392076e0 | |
SilicaAndPina | 4fe45136d4 | |
SilicaAndPina | c10076e0d1 | |
SilicaAndPina | 66ec55606e | |
SilicaAndPina | 3a238c4492 | |
SilicaAndPina | b7e5595058 | |
SilicaAndPina | f9c0272e81 | |
SilicaAndPina | 950e17fa13 | |
SilicaAndPina | a3a5e0647c | |
SilicaAndPina | 5681679d79 | |
SilicaAndPina | f7d307ba3d | |
SilicaAndPina | 884868f487 | |
SilicaAndPina | 12362e1668 | |
SilicaAndPina | d94da651a0 | |
SilicaAndPina | 691ccd6697 | |
SilicaAndPina | b8d972dda2 | |
AtelierWindows | 952c439df7 | |
AtelierWindows | f7cd62d71d | |
AtelierWindows | 794eb0d626 | |
AtelierWindows | 0c8b48cc12 | |
SilicaAndPina | c5b5af679a | |
AtelierWindows\SilicaAndPina | 1238e5e777 | |
AtelierWindows\SilicaAndPina | 355f463e00 | |
AtelierWindows\SilicaAndPina | a138f9ba7d | |
AtelierWindows\SilicaAndPina | d50d2ee2e4 | |
AtelierWindows\SilicaAndPina | bafebe6853 | |
SilicaAndPina | bb67543c5f | |
SilicaAndPina | 75eb152c69 | |
AtelierWindows\SilicaAndPina | 72b9f34c22 | |
AtelierWindows\SilicaAndPina | 56935b455f | |
SilicaAndPina | 6790b2ae05 | |
SilicaAndPina | 995f21b0dc | |
SilicaAndPina | d8f9ca4966 | |
SilicaAndPina | 6c2fe08323 | |
SilicaAndPina | c47aded2a8 | |
AtelierWindows\SilicaAndPina | 12e870dd5f |
|
@ -0,0 +1,46 @@
|
|||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
if(DEFINED ENV{VITASDK})
|
||||
set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file")
|
||||
else()
|
||||
message(FATAL_ERROR "Please define VITASDK to point to your SDK path!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
project(MakePsmGreatAgain)
|
||||
include("${VITASDK}/share/vita.cmake" REQUIRED)
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-q -Wall -O3 -std=gnu99")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-rtti -fno-exceptions")
|
||||
|
||||
include_directories(
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
|
||||
if (NOT ${RELEASE})
|
||||
add_definitions(-DENABLE_LOGGING)
|
||||
endif()
|
||||
|
||||
add_executable(MakePsmGreatAgain
|
||||
MakePsmGreatAgain.c
|
||||
)
|
||||
|
||||
target_link_libraries(MakePsmGreatAgain
|
||||
taihen_stub
|
||||
SceLibKernel_stub
|
||||
SceAppMgr_stub
|
||||
SceLibc_stub
|
||||
SceIofilemgr_stub
|
||||
)
|
||||
|
||||
set_target_properties(MakePsmGreatAgain
|
||||
PROPERTIES LINK_FLAGS "-nostdlib"
|
||||
)
|
||||
|
||||
vita_create_self(MakePsmGreatAgain.suprx MakePsmGreatAgain
|
||||
CONFIG ${CMAKE_SOURCE_DIR}/MakePsmGreatAgain.yml
|
||||
)
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2019 Li
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
|
@ -0,0 +1,344 @@
|
|||
//MakePSMGreatAgain
|
||||
//Build a wall and make Sony pay for it!
|
||||
//Probably with he money they stole from us
|
||||
//by deleting our PSM Purchases
|
||||
|
||||
#include <psp2/kernel/modulemgr.h>
|
||||
#include <taihen.h>
|
||||
#include <string.h>
|
||||
#include <vitasdk.h>
|
||||
#include "licenseinfo.h"
|
||||
|
||||
static SceUID CacheMounted;
|
||||
static tai_hook_ref_t CacheMounted_ref;
|
||||
|
||||
static SceUID SuiteCheckDrm;
|
||||
static tai_hook_ref_t SuiteCheckDrm_ref;
|
||||
|
||||
static SceUID UnityCheckDrm;
|
||||
static tai_hook_ref_t UnityCheckDrm_ref;
|
||||
|
||||
static SceUID SecurityCritical;
|
||||
static tai_hook_ref_t SecurityCritical_ref;
|
||||
|
||||
static SceUID PeekPositive;
|
||||
static tai_hook_ref_t PeekPositive_ref;
|
||||
|
||||
static SceUID LoadModuleHook = -1;
|
||||
static tai_hook_ref_t LoadModuleHook_ref;
|
||||
|
||||
|
||||
char titleid[12];
|
||||
|
||||
|
||||
int getFileSize(const char *file) {
|
||||
SceUID fd = sceIoOpen(file, SCE_O_RDONLY, 0);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
int fileSize = sceIoLseek(fd, 0, SCE_SEEK_END);
|
||||
sceIoClose(fd);
|
||||
return fileSize;
|
||||
}
|
||||
|
||||
int fileExists(const char *file) {
|
||||
if(getFileSize(file) <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int ReadFile(char *file, void *buf, int size) {
|
||||
SceUID fd = sceIoOpen(file, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 0777);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
int read = sceIoRead(fd, buf, size);
|
||||
|
||||
sceIoClose(fd);
|
||||
return read;
|
||||
}
|
||||
|
||||
|
||||
int WriteFile(char *file, void *buf, int size) {
|
||||
SceUID fd = sceIoOpen(file, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 0777);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
int written = sceIoWrite(fd, buf, size);
|
||||
|
||||
sceIoClose(fd);
|
||||
return written;
|
||||
}
|
||||
|
||||
static int sceCtrlPeekBufferPositive_patched(int port, SceCtrlData *ctrl, int count) {
|
||||
int ret = TAI_CONTINUE(int, PeekPositive_ref, port, ctrl, count);
|
||||
|
||||
if((ctrl->buttons & (SCE_CTRL_START|SCE_CTRL_UP)) == (SCE_CTRL_START|SCE_CTRL_UP))
|
||||
{
|
||||
sceAppMgrSetInfobarState(0, 0, 0);
|
||||
sceAppMgrLoadExec("app0:/eboot.bin", 0, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int sceAppUtilCacheMount_patched(){
|
||||
int ret;
|
||||
ret = TAI_CONTINUE(int, CacheMounted_ref);
|
||||
|
||||
sceIoMkdir("cache0:/_System",6);
|
||||
|
||||
if(!fileExists("cache0:/_System/Code"))
|
||||
{
|
||||
sceClibPrintf("Writing 'Code'\n");
|
||||
if(!strcmp(titleid,"PCSI00007"))
|
||||
WriteFile("cache0:/_System/Code",&SUITE_CODE,sizeof(SUITE_CODE));
|
||||
else
|
||||
WriteFile("cache0:/_System/Code",&UNITY_CODE,sizeof(UNITY_CODE));
|
||||
}
|
||||
|
||||
if(!fileExists("cache0:/_System/target_kdbg_list.dat"))
|
||||
{
|
||||
sceClibPrintf("Writing 'target_kdbg_list'\n");
|
||||
if(!strcmp(titleid,"PCSI00007"))
|
||||
WriteFile("cache0:/_System/target_kdbg_list.dat",&SUITE_TARGET,sizeof(SUITE_TARGET));
|
||||
else
|
||||
WriteFile("cache0:/_System/target_kdbg_list.dat",&UNITY_TARGET,sizeof(UNITY_TARGET));
|
||||
}
|
||||
|
||||
if(!fileExists("cache0:/_System/vseed.dat"))
|
||||
{
|
||||
sceClibPrintf("Writing 'vseed'\n");
|
||||
if(!strcmp(titleid,"PCSI00007"))
|
||||
WriteFile("cache0:/_System/vseed.dat",&SUITE_VSEED,sizeof(SUITE_VSEED));
|
||||
else
|
||||
WriteFile("cache0:/_System/vseed.dat",&UNITY_VSEED,sizeof(UNITY_VSEED));
|
||||
}
|
||||
|
||||
if(!fileExists("cache0:/_System/protected_kconsole_cache.dat"))
|
||||
{
|
||||
sceClibPrintf("Writing 'protected_kconsole_cache'\n");
|
||||
if(!strcmp(titleid,"PCSI00007"))
|
||||
WriteFile("cache0:/_System/protected_kconsole_cache.dat",&SUITE_KCONSOLE, sizeof(SUITE_KCONSOLE));
|
||||
else
|
||||
WriteFile("cache0:/_System/protected_kconsole_cache.dat",&UNITY_KCONSOLE, sizeof(UNITY_KCONSOLE));
|
||||
}
|
||||
|
||||
if(!fileExists("cache0:/_System/psmdrmboot.dat"))
|
||||
{
|
||||
sceClibPrintf("Writing 'psmdrmboot'\n");
|
||||
if(!strcmp(titleid,"PCSI00007"))
|
||||
WriteFile("cache0:/_System/psmdrmboot.dat",&SUITE_PSMDRMBOOT, sizeof(SUITE_PSMDRMBOOT));
|
||||
else
|
||||
WriteFile("cache0:/_System/psmdrmboot.dat",&UNITY_PSMDRMBOOT, sizeof(UNITY_PSMDRMBOOT));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ret0 (int *args)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
SceUID sceKernelLoadStartModule_patched(char *path, SceSize args, void *argp, int flags, SceKernelLMOption *option, int *status)
|
||||
{
|
||||
|
||||
|
||||
SceUID ret;
|
||||
ret = TAI_CONTINUE(SceUID, LoadModuleHook_ref, path, args, argp, flags, option, status);
|
||||
|
||||
if(strstr(path,"libmono.suprx")) //PSM
|
||||
{
|
||||
|
||||
SecurityCritical = taiHookFunctionExport(&SecurityCritical_ref,
|
||||
"SceLibMono",
|
||||
TAI_ANY_LIBRARY,
|
||||
0x02A867BC, //mono_security_enable_core_clr
|
||||
ret0);
|
||||
sceClibPrintf("SecurityCritical: %x\n",SecurityCritical);
|
||||
}
|
||||
|
||||
if(strstr(path,"libmono_bridge.suprx")) //PSM
|
||||
{
|
||||
/*
|
||||
int SceLibMonoBridge_70493FB9
|
||||
(char *sdk_version,undefined4 param_2,uint param_3,uint param_4,char *project_name,
|
||||
undefined4 param_6,void *output)
|
||||
|
||||
find offset by following the 5th paramater, into 3 different functions.
|
||||
you'll come accross a strcmp, lower down is a if(*unk_whatever = 1)
|
||||
thats the jump you wnat to patch.
|
||||
*/
|
||||
|
||||
tai_module_info_t info;
|
||||
info.size = sizeof(tai_module_info_t);
|
||||
taiGetModuleInfo("SceLibMonoBridge", &info);
|
||||
uint16_t patched_instruction = 0xBF00; //ARM9 "NO OPERATION"
|
||||
|
||||
int ret = 0;
|
||||
sceClibPrintf("%s: nid 0x%x\n",path,info.module_nid);
|
||||
switch(info.module_nid)
|
||||
{
|
||||
case 0x28D9013B: //SDK 2.00
|
||||
ret = taiInjectData(info.modid, 0, 0x132F8, &patched_instruction, 0x2);
|
||||
sceClibPrintf("TaiInjectData (sdk2.00) %x\n",ret);
|
||||
break;
|
||||
case 0x88B67542: //SDK 1.21
|
||||
ret = taiInjectData(info.modid, 0, 0x12e48, &patched_instruction, 0x2);
|
||||
sceClibPrintf("TaiInjectData (sdk1.21) %x\n",ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(strstr(path,"libpsm.suprx")) //PSM
|
||||
{
|
||||
|
||||
PeekPositive = taiHookFunctionImport(&PeekPositive_ref,
|
||||
"SceLibPsm",
|
||||
TAI_ANY_LIBRARY,
|
||||
0xA9C3CED6, // sceCtrlPeekBufferPositive
|
||||
sceCtrlPeekBufferPositive_patched);
|
||||
sceClibPrintf("PeekPositive: %x\n",PeekPositive);
|
||||
}
|
||||
|
||||
if(strstr(path,"libScePsmEdata.suprx")) //PSM Unity
|
||||
{
|
||||
|
||||
|
||||
/*
|
||||
finding offsets for project_name
|
||||
look at int ScePsmEdata_2EC7439C(int param_1,undefined4 param_2,uint param_3,uint param_4,char *project_name)
|
||||
|
||||
find offset by following the 5th paramater, into 3 different functions.
|
||||
you'll come accross a strcmp, lower down is a if(*unk_whatever = 1)
|
||||
thats the jump you wnat to patch.
|
||||
|
||||
for UnityCheckDrm look for sceIoGetStat,
|
||||
look at all cross references and the function
|
||||
that contiains one that has arg1 "cache0:/_System"
|
||||
is UnityCheckDrm().
|
||||
*/
|
||||
|
||||
tai_module_info_t info;
|
||||
info.size = sizeof(tai_module_info_t);
|
||||
taiGetModuleInfo("ScePsmEdata", &info);
|
||||
uint16_t patched_instruction = 0xBF00; //ARM9 "NO OPERATION"
|
||||
|
||||
int ret = 0;
|
||||
sceClibPrintf("%s: nid 0x%x\n",path,info.module_nid);
|
||||
switch(info.module_nid)
|
||||
{
|
||||
case 0xB4657632: //Unity 4.3.7.0
|
||||
ret = taiInjectData(info.modid, 0, 0x3b50, &patched_instruction, 0x2); //allow for all project_name
|
||||
sceClibPrintf("TaiInjectData (unity4.3.7.0) %x\n",ret);
|
||||
|
||||
|
||||
UnityCheckDrm = taiHookFunctionOffset(&UnityCheckDrm_ref,
|
||||
info.modid,
|
||||
0,
|
||||
0x5a62, //PsmDrmBootCheck
|
||||
1,
|
||||
ret0);
|
||||
sceClibPrintf("UnityCheckDrm: %x\n",UnityCheckDrm);
|
||||
|
||||
break;
|
||||
case 0x21AE6754: //Unity Base
|
||||
ret = taiInjectData(info.modid, 0, 0x10f9c, &patched_instruction, 0x2); //allow for all project_name
|
||||
sceClibPrintf("TaiInjectData (unity base) %x\n",ret);
|
||||
|
||||
UnityCheckDrm = taiHookFunctionOffset(&UnityCheckDrm_ref,
|
||||
info.modid,
|
||||
0,
|
||||
0x12eb2, //PsmDrmBootCheck
|
||||
1,
|
||||
ret0);
|
||||
sceClibPrintf("UnityCheckDrm: %x\n",UnityCheckDrm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void _start() __attribute__ ((weak, alias ("module_start")));
|
||||
void module_start(SceSize argc, const void *args) {
|
||||
|
||||
sceAppMgrAppParamGetString(0, 12, titleid, 256);
|
||||
|
||||
if(!strcmp(titleid,"PCSI00007"))
|
||||
{
|
||||
tai_module_info_t tai_info;
|
||||
tai_info.size = sizeof(tai_module_info_t);
|
||||
taiGetModuleInfo("ScePsmDev", &tai_info);
|
||||
|
||||
SuiteCheckDrm = taiHookFunctionOffset(&SuiteCheckDrm_ref,
|
||||
tai_info.modid,
|
||||
0,
|
||||
0xbe2, //SuiteCheckDrm
|
||||
1,
|
||||
ret0);
|
||||
sceClibPrintf("SuiteCheckDrmHook: %x\n",SuiteCheckDrm);
|
||||
}
|
||||
|
||||
if(!strcmp(titleid,"PCSI00009"))
|
||||
{
|
||||
tai_module_info_t tai_info;
|
||||
tai_info.size = sizeof(tai_module_info_t);
|
||||
taiGetModuleInfo(TAI_MAIN_MODULE, &tai_info);
|
||||
if(strstr(tai_info.name, "Unity"))
|
||||
{
|
||||
PeekPositive = taiHookFunctionImport(&PeekPositive_ref,
|
||||
TAI_MAIN_MODULE,
|
||||
TAI_ANY_LIBRARY,
|
||||
0x15F81E8C, // sceCtrlPeekBufferPositive2
|
||||
sceCtrlPeekBufferPositive_patched);
|
||||
sceClibPrintf("PeekPositive: %x\n",PeekPositive);
|
||||
}
|
||||
}
|
||||
|
||||
if(!strcmp(titleid,"PCSI00007") || !strcmp(titleid,"PCSI00009")) // PSM Runtime & PSM Unity Runtime
|
||||
{
|
||||
sceClibPrintf("Silca: I like to see girls die :3\n");
|
||||
sceClibPrintf("Loaded!\n");
|
||||
sceClibPrintf("Running on %s\n",titleid);
|
||||
|
||||
CacheMounted = taiHookFunctionImport(&CacheMounted_ref,
|
||||
TAI_MAIN_MODULE,
|
||||
TAI_ANY_LIBRARY,
|
||||
0x0AA56143, //sceAppUtilCacheMount
|
||||
sceAppUtilCacheMount_patched);
|
||||
|
||||
|
||||
LoadModuleHook = taiHookFunctionImport(&LoadModuleHook_ref,
|
||||
TAI_MAIN_MODULE,
|
||||
TAI_ANY_LIBRARY,
|
||||
0x2DCC4AFA, //sceKernelLoadStartModule
|
||||
sceKernelLoadStartModule_patched);
|
||||
|
||||
sceClibPrintf("LoadModuleHook: %x\n",LoadModuleHook);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
int module_stop(SceSize argc, const void *args) {
|
||||
|
||||
// release hooks
|
||||
|
||||
if (CacheMounted >= 0) taiHookRelease(CacheMounted, CacheMounted_ref);
|
||||
if (SuiteCheckDrm >= 0) taiHookRelease(SuiteCheckDrm, SuiteCheckDrm_ref);
|
||||
if (UnityCheckDrm >= 0) taiHookRelease(UnityCheckDrm, UnityCheckDrm_ref);
|
||||
if (SecurityCritical >= 0) taiHookRelease(SecurityCritical, SecurityCritical_ref);
|
||||
if (PeekPositive >= 0) taiHookRelease(PeekPositive, PeekPositive_ref);
|
||||
if (LoadModuleHook >= 0) taiHookRelease(LoadModuleHook, LoadModuleHook_ref);
|
||||
|
||||
return SCE_KERNEL_STOP_SUCCESS;
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
MakePsmGreatAgain:
|
||||
attributes: 0
|
||||
version:
|
||||
major: 1
|
||||
minor: 1
|
||||
main:
|
||||
start: module_start
|
||||
stop: module_stop
|
30
README.md
30
README.md
|
@ -1,9 +1,29 @@
|
|||
# MakePsmGreatAgain
|
||||
|
||||
Modifications to the PSM Developer applications
|
||||
|
||||
# v1.0 -
|
||||
Automatically creates publishing license (if not allready created) and PSM Dev bootup (still need psm+ for development!)
|
||||
Re-Enable's SceUsbSerial for ALL applications (yes, if u want to use it on your own homebrew, YOU CAN!)
|
||||
Spoofs SecureTick to allways be within the valid period for the PsmDrmBoot and KConsole Cache (no need to "Refresh PSM+ License")
|
||||
Features:
|
||||
+ Never-Ending Publishing License. - While MakePsmGreatAgain is active, you dont have to "Refresh License" with PSM+
|
||||
+ USB Serial Mode Re-Enabled - Can connect PC to Development Assistant via USB
|
||||
+ PSMPlus Publishing Keys - Apps signed with PSMPlus Keys will work all consoles with MakePsmGreatAgain
|
||||
+ Exit with Start+Up - While a PSM app is running, You can press Start+Up to return back to Developer Assistant
|
||||
+ All applications are "SecurityCritcal" - Enables ALL .NET functions, including ones marked 'unsafe'
|
||||
+ app.info "project_name" check patched (runtime only) - Enables games to run regardless of if "project_name" is set to "*"
|
||||
|
||||
|
||||
(Note: As PSM Dev is revoked in f00d you need reF00D/0syscall6 or rePatch with a compati pack in order to run it)
|
||||
|
||||
# Installation
|
||||
```
|
||||
*PCSI00007
|
||||
ur0:/tai/MakePsmGreatAgain-v1.5.suprx
|
||||
*PCSI00009
|
||||
ur0:/tai/MakePsmGreatAgain-v1.5.suprx
|
||||
```
|
||||
(use ur0 if prefered)
|
||||
|
||||
# FAQ
|
||||
|
||||
[How do i install PSM Dev?](https://www.youtube.com/watch?v=CuxaVTyAVn8)
|
||||
[How do i install the PSM SDK?](https://www.youtube.com/watch?v=KoZ1xVNTjUc)
|
||||
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue