54 lines
1.1 KiB
C++
54 lines
1.1 KiB
C++
#pragma once
|
|
|
|
constexpr int Byte_Length = 6;
|
|
|
|
class inlinehook
|
|
{
|
|
private:
|
|
using uchar = unsigned char;
|
|
|
|
//原始函数处的汇编指令
|
|
uchar m_original_byte[Byte_Length];
|
|
//我们构造的汇编指令
|
|
uchar m_self_byte[Byte_Length];
|
|
|
|
//原始函数地址
|
|
int m_original_address;
|
|
//我们函数地址
|
|
int m_self_address;
|
|
|
|
DWORD Motify_memory_attributes(int address, DWORD attributes = PAGE_EXECUTE_READWRITE);
|
|
|
|
|
|
public:
|
|
|
|
inlinehook(int original_address, int self_address):m_original_address(original_address), m_self_address(self_address)
|
|
{
|
|
//构造jmp
|
|
m_self_byte[0] = '\xe9';
|
|
//计算偏移
|
|
int offset = self_address - (original_address + Byte_Length);
|
|
|
|
//构造跳转到我们的函数BYTE
|
|
memcpy(&m_self_byte[1], &offset, Byte_Length - 2);
|
|
|
|
m_self_byte[5] = '\x90';
|
|
//修改内存属性
|
|
DWORD attributes = Motify_memory_attributes(original_address);
|
|
|
|
//保存原始的函数地址的BYTE
|
|
memcpy(&m_original_byte, reinterpret_cast<void*>(original_address), Byte_Length);
|
|
|
|
//恢复内存属性
|
|
Motify_memory_attributes(original_address, attributes);
|
|
}
|
|
|
|
|
|
//修改地址
|
|
void Motify_address();
|
|
|
|
//还原地址
|
|
void Restore_address();
|
|
};
|
|
|