mirror of
https://github.com/0O0o0oOoO00/Alas.git
synced 2026-05-21 15:49:30 +08:00
53 lines
1.4 KiB
C++
53 lines
1.4 KiB
C++
#include "dobby/dobby_internal.h"
|
|
|
|
#include "Interceptor.h"
|
|
#include "InterceptRouting/Routing/FunctionInlineHook/FunctionInlineHookRouting.h"
|
|
|
|
PUBLIC int DobbyHook(void *address, dobby_dummy_func_t replace_func, dobby_dummy_func_t *origin_func) {
|
|
if (!address) {
|
|
ERROR_LOG("function address is 0x0");
|
|
return -1;
|
|
}
|
|
|
|
#if defined(__APPLE__) && defined(__arm64__)
|
|
address = pac_strip(address);
|
|
replace_func = pac_strip(replace_func);
|
|
#endif
|
|
|
|
#if defined(ANDROID)
|
|
void *page_align_address = (void *)ALIGN_FLOOR(address, OSMemory::PageSize());
|
|
if (!OSMemory::SetPermission(page_align_address, OSMemory::PageSize(), kReadExecute)) {
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
DEBUG_LOG("----- [DobbyHook:%p] -----", address);
|
|
|
|
// check if already register
|
|
auto entry = Interceptor::SharedInstance()->find((addr_t)address);
|
|
if (entry) {
|
|
ERROR_LOG("%p already been hooked.", address);
|
|
return -1;
|
|
}
|
|
|
|
entry = new InterceptEntry(kFunctionInlineHook, (addr_t)address);
|
|
|
|
auto *routing = new FunctionInlineHookRouting(entry, replace_func);
|
|
routing->Prepare();
|
|
routing->DispatchRouting();
|
|
|
|
// set origin func entry with as relocated instructions
|
|
if (origin_func) {
|
|
*origin_func = (dobby_dummy_func_t)entry->relocated_addr;
|
|
#if defined(__APPLE__) && defined(__arm64__)
|
|
*origin_func = pac_sign(*origin_func);
|
|
#endif
|
|
}
|
|
|
|
routing->Commit();
|
|
|
|
Interceptor::SharedInstance()->add(entry);
|
|
|
|
return 0;
|
|
}
|