mirror of
https://github.com/geode-sdk/geode.git
synced 2024-12-23 22:32:23 -05:00
43 lines
1.3 KiB
C++
43 lines
1.3 KiB
C++
|
#include "dobby_internal.h"
|
||
|
|
||
|
#include "Interceptor.h"
|
||
|
#include "InterceptRouting/InterceptRouting.h"
|
||
|
#include "InterceptRouting/Routing/FunctionInlineReplace/function-inline-replace.h"
|
||
|
|
||
|
PUBLIC int DobbyHook(void *address, void *replace_call, void **origin_call) {
|
||
|
if (!address) {
|
||
|
ERROR_LOG("function address is 0x0");
|
||
|
return RS_FAILED;
|
||
|
}
|
||
|
|
||
|
DLOG(0, "[DobbyHook] Initialize at %p", address);
|
||
|
|
||
|
// check if already hooked
|
||
|
HookEntry *entry = Interceptor::SharedInstance()->FindHookEntry(address);
|
||
|
if (entry) {
|
||
|
FunctionInlineReplaceRouting *route = (FunctionInlineReplaceRouting *)entry->route;
|
||
|
if (route->GetTrampolineTarget() == replace_call) {
|
||
|
ERROR_LOG("function %p already been hooked.", address);
|
||
|
return RS_FAILED;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
entry = new HookEntry();
|
||
|
entry->id = Interceptor::SharedInstance()->GetHookEntryCount();
|
||
|
entry->type = kFunctionInlineHook;
|
||
|
entry->function_address = address;
|
||
|
|
||
|
FunctionInlineReplaceRouting *route = new FunctionInlineReplaceRouting(entry, replace_call);
|
||
|
route->Prepare();
|
||
|
route->DispatchRouting();
|
||
|
Interceptor::SharedInstance()->AddHookEntry(entry);
|
||
|
|
||
|
// set origin call with relocated function
|
||
|
*origin_call = entry->relocated_origin_function;
|
||
|
|
||
|
// code patch & hijack original control flow entry
|
||
|
route->Commit();
|
||
|
|
||
|
return RS_SUCCESS;
|
||
|
}
|