#pragma optimize( "", off )
int HookPayload()
{
return 28;
}
int GetNum()
{
return 99;
}
#pragma optimize( "", on )
int main()
{
printf("Before Hook, GetNum() returns %i\n", GetNum());
printf("AddrGetNum=%p, AddrGetHookPayload=%p\n", GetNum, HookPayload);
DWORD oldProtect;
BOOL success = VirtualProtect(GetNum, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
check(success);
//32 位相对跳转jump操作码为 E9,后面带着1个32位操作数作为跳转偏移量
uint8_t jmpInstruction[5] = { 0xE9, 0x0, 0x0, 0x0, 0x0 };
/*
要填写jmpInstruction的最后4个字节,我们需要它们之间的偏移量:payload函数和jmp指令之后的指令
*/
const int relAddr = (uint32_t)HookPayload - ((uint32_t)GetNum + sizeof(jmpInstruction));
memcpy(jmpInstruction + 1, &relAddr, 4);
memcpy(GetNum, jmpInstruction, sizeof(jmpInstruction));
printf("relAddr=%08X, %d\n", relAddr, relAddr);
printf("After Hook, getNum() returns %i\n", GetNum());
getchar();
return 0;
}