1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| #ifndef dobby_h #define dobby_h
#ifdef __cplusplus extern "C" { #endif
#include <stdbool.h> #include <stdint.h>
typedef uintptr_t addr_t; typedef uint32_t addr32_t; typedef uint64_t addr64_t;
typedef void *dobby_dummy_func_t; typedef void *asm_func_t;
#if defined(__arm__) typedef struct { uint32_t dummy_0; uint32_t dummy_1;
uint32_t dummy_2; uint32_t sp;
union { uint32_t r[13]; struct { uint32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12; } regs; } general;
uint32_t lr; } DobbyRegisterContext; #elif defined(__arm64__) || defined(__aarch64__) #define ARM64_TMP_REG_NDX_0 17
typedef union _FPReg { __int128_t q; struct { double d1; double d2; } d; struct { float f1; float f2; float f3; float f4; } f; } FPReg;
typedef struct { uint64_t dmmpy_0; uint64_t sp;
uint64_t dmmpy_1; union { uint64_t x[29]; struct { uint64_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28; } regs; } general;
uint64_t fp; uint64_t lr;
union { FPReg q[32]; struct { FPReg q0, q1, q2, q3, q4, q5, q6, q7; FPReg q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29, q30, q31; } regs; } floating; } DobbyRegisterContext; #elif defined(_M_IX86) || defined(__i386__) typedef struct _RegisterContext { uint32_t dummy_0; uint32_t esp;
uint32_t dummy_1; uint32_t flags;
union { struct { uint32_t eax, ebx, ecx, edx, ebp, esp, edi, esi; } regs; } general;
} DobbyRegisterContext; #elif defined(_M_X64) || defined(__x86_64__) typedef struct { uint64_t dummy_0; uint64_t rsp;
union { struct { uint64_t rax, rbx, rcx, rdx, rbp, rsp, rdi, rsi, r8, r9, r10, r11, r12, r13, r14, r15; } regs; } general;
uint64_t dummy_1; uint64_t flags; } DobbyRegisterContext; #endif
#define install_hook_name(name, fn_ret_t, fn_args_t...) \ static fn_ret_t fake_##name(fn_args_t); \ static fn_ret_t (*orig_##name)(fn_args_t); \ static void install_hook_##name(void *sym_addr) { \ DobbyHook(sym_addr, (dobby_dummy_func_t)fake_##name, (dobby_dummy_func_t *)&orig_##name); \ return; \ } \ fn_ret_t fake_##name(fn_args_t)
int DobbyCodePatch(void *address, uint8_t *buffer, uint32_t buffer_size);
int DobbyHook(void *address, dobby_dummy_func_t replace_func, dobby_dummy_func_t *origin_func);
typedef void (*dobby_instrument_callback_t)(void *address, DobbyRegisterContext *ctx); int DobbyInstrument(void *address, dobby_instrument_callback_t pre_handler);
int DobbyDestroy(void *address);
const char *DobbyGetVersion();
void *DobbySymbolResolver(const char *image_name, const char *symbol_name);
int DobbyImportTableReplace(char *image_name, char *symbol_name, dobby_dummy_func_t fake_func, dobby_dummy_func_t *orig_func);
void dobby_enable_near_branch_trampoline(); void dobby_disable_near_branch_trampoline();
#ifdef __cplusplus } #endif
#endif
|