From 05573a8666a71350f79523bfb1cc0822342c4392 Mon Sep 17 00:00:00 2001 From: aaaaaa aaaaaaa Date: Wed, 27 Dec 2017 22:47:29 +0100 Subject: [PATCH] polyhook --- hook_tests.sln | 10 ++++ tester/abstracthook.h | 17 ++++++- tester/main.cpp | 10 ++-- tester/mhook.cpp | 2 + tester/minhook.cpp | 90 +++++++++++++++++++++++++++++++++++ tester/minhook.h | 33 +++++++++++++ tester/polyhook.cpp | 17 +++---- tester/tester.vcxproj | 3 ++ tester/tester.vcxproj.filters | 7 +++ 9 files changed, 175 insertions(+), 14 deletions(-) create mode 100644 tester/minhook.cpp create mode 100644 tester/minhook.h diff --git a/hook_tests.sln b/hook_tests.sln index d34a07a..f506b51 100644 --- a/hook_tests.sln +++ b/hook_tests.sln @@ -15,6 +15,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mhook-test", "third_party\m EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyHook", "third_party\poly\PolyHook\PolyHook.vcxproj", "{64269F60-A538-4327-82EE-AB4BF4766CE9}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "third_party\minhook\build\VC15\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -55,6 +57,14 @@ Global {64269F60-A538-4327-82EE-AB4BF4766CE9}.Release|x64.Build.0 = Release|x64 {64269F60-A538-4327-82EE-AB4BF4766CE9}.Release|x86.ActiveCfg = Release|Win32 {64269F60-A538-4327-82EE-AB4BF4766CE9}.Release|x86.Build.0 = Release|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.ActiveCfg = Debug|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x86.Build.0 = Debug|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.ActiveCfg = Release|Win32 + {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/tester/abstracthook.h b/tester/abstracthook.h index 60c5229..bb279a6 100644 --- a/tester/abstracthook.h +++ b/tester/abstracthook.h @@ -33,11 +33,24 @@ public: virtual bool hook_all() = 0; virtual bool unhook_all() = 0; - bool all_hooked() { + bool all_hooked() const { return small_ && branch && rip_relative && avx && rdrand && loop && tail_recursion; } - const char* name() { + const char* name() const { return name_; } + + friend std::ostream& operator<< (std::ostream& stream, const AbstractHookEngine& eng) { + std::cout << '|' << std::setw(10) << eng.name() << std::setw(1) << '|' << + (eng.small_ ? 'X' : ' ') << '|' << + (eng.branch ? 'X' : ' ') << '|' << + (eng.rip_relative ? 'X' : ' ') << '|' << + (eng.avx ? 'X' : ' ') << '|' << + (eng.rdrand ? 'X' : ' ') << '|' << + (eng.loop ? 'X' : ' ') << '|' << + (eng.tail_recursion ? 'X' : ' ') << '|'; + + return stream; + } }; \ No newline at end of file diff --git a/tester/main.cpp b/tester/main.cpp index 446bc05..8de7846 100644 --- a/tester/main.cpp +++ b/tester/main.cpp @@ -1,6 +1,6 @@ -#include #include #include +#include #include "../test_cases/test_cases.h" #include "abstracthook.h" @@ -9,12 +9,14 @@ #pragma comment(lib, "..\\x64\\debug\\test_cases.lib") extern AbstractHookEngine* g_mhook, - *g_PolyHook; + *g_PolyHook, + *g_MinHook; int main(int argc, char** argv) { AbstractHookEngine* engines[] = { g_mhook, - g_PolyHook + g_PolyHook, + g_MinHook }; for(auto&& x : engines) { @@ -25,7 +27,7 @@ int main(int argc, char** argv) { } SelfTest(); - std::cout << x->name() << ':' << x->all_hooked() << '\n'; + std::cout << *x << std::endl; x->unhook_all(); } } \ No newline at end of file diff --git a/tester/mhook.cpp b/tester/mhook.cpp index 433f036..aefc4e9 100644 --- a/tester/mhook.cpp +++ b/tester/mhook.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include #include "../third_party/mhook/mhook-lib/mhook.h" #include "typedefs.h" diff --git a/tester/minhook.cpp b/tester/minhook.cpp new file mode 100644 index 0000000..718990f --- /dev/null +++ b/tester/minhook.cpp @@ -0,0 +1,90 @@ +#include +#include +#include + +#include "typedefs.h" +#include "..\third_party\minhook\include\minhook.h" +#include "abstracthook.h" +#include "minhook.h" + +static auto initalized = MH_Initialize(); + +static TypeSmall trueSmall = nullptr; +static TypeBranch trueBranch = nullptr; +static TypeRip_relative trueRip_Relative = nullptr; +static TypeAVX trueAVX = nullptr; +static TypeRDRAND trueRDRAND = nullptr; +static TypeLoop trueLoop = nullptr; +static TypeTailRecursion trueTailRecursion = nullptr; + +AbstractHookEngine* g_MinHook = new MinHook(); + + +uint64_t MinHook_Hooks::hookSmall(void) { + g_MinHook->small_ = true; + + return trueSmall(); +} + +uint64_t MinHook_Hooks::hookBranch(uint64_t x) { + g_MinHook->branch = true; + + return trueBranch(x); +} + +uint64_t MinHook_Hooks::hookRip_relative(void) { + g_MinHook->rip_relative = true; + + return trueRip_Relative(); +} + +void MinHook_Hooks::hookAVX(float num, void* res) { + g_MinHook->avx = true; + + return trueAVX(num, res); +} + +uint32_t MinHook_Hooks::hookRDRAND(void) { + g_MinHook->rdrand = true; + + return trueRDRAND(); +} + +uint32_t MinHook_Hooks::hookLoop(uint32_t num, uint32_t cnt) { + g_MinHook->loop = true; + + return trueLoop(num, cnt); +} + +uint32_t MinHook_Hooks::hookTail_recursion(uint32_t x) { + g_MinHook->tail_recursion = true; + + return trueTailRecursion(x); +} + +bool MinHook::hook_all(void) { + bool ret = MH_CreateHook(&_small, &MinHook_Hooks::hookSmall, (LPVOID*)&trueSmall) == MH_OK; + ret |= MH_CreateHook(&_branch, &MinHook_Hooks::hookBranch, (LPVOID*)&trueBranch) == MH_OK; + ret |= MH_CreateHook(&rip_relative, &MinHook_Hooks::hookRip_relative, (LPVOID*)&trueRip_Relative) == MH_OK; + + ret |= MH_CreateHook(&_AVX, &MinHook_Hooks::hookAVX, (LPVOID*)&trueAVX) == MH_OK; + ret |= MH_CreateHook(&_RDRAND, &MinHook_Hooks::hookRDRAND, (LPVOID*)&trueRDRAND) == MH_OK; + + ret |= MH_CreateHook(&_loop, &MinHook_Hooks::hookLoop, (LPVOID*)&trueLoop) == MH_OK; + ret |= MH_CreateHook(&_tail_recursion, &MinHook_Hooks::hookTail_recursion, (LPVOID*)&trueTailRecursion) == MH_OK; + + ret |= MH_EnableHook(MH_ALL_HOOKS) == MH_OK; + + return ret; +} + +bool MinHook::unhook_all() { + return MH_DisableHook(MH_ALL_HOOKS) == MH_OK && + MH_RemoveHook(&_small) == MH_OK && + MH_RemoveHook(&_branch) == MH_OK && + MH_RemoveHook(&rip_relative) == MH_OK && + MH_RemoveHook(&_AVX) == MH_OK && + MH_RemoveHook(&_RDRAND) == MH_OK && + MH_RemoveHook(&_loop) == MH_OK && + MH_RemoveHook(&_tail_recursion) == MH_OK; +} \ No newline at end of file diff --git a/tester/minhook.h b/tester/minhook.h new file mode 100644 index 0000000..27efb4d --- /dev/null +++ b/tester/minhook.h @@ -0,0 +1,33 @@ +#pragma once + +namespace MinHook_Hooks { + uint64_t hookSmall(void); + uint64_t hookBranch(uint64_t); + uint64_t hookRip_relative(void); + void hookAVX(float num, void* res); + uint32_t hookRDRAND(void); + uint32_t hookLoop(uint32_t num, uint32_t cnt); + uint32_t hookTail_recursion(uint32_t x); +}; + +class MinHook : public AbstractHookEngine { +private: + +public: + bool hook_all(); + bool unhook_all(); + + MinHook() : AbstractHookEngine("MinHook") + { + + } + + friend uint64_t MinHook_Hooks::hookSmall(void); + friend uint64_t MinHook_Hooks::hookBranch(uint64_t); + friend uint64_t MinHook_Hooks::hookRip_relative(void); + + friend void MinHook_Hooks::hookAVX(float num, void* res); + friend uint32_t MinHook_Hooks::hookRDRAND(void); + friend uint32_t MinHook_Hooks::hookLoop(uint32_t num, uint32_t cnt); + friend uint32_t MinHook_Hooks::hookTail_recursion(uint32_t x); +}; \ No newline at end of file diff --git a/tester/polyhook.cpp b/tester/polyhook.cpp index e4082a5..1c1e830 100644 --- a/tester/polyhook.cpp +++ b/tester/polyhook.cpp @@ -1,4 +1,5 @@ -#include +#include +#include #include #include #include "..\third_party\poly\PolyHook\PolyHook.hpp" @@ -8,13 +9,13 @@ #pragma comment(lib, "..\\x64\\debug\\test_cases.lib") -static TypeSmall trueSmall = &_small; -static TypeBranch trueBranch = &_branch; -static TypeRip_relative trueRip_Relative = &_rip_relative; -static TypeAVX trueAVX = &_AVX; -static TypeRDRAND trueRDRAND = &_RDRAND; -static TypeLoop trueLoop = &_loop; -static TypeTailRecursion trueTailRecursion = &_tail_recursion; +static TypeSmall trueSmall = nullptr; +static TypeBranch trueBranch = nullptr; +static TypeRip_relative trueRip_Relative = nullptr; +static TypeAVX trueAVX = nullptr; +static TypeRDRAND trueRDRAND = nullptr; +static TypeLoop trueLoop = nullptr; +static TypeTailRecursion trueTailRecursion = nullptr; AbstractHookEngine* g_PolyHook = new PolyHook(); diff --git a/tester/tester.vcxproj b/tester/tester.vcxproj index a04bce7..e5bbd46 100644 --- a/tester/tester.vcxproj +++ b/tester/tester.vcxproj @@ -150,11 +150,13 @@ + + @@ -166,6 +168,7 @@ + diff --git a/tester/tester.vcxproj.filters b/tester/tester.vcxproj.filters index a38d443..154cbb0 100644 --- a/tester/tester.vcxproj.filters +++ b/tester/tester.vcxproj.filters @@ -24,6 +24,9 @@ Source Files + + Source Files + @@ -38,6 +41,9 @@ Header Files + + Header Files + @@ -48,5 +54,6 @@ + \ No newline at end of file