mirror of
https://github.com/qwertyuiop3/Storm.git
synced 2025-09-19 04:05:58 +08:00
optional intersection testing. mindamage is next
This commit is contained in:
6
Redirection_Manager/Redirection_Manager.hpp
Normal file
6
Redirection_Manager/Redirection_Manager.hpp
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
namespace Redirection_Manager
|
||||
{
|
||||
#include "Redirection_Manager_Functions.hpp"
|
||||
};
|
30
Redirection_Manager/Redirection_Manager_Copy_Table.hpp
Normal file
30
Redirection_Manager/Redirection_Manager_Copy_Table.hpp
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
void* Copy_Table(void* Table_Location)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
unsigned __int32 Functions_Count = 0;
|
||||
#else
|
||||
unsigned __int64 Functions_Count = 0;
|
||||
#endif
|
||||
|
||||
Take_Function_Into_Account_Label:
|
||||
{
|
||||
#ifdef Bits_32
|
||||
if (*(void**)((unsigned __int32)Table_Location + Functions_Count) != nullptr)
|
||||
#else
|
||||
if (*(void**)((unsigned __int64)Table_Location + Functions_Count) != nullptr)
|
||||
#endif
|
||||
{
|
||||
Functions_Count += sizeof(void*);
|
||||
|
||||
goto Take_Function_Into_Account_Label;
|
||||
}
|
||||
}
|
||||
|
||||
void* Copied_Table_Location = malloc(Functions_Count);
|
||||
|
||||
__builtin_memcpy(Copied_Table_Location, Table_Location, Functions_Count);
|
||||
|
||||
return Copied_Table_Location;
|
||||
}
|
15
Redirection_Manager/Redirection_Manager_Functions.hpp
Normal file
15
Redirection_Manager/Redirection_Manager_Functions.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include "Redirection_Manager_Redirect_Function.hpp"
|
||||
|
||||
#include "Redirection_Manager_Restore_Function.hpp"
|
||||
|
||||
#include "Redirection_Manager_Restore_Redirection.hpp"
|
||||
|
||||
#include "Redirection_Manager_Copy_Table.hpp"
|
||||
|
||||
#include "Redirection_Manager_Redirect_Function_In_Table.hpp"
|
||||
|
||||
#include "Redirection_Manager_Redirect_Table.hpp"
|
||||
|
||||
#include "Redirection_Manager_Restore_Table.hpp"
|
125
Redirection_Manager/Redirection_Manager_Redirect_Function.hpp
Normal file
125
Redirection_Manager/Redirection_Manager_Redirect_Function.hpp
Normal file
@ -0,0 +1,125 @@
|
||||
#pragma once
|
||||
|
||||
void Redirect_Function(__int8 Modify_Access_Rights, void* Original_Function_Location, void* Redirected_Function_Location)
|
||||
{
|
||||
unsigned long __int32 Previous_Access_Rights;
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef Bits_32
|
||||
*(__int8*)Original_Function_Location = 104;
|
||||
|
||||
*(void**)((unsigned __int32)Original_Function_Location + 1) = Redirected_Function_Location;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int32)Original_Function_Location + 5) = 195;
|
||||
#else
|
||||
*(__int8*)Original_Function_Location = 80;
|
||||
|
||||
*(unsigned __int16*)((unsigned __int64)Original_Function_Location + 1) = 47176;
|
||||
|
||||
*(void**)((unsigned __int64)Original_Function_Location + 3) = Redirected_Function_Location;
|
||||
|
||||
*(__int32*)((unsigned __int64)Original_Function_Location + 11) = 604276552;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int64)Original_Function_Location + 15) = 195;
|
||||
#endif
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef Bits_32
|
||||
void Redirect_Function(void*& Original_Function_Caller_Location, unsigned __int32 Original_Function_Caller_Offset, void* Original_Function_Location, __int8 Modify_Access_Rights, void* Redirected_Function_Location)
|
||||
#else
|
||||
void Redirect_Function(void*& Original_Function_Caller_Location, unsigned __int64 Original_Function_Caller_Offset, void* Original_Function_Location, __int8 Modify_Access_Rights, void* Redirected_Function_Location)
|
||||
#endif
|
||||
{
|
||||
unsigned long __int32 Previous_Access_Rights;
|
||||
|
||||
#ifdef Bits_32
|
||||
Original_Function_Caller_Location = malloc(12 + Original_Function_Caller_Offset);
|
||||
|
||||
*(void**)Original_Function_Caller_Location = *(void**)Original_Function_Location;
|
||||
|
||||
*(unsigned __int16*)((unsigned __int32)Original_Function_Caller_Location + 4) = *(unsigned __int16*)((unsigned __int32)Original_Function_Location + 4);
|
||||
|
||||
__builtin_memcpy((void*)((unsigned __int32)Original_Function_Caller_Location + 6), (void*)((unsigned __int32)Original_Function_Location + 6), Original_Function_Caller_Offset);
|
||||
|
||||
*(__int8*)((unsigned __int32)Original_Function_Caller_Location + 6 + Original_Function_Caller_Offset) = 104;
|
||||
|
||||
*(void**)((unsigned __int32)Original_Function_Caller_Location + 7 + Original_Function_Caller_Offset) = (void*)((unsigned __int32)Original_Function_Location + 6 + Original_Function_Caller_Offset);
|
||||
|
||||
*(unsigned __int8*)((unsigned __int32)Original_Function_Caller_Location + 11 + Original_Function_Caller_Offset) = 195;
|
||||
|
||||
VirtualProtect(Original_Function_Caller_Location, 12 + Original_Function_Caller_Offset, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#else
|
||||
Original_Function_Caller_Location = malloc(32 + Original_Function_Caller_Offset);
|
||||
|
||||
*(void**)Original_Function_Caller_Location = *(void**)Original_Function_Location;
|
||||
|
||||
*(void**)((unsigned __int64)Original_Function_Caller_Location + 8) = *(void**)((unsigned __int64)Original_Function_Location + 8);
|
||||
|
||||
__builtin_memcpy((void*)((unsigned __int64)Original_Function_Caller_Location + 16), (void*)((unsigned __int64)Original_Function_Location + 16), Original_Function_Caller_Offset);
|
||||
|
||||
*(__int8*)((unsigned __int64)Original_Function_Caller_Location + 16 + Original_Function_Caller_Offset) = 80;
|
||||
|
||||
*(unsigned __int16*)((unsigned __int64)Original_Function_Caller_Location + 17 + Original_Function_Caller_Offset) = 47176;
|
||||
|
||||
*(void**)((unsigned __int64)Original_Function_Caller_Location + 19 + Original_Function_Caller_Offset) = (void*)((unsigned __int64)Original_Function_Location + 16 + Original_Function_Caller_Offset);
|
||||
|
||||
*(__int32*)((unsigned __int64)Original_Function_Caller_Location + 27 + Original_Function_Caller_Offset) = 604276552;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int64)Original_Function_Caller_Location + 31 + Original_Function_Caller_Offset) = 195;
|
||||
|
||||
VirtualProtect(Original_Function_Caller_Location, 32 + Original_Function_Caller_Offset, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#endif
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef Bits_32
|
||||
*(__int8*)Original_Function_Location = 104;
|
||||
|
||||
*(void**)((unsigned __int32)Original_Function_Location + 1) = Redirected_Function_Location;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int32)Original_Function_Location + 5) = 195;
|
||||
#else
|
||||
*(__int8*)Original_Function_Location = 80;
|
||||
|
||||
*(unsigned __int16*)((unsigned __int64)Original_Function_Location + 1) = 47176;
|
||||
|
||||
*(void**)((unsigned __int64)Original_Function_Location + 3) = Redirected_Function_Location;
|
||||
|
||||
*(__int32*)((unsigned __int64)Original_Function_Location + 11) = 604276552;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int64)Original_Function_Location + 15) = 195;
|
||||
#endif
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
void Redirect_Function_In_Table(__int8 Modify_Access_Rights, void* Original_Function_In_Table_Location, void* Redirected_Function_Location)
|
||||
{
|
||||
unsigned long __int32 Previous_Access_Rights;
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
VirtualProtect(Original_Function_In_Table_Location, sizeof(void*), PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
}
|
||||
|
||||
*(void**)Original_Function_In_Table_Location = Redirected_Function_Location;
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
VirtualProtect(Original_Function_In_Table_Location, sizeof(void*), Previous_Access_Rights, &Previous_Access_Rights);
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
void Redirect_Table(void* Original_Table_Container_Location, void* Redirected_Table_Location)
|
||||
{
|
||||
*(void**)Original_Table_Container_Location = Redirected_Table_Location;
|
||||
}
|
39
Redirection_Manager/Redirection_Manager_Restore_Function.hpp
Normal file
39
Redirection_Manager/Redirection_Manager_Restore_Function.hpp
Normal file
@ -0,0 +1,39 @@
|
||||
#pragma once
|
||||
|
||||
void Restore_Function(__int8 Modify_Access_Rights, void* Original_Function_Location, void* Original_Function_Caller_Location, __int8 Delete_Original_Function_Caller)
|
||||
{
|
||||
unsigned long __int32 Previous_Access_Rights;
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef Bits_32
|
||||
*(void**)Original_Function_Location = *(void**)Original_Function_Caller_Location;
|
||||
|
||||
*(unsigned __int16*)((unsigned __int32)Original_Function_Location + 4) = *(unsigned __int16*)((unsigned __int32)Original_Function_Caller_Location + 4);
|
||||
#else
|
||||
*(void**)Original_Function_Location = *(void**)Original_Function_Caller_Location;
|
||||
|
||||
*(void**)((unsigned __int64)Original_Function_Location + 8) = *(void**)((unsigned __int64)Original_Function_Caller_Location + 8);
|
||||
#endif
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (Delete_Original_Function_Caller == 1)
|
||||
{
|
||||
free(Original_Function_Caller_Location);
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
void Restore_Redirection(__int8 Modify_Access_Rights, void* Original_Function_Location, void* Redirected_Function_Location)
|
||||
{
|
||||
unsigned long __int32 Previous_Access_Rights;
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, PAGE_EXECUTE_READWRITE, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef Bits_32
|
||||
*(__int8*)Original_Function_Location = 104;
|
||||
|
||||
*(void**)((unsigned __int32)Original_Function_Location + 1) = Redirected_Function_Location;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int32)Original_Function_Location + 5) = 195;
|
||||
#else
|
||||
*(__int8*)Original_Function_Location = 80;
|
||||
|
||||
*(unsigned __int16*)((unsigned __int64)Original_Function_Location + 1) = 47176;
|
||||
|
||||
*(void**)((unsigned __int64)Original_Function_Location + 3) = Redirected_Function_Location;
|
||||
|
||||
*(__int32*)((unsigned __int64)Original_Function_Location + 11) = 604276552;
|
||||
|
||||
*(unsigned __int8*)((unsigned __int64)Original_Function_Location + 15) = 195;
|
||||
#endif
|
||||
|
||||
if (Modify_Access_Rights == 1)
|
||||
{
|
||||
#ifdef Bits_32
|
||||
VirtualProtect(Original_Function_Location, 6, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#else
|
||||
VirtualProtect(Original_Function_Location, 16, Previous_Access_Rights, &Previous_Access_Rights);
|
||||
#endif
|
||||
}
|
||||
}
|
11
Redirection_Manager/Redirection_Manager_Restore_Table.hpp
Normal file
11
Redirection_Manager/Redirection_Manager_Restore_Table.hpp
Normal file
@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
void Restore_Table(void* Original_Table_Container_Location, void* Original_Table_Location, __int8 Delete_Redirected_Table, void* Redirected_Table_Location)
|
||||
{
|
||||
*(void**)Original_Table_Container_Location = Original_Table_Location;
|
||||
|
||||
if (Delete_Redirected_Table == 1)
|
||||
{
|
||||
free(Redirected_Table_Location);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user