Показать сообщение отдельно

  #27  
Старый 09.08.2024, 01:09
fuflexxxx
Познающий
Регистрация: 10.06.2020
Сообщений: 37
С нами: 3119285

Репутация: 63
По умолчанию

Цитата:
Сообщение от maksmanus228  

void* SetCallHook(uintptr_t HookAddress, void* DetourFunction) {
uintptr_t OriginalFunction = *reinterpret_cast(HookAddress + 1) + HookAddress + 5;
DWORD oldProt;
VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), PAGE_READWRITE, &oldProt);
*reinterpret_cast(HookAddress + 1) = reinterpret_cast(DetourFunction) - HookAddress - 5;
VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), oldProt, &oldProt);
return reinterpret_cast(OriginalFunction);
}

а причем тут хук адрес + 1 Откуда взялась единица? объясните пожалуйста
Инструкции Call/Jmp работают через переход по RVA, Инструкция состоит из байтов E8/E9 + 4 байта на RVA. Т.е HookAddress - это адрес, где будут байты примерно такие E8 05 00 00 00 - в данном примере будет вызвана функция по адресу текущему + 0x5, и получается, что HookAdress + 1 - это байты rva. Они обычно кастуются к типу 4 байта и туда пишется своё значение.
 
Ответить с цитированием