55 lines
1.4 KiB
C
55 lines
1.4 KiB
C
#include <stdlib.h>
|
|
#include "sysinfo.h"
|
|
#include "hooks/inlineHook.h"
|
|
|
|
static void* LIB_DEFAULT_HANDLE = NULL;
|
|
|
|
void patch_data(void* address, void* data, size_t size) {
|
|
if(LIB_DEFAULT_HANDLE != NULL) {
|
|
uintptr_t patch_address = (base_address() + address);
|
|
LOG("address: %p (%p), data: %p, size: 0x%x", address, patch_address, data, size);
|
|
|
|
memcpy(patch_address, data, size);
|
|
cacheflush(CLEAR_BIT0(patch_address), CLEAR_BIT0(patch_address) + size, 0);
|
|
}
|
|
}
|
|
|
|
uintptr_t base_address() {
|
|
if(LIB_DEFAULT_HANDLE != NULL) {
|
|
return (get_func_addr("scePsmInitialize") - 0x82A00);
|
|
}
|
|
}
|
|
|
|
void* get_func_addr(char* function_name) {
|
|
if(LIB_DEFAULT_HANDLE != NULL){
|
|
uintptr_t function_addr = (uintptr_t)dlsym(LIB_DEFAULT_HANDLE, function_name);
|
|
|
|
LOG("%s %p", function_name, function_addr);
|
|
return function_addr;
|
|
}
|
|
|
|
}
|
|
|
|
void hook_func(void* func_ptr, void* patch_func, void* orig_func) {
|
|
LOG("registerInlineHook: %p", func_ptr);
|
|
int res = registerInlineHook((uintptr_t)func_ptr, (uintptr_t)patch_func, (uintptr_t**)orig_func);
|
|
|
|
if(res == 0){
|
|
LOG("success; res = 0x%x", res);
|
|
inlineHook(func_ptr);
|
|
}
|
|
else {
|
|
LOG("failed, res = 0x%x", res);
|
|
}
|
|
}
|
|
|
|
void hook_func_export(char* function_name, void* patch_func, void* orig_func) {
|
|
void* func_ptr = get_func_addr(function_name);
|
|
LOG("Hooking %s %p", function_name, func_ptr);
|
|
|
|
hook_func(func_ptr, patch_func, orig_func);
|
|
}
|
|
|
|
void set_lib_default_handle(void* handle) {
|
|
LIB_DEFAULT_HANDLE = handle;
|
|
} |