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.

88 lines
2.3KB

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