diff --git a/host/shellcode/shellcore_mountroot.cpp b/host/shellcode/shellcore_mountroot.cpp index bb630a0..de4ac99 100644 --- a/host/shellcode/shellcore_mountroot.cpp +++ b/host/shellcode/shellcore_mountroot.cpp @@ -1,7 +1,11 @@ #include "../../shared/macro.h" +#include "../../shared/debug.h" #include "../../shared/strstrid.hpp" #include +// exports +extern "C" int __export_mount_root_original(void* pThis, const char* fs, const char* src, const char* dst, void* param_5, uint32_t* param_6); + static bool valid_str(const char* p) { return p && *p; @@ -12,22 +16,45 @@ static const char* check_str(const char* p) return valid_str(p) ? p : ""; } -static bool is_avContents(const char* src, const char* dst) +static bool is_valid_src_dst(const char* src, const char* dst) { - return valid_str(src) && valid_str(dst) && - ConstStrStrId(src, "/user/av_contents/content_tmp") && ConstStrStrId(dst, "/av_contents/content_tmp"); + return valid_str(src) && valid_str(dst); +} + +static bool is_validPathForMounting(const char* src, const char* dst) +{ + return is_valid_src_dst(src, dst) && + ConstStrStrId(src, "/system_tmp") && ConstStrStrId(dst, "/system_tmp"); +} + +static bool is_userData(const char* src, const char* dst) +{ + return is_valid_src_dst(src, dst) && + ConstStrStrId(src, "/user/data") && ConstStrStrId(dst, "/data"); +} + +static int mountUserData(void* pThis, void* param_5, uint32_t* param_6) +{ + static const char src_p[] = "/user/data"; + static const char dst_p[] = "/data"; + debugf("allocating \"%s\" -> \"%s\" path\n", src_p, dst_p); + return __export_mount_root_original(pThis, "nullfs", src_p, dst_p, param_5, param_6); } -extern "C" int __export_mount_root_original(void* pThis, const char* fs, const char* src, const char* dst, void* param_5, uint32_t* param_6); extern "C" int __export_mount_root_hook(void* pThis, const char* fs, const char* src, const char* dst, void* param_5, uint32_t* param_6) { - printf(FILE_FUNC_LINE ": fs: \"%s\" src \"%s\" -> dst \"%s\"\n", check_str(fs), check_str(src), check_str(dst)); - if (is_avContents(src, dst)) + debugf("fs: \"%s\" src \"%s\" -> dst \"%s\"\n", check_str(fs), check_str(src), check_str(dst)); + // check for pre patched environment + if (is_userData(src, dst)) + { + debugf("attempting to mount \"%s\" to \"%s\"! this is handled by \"mountUserData\" already!\n", src, dst); + return 0; + } + // not patched, mount data folder + if (is_validPathForMounting(src, dst)) { - static const char src_p[] = "/user/data"; - static const char dst_p[] = "/data"; - printf("allocating \"%s\" -> \"%s\" path\n", src_p, dst_p); - __export_mount_root_original(pThis, "nullfs", src_p, dst_p, param_5, param_6); + const int r = mountUserData(pThis, param_5, param_6); + debugf("mountUserData: 0x%08x\n", r); } return __export_mount_root_original(pThis, fs, src, dst, param_5, param_6); } diff --git a/patch-server/server_patch.cpp b/patch-server/server_patch.cpp index d507547..35e0898 100644 --- a/patch-server/server_patch.cpp +++ b/patch-server/server_patch.cpp @@ -267,21 +267,21 @@ void run_elf_user_patch(client_data& read_client) { if (enable_prx_patch) { - patch_frame_context libkernel_eh_frame_patch = {}; - kernel_dynlib_obj(read_client.clientPid, 0x2001, &libkernel_eh_frame_patch.frame_info.obj); - if (!libkernel_eh_frame_patch.frame_info.obj.eh_frame || !libkernel_eh_frame_patch.frame_info.obj.eh_frame_size) - { - memset(&libkernel_eh_frame_patch, 0, sizeof(libkernel_eh_frame_patch)); - kernel_dynlib_obj(read_client.clientPid, 0x1, &libkernel_eh_frame_patch.frame_info.obj); - } - if (libkernel_eh_frame_patch.frame_info.obj.eh_frame && libkernel_eh_frame_patch.frame_info.obj.eh_frame_size) - { - libkernel_eh_frame_patch.frame_start = libkernel_eh_frame_patch.frame_info.obj.eh_frame; - libkernel_eh_frame_patch.frame_size = libkernel_eh_frame_patch.frame_info.obj.eh_frame_size; - func_ret(kill(read_client.clientPid, SIGSTOP)); - patch_prx_load_for_signal(libkernel_eh_frame_patch, read_client); - func_ret(kill(read_client.clientPid, SIGCONT)); - } + patch_frame_context libkernel_eh_frame_patch = {}; + kernel_dynlib_obj(read_client.clientPid, 0x2001, &libkernel_eh_frame_patch.frame_info.obj); + if (!libkernel_eh_frame_patch.frame_info.obj.eh_frame || !libkernel_eh_frame_patch.frame_info.obj.eh_frame_size) + { + memset(&libkernel_eh_frame_patch, 0, sizeof(libkernel_eh_frame_patch)); + kernel_dynlib_obj(read_client.clientPid, 0x1, &libkernel_eh_frame_patch.frame_info.obj); + } + if (libkernel_eh_frame_patch.frame_info.obj.eh_frame && libkernel_eh_frame_patch.frame_info.obj.eh_frame_size) + { + libkernel_eh_frame_patch.frame_start = libkernel_eh_frame_patch.frame_info.obj.eh_frame; + libkernel_eh_frame_patch.frame_size = libkernel_eh_frame_patch.frame_info.obj.eh_frame_size; + func_ret(kill(read_client.clientPid, SIGSTOP)); + patch_prx_load_for_signal(libkernel_eh_frame_patch, read_client); + func_ret(kill(read_client.clientPid, SIGCONT)); + } } metadata_buf meta = {}; const int mr = get_app_metadata(read_client.clientPid, &meta); diff --git a/patch/patch_shellcore.c b/patch/patch_shellcore.c index 3f15935..5efc0f0 100644 --- a/patch/patch_shellcore.c +++ b/patch/patch_shellcore.c @@ -79,7 +79,6 @@ static void patchAppTimeoutForMonitoredProcs(const dynlib_info* obj, const pid_t static void patchMountRoot(patch_frame_context* frame, const dynlib_info* obj, const pid_t pid) { -#if defined(__PROSPERO__) const uintptr_t mapbase = obj->obj.mapbase; const size_t mapsize = obj->obj.mapsize; @@ -121,7 +120,6 @@ static void patchMountRoot(patch_frame_context* frame, const dynlib_info* obj, c pid_write_call(pid, target_branch, frame->frame_base + __export_mount_root_hook_offset, true); pid_write_call(pid, frame->frame_base + (__export_mount_root_original_offset + num_originals), target_branch + num_originals, true); } -#endif } static void patchOnNewProcess(patch_frame_context* frame, const dynlib_info* obj, const pid_t pid) @@ -249,10 +247,7 @@ static void patchOnNewProcess(patch_frame_context* frame, const dynlib_info* obj } const size_t nbytes = sizeof(code_copy); userland_copyin(pid, code_copy, codebase, nbytes); - if (!is_ps4) - { - patchMountRoot(frame, obj, pid); - } + patchMountRoot(frame, obj, pid); frame->frame_start += nbytes; frame->frame_consumed += nbytes; frame->frame_size -= nbytes; diff --git a/shared/strstrid.hpp b/shared/strstrid.hpp index 977b65e..0d4e7d3 100644 --- a/shared/strstrid.hpp +++ b/shared/strstrid.hpp @@ -13,8 +13,7 @@ __attribute__((noinline)) static size_t ConstStrLen(const char* str) } // runtime function to strstr by sid -__attribute__((noinline)) -static const char* +__attribute__((noinline)) static const char* StrStrSid(const char* haystackStr, const StringId needleSid, const size_t needleLen) { const size_t hlen = ConstStrLen(haystackStr);