geode/loader/dobby/source/InterceptRouting/Routing/DynamicBinaryInstrument/dynamic-binary-instrument.cc
2022-07-30 19:24:03 +03:00

41 lines
No EOL
1.5 KiB
C++

#include "InterceptRouting/Routing/DynamicBinaryInstrument/dynamic-binary-instrument.h"
#include "dobby_internal.h"
#include "TrampolineBridge/ClosureTrampolineBridge/AssemblyClosureTrampoline.h"
#include "InterceptRouting/Routing/DynamicBinaryInstrument/intercept_routing_handler.h"
void DynamicBinaryInstrumentRouting::DispatchRouting() {
BuildDynamicBinaryInstrumentRouting();
// generate relocated code which size == trampoline size
GenerateRelocatedCode(trampoline_buffer_->getSize());
}
// Add dbi_call handler before running the origin instructions
void DynamicBinaryInstrumentRouting::BuildDynamicBinaryInstrumentRouting() {
// create closure trampoline jump to prologue_routing_dispath with the `entry_` data
ClosureTrampolineEntry *closure_trampoline;
void *handler = (void *)instrument_routing_dispatch;
#if __APPLE__
#if __has_feature(ptrauth_calls)
handler = __builtin_ptrauth_strip(handler, ptrauth_key_asia);
#endif
#endif
closure_trampoline = ClosureTrampoline::CreateClosureTrampoline(entry_, handler);
this->SetTrampolineTarget(closure_trampoline->address);
DLOG(0, "[closure bridge] Carry data %p ", entry_);
DLOG(0, "[closure bridge] Create prologue_dispatch_bridge %p", closure_trampoline->address);
// generate trampoline buffer, run before `GenerateRelocatedCode`
GenerateTrampolineBuffer(entry_->target_address, GetTrampolineTarget());
}
#if 0
void *DynamicBinaryInstrumentRouting::GetTrampolineTarget() {
return this->prologue_dispatch_bridge;
}
#endif