dobby.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #ifndef dobby_h
  2. #define dobby_h
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #include <stdbool.h>
  7. #include <stdint.h>
  8. typedef uintptr_t addr_t;
  9. typedef uint32_t addr32_t;
  10. typedef uint64_t addr64_t;
  11. typedef void *dobby_dummy_func_t;
  12. typedef void *asm_func_t;
  13. #if defined(__arm__)
  14. typedef struct {
  15. uint32_t dummy_0;
  16. uint32_t dummy_1;
  17. uint32_t dummy_2;
  18. uint32_t sp;
  19. union {
  20. uint32_t r[13];
  21. struct {
  22. uint32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12;
  23. } regs;
  24. } general;
  25. uint32_t lr;
  26. } DobbyRegisterContext;
  27. #elif defined(__arm64__) || defined(__aarch64__)
  28. #define ARM64_TMP_REG_NDX_0 17
  29. typedef union _FPReg {
  30. __int128_t q;
  31. struct {
  32. double d1;
  33. double d2;
  34. } d;
  35. struct {
  36. float f1;
  37. float f2;
  38. float f3;
  39. float f4;
  40. } f;
  41. } FPReg;
  42. // register context
  43. typedef struct {
  44. uint64_t dmmpy_0; // dummy placeholder
  45. uint64_t sp;
  46. uint64_t dmmpy_1; // dummy placeholder
  47. union {
  48. uint64_t x[29];
  49. struct {
  50. 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,
  51. x23, x24, x25, x26, x27, x28;
  52. } regs;
  53. } general;
  54. uint64_t fp;
  55. uint64_t lr;
  56. union {
  57. FPReg q[32];
  58. struct {
  59. FPReg q0, q1, q2, q3, q4, q5, q6, q7;
  60. // [!!! READ ME !!!]
  61. // for Arm64, can't access q8 - q31, unless you enable full floating-point register pack
  62. FPReg q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29,
  63. q30, q31;
  64. } regs;
  65. } floating;
  66. } DobbyRegisterContext;
  67. #elif defined(_M_IX86) || defined(__i386__)
  68. typedef struct _RegisterContext {
  69. uint32_t dummy_0;
  70. uint32_t esp;
  71. uint32_t dummy_1;
  72. uint32_t flags;
  73. union {
  74. struct {
  75. uint32_t eax, ebx, ecx, edx, ebp, esp, edi, esi;
  76. } regs;
  77. } general;
  78. } DobbyRegisterContext;
  79. #elif defined(_M_X64) || defined(__x86_64__)
  80. typedef struct {
  81. uint64_t dummy_0;
  82. uint64_t rsp;
  83. union {
  84. struct {
  85. uint64_t rax, rbx, rcx, rdx, rbp, rsp, rdi, rsi, r8, r9, r10, r11, r12, r13, r14, r15;
  86. } regs;
  87. } general;
  88. uint64_t dummy_1;
  89. uint64_t flags;
  90. } DobbyRegisterContext;
  91. #endif
  92. #define install_hook_name(name, fn_ret_t, fn_args_t...) \
  93. static fn_ret_t fake_##name(fn_args_t); \
  94. static fn_ret_t (*orig_##name)(fn_args_t); \
  95. /* __attribute__((constructor)) */ static void install_hook_##name(void *sym_addr) { \
  96. DobbyHook(sym_addr, (dobby_dummy_func_t)fake_##name, (dobby_dummy_func_t *)&orig_##name); \
  97. return; \
  98. } \
  99. fn_ret_t fake_##name(fn_args_t)
  100. int DobbyCodePatch(void *address, uint8_t *buffer, uint32_t buffer_size);
  101. int DobbyHook(void *address, dobby_dummy_func_t replace_func, dobby_dummy_func_t *origin_func);
  102. typedef void (*dobby_instrument_callback_t)(void *address, DobbyRegisterContext *ctx);
  103. int DobbyInstrument(void *address, dobby_instrument_callback_t pre_handler);
  104. // 销毁和恢复代码补丁
  105. int DobbyDestroy(void *address);
  106. const char *DobbyGetVersion();
  107. void *DobbySymbolResolver(const char *image_name, const char *symbol_name);
  108. int DobbyImportTableReplace(char *image_name, char *symbol_name, dobby_dummy_func_t fake_func,
  109. dobby_dummy_func_t *orig_func);
  110. void dobby_enable_near_branch_trampoline();
  111. void dobby_disable_near_branch_trampoline();
  112. #ifdef __cplusplus
  113. }
  114. #endif
  115. #endif