libdefault_proxy/jni/sysinfo.c
2024-06-04 14:32:41 +12:00

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;
}