You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.3KB

  1. #include <Windows.h>
  2. #include <cstdint>
  3. #include <memory>
  4. #include "..\third_party\poly\PolyHook\PolyHook.hpp"
  5. #include "typedefs.h"
  6. #include "abstracthook.h"
  7. #include "PolyHook.h"
  8. #pragma comment(lib, "..\\x64\\debug\\test_cases.lib")
  9. static TypeSmall trueSmall = &_small;
  10. static TypeBranch trueBranch = &_branch;
  11. static TypeRip_relative trueRip_Relative = &_rip_relative;
  12. static TypeAVX trueAVX = &_AVX;
  13. static TypeRDRAND trueRDRAND = &_RDRAND;
  14. static TypeLoop trueLoop = &_loop;
  15. static TypeTailRecursion trueTailRecursion = &_tail_recursion;
  16. AbstractHookEngine* g_PolyHook = new PolyHook();
  17. uint64_t PolyHook_Hooks::hookSmall(void) {
  18. g_PolyHook->small_ = true;
  19. return trueSmall();
  20. }
  21. uint64_t PolyHook_Hooks::hookBranch(uint64_t x) {
  22. g_PolyHook->branch = true;
  23. return trueBranch(x);
  24. }
  25. uint64_t PolyHook_Hooks::hookRip_relative(void) {
  26. g_PolyHook->rip_relative = true;
  27. return trueRip_Relative();
  28. }
  29. void PolyHook_Hooks::hookAVX(float num, void* res) {
  30. g_PolyHook->avx = true;
  31. return trueAVX(num, res);
  32. }
  33. uint32_t PolyHook_Hooks::hookRDRAND(void) {
  34. g_PolyHook->rdrand = true;
  35. return trueRDRAND();
  36. }
  37. uint32_t PolyHook_Hooks::hookLoop(uint32_t num, uint32_t cnt) {
  38. g_PolyHook->loop = true;
  39. return trueLoop(num, cnt);
  40. }
  41. uint32_t PolyHook_Hooks::hookTail_recursion(uint32_t x) {
  42. g_PolyHook->tail_recursion = true;
  43. return trueTailRecursion(x);
  44. }
  45. bool PolyHook::hook_all(void) {
  46. bool ret = hook<decltype(&_small)>(detSmall, &_small, (void*&)trueSmall, &PolyHook_Hooks::hookSmall);
  47. ret |= hook<decltype(&_branch)>(detBranch, &_branch, (void*&)trueBranch, &PolyHook_Hooks::hookBranch);
  48. ret |= hook<decltype(&rip_relative)>(detRIPRelative, &rip_relative, (void*&)trueRip_Relative, &PolyHook_Hooks::hookRip_relative);
  49. ret |= hook<decltype(&_AVX)>(detAVX, &_AVX, (void*&)trueAVX, &PolyHook_Hooks::hookAVX);
  50. ret |= hook<decltype(&_RDRAND)>(detRDRAND, &_RDRAND, (void*&)trueRDRAND, &PolyHook_Hooks::hookRDRAND);
  51. ret |= hook<decltype(&_loop)>(detLoop, &_loop, (void*&)trueLoop, &PolyHook_Hooks::hookLoop);
  52. ret |= hook<decltype(&_tail_recursion)>(detTailRecursion, &_tail_recursion, (void*&)trueTailRecursion, &PolyHook_Hooks::hookTail_recursion);
  53. return ret;
  54. }
  55. bool PolyHook::unhook_all() {
  56. detSmall->UnHook();
  57. detBranch->UnHook();
  58. detRIPRelative->UnHook();
  59. detAVX->UnHook();
  60. detRDRAND->UnHook();
  61. detLoop->UnHook();
  62. detTailRecursion->UnHook();
  63. return true;
  64. }