Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 37 additions & 10 deletions host/shellcode/shellcore_mountroot.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
#include "../../shared/macro.h"
#include "../../shared/debug.h"
#include "../../shared/strstrid.hpp"
#include <stdint.h>

// 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;
Expand All @@ -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);
}
30 changes: 15 additions & 15 deletions patch-server/server_patch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 1 addition & 6 deletions patch/patch_shellcore.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 1 addition & 2 deletions shared/strstrid.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down