Я провел хороший час, пытаясь заставить ваш код работать, и в конце концов сдался, решив, что проще показать вам работающий код, чем пытаться исправить ваш.Ваша логика имеет смысл, но я думаю, что произошла пара небольших ошибок, приведших к провалу.
Итак, вот метод, который я использовал в течение долгого времени, основанный на некотором коде, которым мой друг поделился со мной по имени Solaire:
Обычная функция Hook / Detour:
bool Hook(BYTE* src, BYTE* dst, int len)
{
if (len < 5) return false;
DWORD curProtection;
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &curProtection);
uintptr_t relativeAddress = ((uintptr_t)dst - (uintptr_t)src) - 5;
*src = 0xE9;
*(uintptr_t *)((uintptr_t)src + 1) = relativeAddress;
VirtualProtect(src, len, curProtection, &curProtection);
return true;
}
Функция батута:
void * TrampolineHook(BYTE* src, BYTE* dst, int len)
{
// Make sure the length is greater than 5
if (len < 5) return 0;
// Create the gateway (len + 5 for the overwritten bytes + the jmp)
void* gateway = VirtualAlloc(0, len + 5, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//Write the stolen bytes into the gateway
memcpy(gateway, src, len);
// Get the gateway to destination addy
uintptr_t gatewayRelativeAddr = ((uintptr_t)src - (uintptr_t)gateway) - 5;
// Add the jmp opcode to the end of the gateway
*(BYTE*)((uintptr_t)gateway + len) = 0xE9;
// Add the address to the jmp
*(uintptr_t *)((uintptr_t)gateway + len + 1) = gatewayRelativeAddr;
// Place the hook at the destination
Hook(src, dst, len);
return gateway;
}
Вы уже знаете логику, поэтому мне не нужно объяснять код, комментариев должно быть достаточно.
Теперь ниже мы введем typedefуказатель на функцию, совпадающий с функцией ExitProcess, и префикс его «t» для шаблона.
Затем мы создаем указатель этого типа и префикс «o» для оригинала, потому что после запуска нашего кода мы будем вызывать«оригинальная» функция, использующая его.Тогда наша фактическая функция, на которую мы перенаправляем поток, получает префикс «h» для «зацепки» или чего-то еще.
Основной код:
typedef void(__stdcall* tExitProcess)(UINT);
tExitProcess oExitProcess;
void __stdcall hExitProcess(UINT uExitCode)
{
MessageBox(NULL, "Exiting!", "Exiting!", 0);
Sleep(1000);
return oExitProcess(uExitCode);
}
int main()
{
oExitProcess = (tExitProcess)TrampolineHook((BYTE*)&ExitProcess, (BYTE*)&hExitProcess, 5);
ExitProcess(0);
}
Довольно стандартная процедура, попробуйте ее и, возможно, сравнитеэто к вашему и, надеюсь, это поможет