Guest User

Untitled

a guest
Jan 22nd, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #ifndef _WIN32
  5. #include <sys/mman.h>
  6. #include <dlfcn.h>
  7. #else
  8. #include <windows.h>
  9. #endif
  10.  
  11. #include <sys/types.h>
  12. #include <stdint.h>
  13. #include <string.h>
  14. #include <errno.h>
  15.  
  16. #include "fn_override.h"
  17.  
  18. int yb_fn_override_by_name(const char *orig, const char *target, const char *libname)
  19. {
  20. #ifdef _WIN32
  21. HMODULE handle = LoadLibrary(libname);
  22. if(!handle) {
  23. printf("LoadLibrary() failed\n");
  24. return 0;
  25. }
  26. FARPROC origptr = GetProcAddress(handle, orig);
  27. FARPROC targetptr = GetProcAddress(handle, target);
  28. #else
  29. void *handle = dlopen(libname, RTLD_LAZY);
  30. if(!handle) {
  31. printf("%s\n", dlerror());
  32. return 0;
  33. }
  34. void *origptr = dlsym(handle, orig);
  35. void *targetptr = dlsym(handle, target);
  36. #endif
  37. if(!(origptr && targetptr)) {
  38. printf("couldn't load symbols\n");
  39. return 0;
  40. }
  41. return yb_fn_override_by_ptr(origptr, targetptr);
  42. }
  43.  
  44. int yb_fn_override_by_ptr(void *orig, const void *target) {
  45. #ifdef _LP64
  46. #define JMP_SIZE 12
  47. #define PTR_TYPE uint64_t
  48. #define DST_TYPE PTR_TYPE
  49. #define DST_ARG (PTR_TYPE)target
  50. char op[JMP_SIZE];
  51. /*two-byte movq*/
  52. op[0] = 0x48;
  53. op[1] = 0xb8;
  54. /*two byte jmpq*/
  55. op[10] = 0xff;
  56. op[11] = 0xe0;
  57. void *addrptr = op+2;
  58. #else
  59. #define JMP_SIZE 5
  60. #define PTR_TYPE uint32_t
  61. #define DST_TYPE int32_t
  62. #define DST_ARG (DST_TYPE)(target-orig-JMP_SIZE)
  63. char op[JMP_SIZE];
  64. op[0] = 0xe9; /*jmp*/
  65. void *addrptr = op+1;
  66. #endif
  67. #define FN_OFFSET orig - (((PTR_TYPE)orig)%4096)
  68. #define MPROTECT_SIZE (((PTR_TYPE)orig+4095+JMP_SIZE)/4096)*4096 - \
  69. ((PTR_TYPE)orig-((PTR_TYPE)orig%4096))
  70.  
  71. #ifdef _WIN32
  72. DWORD wtf;
  73. if(!VirtualProtect(FN_OFFSET, MPROTECT_SIZE, PAGE_EXECUTE_READWRITE, &wtf))
  74. {
  75. DWORD dw = GetLastError();
  76. LPVOID buf;
  77. printf("got error\n");
  78. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
  79. FORMAT_MESSAGE_FROM_SYSTEM|
  80. FORMAT_MESSAGE_IGNORE_INSERTS,
  81. NULL,
  82. dw,
  83. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  84. (LPSTR)&buf,
  85. 0, NULL);
  86. printf("VirtualProtect() failed!\n");
  87. printf(buf);
  88. return 0;
  89. }
  90. #else
  91. if(mprotect(FN_OFFSET, MPROTECT_SIZE,PROT_READ|PROT_WRITE|PROT_EXEC) == -1) {
  92. printf("mprotect failed!: %s\n", strerror(errno));
  93. return 0;
  94. }
  95. #endif
  96. *(DST_TYPE*)addrptr = DST_ARG;
  97. memcpy(orig, op, JMP_SIZE);
  98. return 1;
  99. }
Add Comment
Please, Sign In to add comment