//
// Custom syscall for extended symbol resolving (allow specifying of library name, flags to be able to use mangled symbol names) on PS4.
//
// NOTE: slide offsets are for 5.00/5.01 kernel.
//
//
// PATCHES (syntax: offset,name,old,new).
//
// Allow sys_dynlib_dlsym in all processes.
DECLARE_PATCH_64(0x237E2A, allow_dynlib_dlsym, H64S(0F,82,C0,01,00,00,48,8B), H64S(E9,C1,01,00,00,90,48,8B));
// Don't restrict dynlib information.
DECLARE_PATCH_32(0x2B2350, dont_restrict_dynlib_info, H32S(65,48,8B,04), H32S(31,C0,C3,90));
// Allow usage of mangled symbols in dynlib_do_dlsym().
DECLARE_PATCH_BUF(0x2AF877, allow_mangled_symbols_in_dlsym, BYTES(45,31,FF,45,31,F6), BYTES(90,90,90,90,90,90));
//
// Kernel symbols, structures and definitions.
//
#define DYNLIB_DLSYM_FLAG_MANGLED_NAME 0x1
struct dynlib_obj;
#define SIZEOF_DYNLIB 0x100 // dynlib_proc_initialize_step1
TYPE_BEGIN(struct dynlib, SIZEOF_DYNLIB);
TYPE_FIELD(SLIST_HEAD(, dynlib_obj) objs, 0x00);
// ...
TYPE_FIELD(struct dynlib_obj* main_obj, 0x10);
// ...
TYPE_FIELD(struct sx bind_lock, 0x70);
// ...
TYPE_END();
#if FW_VER == 501
DECLARE_FUNCTION(0x2AF7B0, dynlib_do_dlsym, void*, struct dynlib* dl, struct dynlib_obj* obj, char* name, char* libname, unsigned int flags);
DECLARE_FUNCTION(0x2B0B40, dynlib_find_obj_by_handle, struct dynlib_obj*, struct dynlib* dl, int handle);
#endif
//
// Kernel code for payload.
//
enum {
// ...
SUPERCALL_DLSYM,
// ...
};
struct sys_supercall_args {
int cmd;
int cmd__pad;
union {
// ...
#if FW_VER == 501
struct {
int handle;
int...