polyhook
This commit is contained in:
@@ -15,6 +15,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mhook-test", "third_party\m
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyHook", "third_party\poly\PolyHook\PolyHook.vcxproj", "{64269F60-A538-4327-82EE-AB4BF4766CE9}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PolyHook", "third_party\poly\PolyHook\PolyHook.vcxproj", "{64269F60-A538-4327-82EE-AB4BF4766CE9}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "third_party\minhook\build\VC15\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|x64 = Debug|x64
|
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|x64.Build.0 = Release|x64
|
||||||
{64269F60-A538-4327-82EE-AB4BF4766CE9}.Release|x86.ActiveCfg = Release|Win32
|
{64269F60-A538-4327-82EE-AB4BF4766CE9}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{64269F60-A538-4327-82EE-AB4BF4766CE9}.Release|x86.Build.0 = 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
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -33,11 +33,24 @@ public:
|
|||||||
virtual bool hook_all() = 0;
|
virtual bool hook_all() = 0;
|
||||||
virtual bool unhook_all() = 0;
|
virtual bool unhook_all() = 0;
|
||||||
|
|
||||||
bool all_hooked() {
|
bool all_hooked() const {
|
||||||
return small_ && branch && rip_relative && avx && rdrand && loop && tail_recursion;
|
return small_ && branch && rip_relative && avx && rdrand && loop && tail_recursion;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* name() {
|
const char* name() const {
|
||||||
return name_;
|
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;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <Windows.h>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
#include "../test_cases/test_cases.h"
|
#include "../test_cases/test_cases.h"
|
||||||
|
|
||||||
#include "abstracthook.h"
|
#include "abstracthook.h"
|
||||||
@@ -9,12 +9,14 @@
|
|||||||
#pragma comment(lib, "..\\x64\\debug\\test_cases.lib")
|
#pragma comment(lib, "..\\x64\\debug\\test_cases.lib")
|
||||||
|
|
||||||
extern AbstractHookEngine* g_mhook,
|
extern AbstractHookEngine* g_mhook,
|
||||||
*g_PolyHook;
|
*g_PolyHook,
|
||||||
|
*g_MinHook;
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
AbstractHookEngine* engines[] = {
|
AbstractHookEngine* engines[] = {
|
||||||
g_mhook,
|
g_mhook,
|
||||||
g_PolyHook
|
g_PolyHook,
|
||||||
|
g_MinHook
|
||||||
};
|
};
|
||||||
|
|
||||||
for(auto&& x : engines) {
|
for(auto&& x : engines) {
|
||||||
@@ -25,7 +27,7 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SelfTest();
|
SelfTest();
|
||||||
std::cout << x->name() << ':' << x->all_hooked() << '\n';
|
std::cout << *x << std::endl;
|
||||||
x->unhook_all();
|
x->unhook_all();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include "../third_party/mhook/mhook-lib/mhook.h"
|
#include "../third_party/mhook/mhook-lib/mhook.h"
|
||||||
#include "typedefs.h"
|
#include "typedefs.h"
|
||||||
|
|||||||
90
tester/minhook.cpp
Normal file
90
tester/minhook.cpp
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
#include <cstdint>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
33
tester/minhook.h
Normal file
33
tester/minhook.h
Normal file
@@ -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);
|
||||||
|
};
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#include <Windows.h>
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "..\third_party\poly\PolyHook\PolyHook.hpp"
|
#include "..\third_party\poly\PolyHook\PolyHook.hpp"
|
||||||
@@ -8,13 +9,13 @@
|
|||||||
|
|
||||||
#pragma comment(lib, "..\\x64\\debug\\test_cases.lib")
|
#pragma comment(lib, "..\\x64\\debug\\test_cases.lib")
|
||||||
|
|
||||||
static TypeSmall trueSmall = &_small;
|
static TypeSmall trueSmall = nullptr;
|
||||||
static TypeBranch trueBranch = &_branch;
|
static TypeBranch trueBranch = nullptr;
|
||||||
static TypeRip_relative trueRip_Relative = &_rip_relative;
|
static TypeRip_relative trueRip_Relative = nullptr;
|
||||||
static TypeAVX trueAVX = &_AVX;
|
static TypeAVX trueAVX = nullptr;
|
||||||
static TypeRDRAND trueRDRAND = &_RDRAND;
|
static TypeRDRAND trueRDRAND = nullptr;
|
||||||
static TypeLoop trueLoop = &_loop;
|
static TypeLoop trueLoop = nullptr;
|
||||||
static TypeTailRecursion trueTailRecursion = &_tail_recursion;
|
static TypeTailRecursion trueTailRecursion = nullptr;
|
||||||
|
|
||||||
AbstractHookEngine* g_PolyHook = new PolyHook();
|
AbstractHookEngine* g_PolyHook = new PolyHook();
|
||||||
|
|
||||||
|
|||||||
@@ -150,11 +150,13 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
<ClCompile Include="mhook.cpp" />
|
<ClCompile Include="mhook.cpp" />
|
||||||
|
<ClCompile Include="minhook.cpp" />
|
||||||
<ClCompile Include="polyhook.cpp" />
|
<ClCompile Include="polyhook.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="abstracthook.h" />
|
<ClInclude Include="abstracthook.h" />
|
||||||
<ClInclude Include="mhook.h" />
|
<ClInclude Include="mhook.h" />
|
||||||
|
<ClInclude Include="minhook.h" />
|
||||||
<ClInclude Include="polyhook.h" />
|
<ClInclude Include="polyhook.h" />
|
||||||
<ClInclude Include="typedefs.h" />
|
<ClInclude Include="typedefs.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@@ -166,6 +168,7 @@
|
|||||||
<Object Include="..\x64\Debug\misc.obj" />
|
<Object Include="..\x64\Debug\misc.obj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Library Include="..\lib\Debug\libMinHook.x64.lib" />
|
||||||
<Library Include="..\third_party\poly\Capstone\msvc\x64\Release\capstone.lib" />
|
<Library Include="..\third_party\poly\Capstone\msvc\x64\Release\capstone.lib" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
|||||||
@@ -24,6 +24,9 @@
|
|||||||
<ClCompile Include="polyhook.cpp">
|
<ClCompile Include="polyhook.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="minhook.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="typedefs.h">
|
<ClInclude Include="typedefs.h">
|
||||||
@@ -38,6 +41,9 @@
|
|||||||
<ClInclude Include="polyhook.h">
|
<ClInclude Include="polyhook.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="minhook.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Object Include="..\x64\Debug\mhook.obj" />
|
<Object Include="..\x64\Debug\mhook.obj" />
|
||||||
@@ -48,5 +54,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Library Include="..\third_party\poly\Capstone\msvc\x64\Release\capstone.lib" />
|
<Library Include="..\third_party\poly\Capstone\msvc\x64\Release\capstone.lib" />
|
||||||
|
<Library Include="..\lib\Debug\libMinHook.x64.lib" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
Reference in New Issue
Block a user