Крок 1: Знайти адресу цільової функції в DLL
Спочатку потрібно знайти адресу цільової функції в DLL. Для цього використовуйте GetProcAddress
для отримання адреси функції.
#include
FARPROC targetFunction = GetProcAddress(GetModuleHandle(L"target.dll"), "TargetFunctionName");
Крок 2: Перезаписати за допомогою інструкції переходу
Щоб перехопити функцію, потрібно перезаписати її перші кілька байтів інструкцією переходу до вашого коду. Ось як це можна зробити за допомогою асемблера:
#include
void* originalFunction = nullptr;
void MyHookFunction() {
// Користувацький код тут
}
void HookFunction() {
// Зберігаємо оригінальні байти
BYTE originalBytes[5];
memcpy(originalBytes, targetFunction, 5);
// Створюємо інструкцію переходу до вашої функції-перехоплювача
DWORD oldProtect;
VirtualProtect(targetFunction, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
// Записуємо інструкцію переходу
*(BYTE*)targetFunction = 0xE9; // Інструкція JMP
*(DWORD*)((BYTE*)targetFunction + 1) = (DWORD)MyHookFunction - (DWORD)targetFunction - 5;
// Відновлюємо захист пам'яті
VirtualProtect(targetFunction, 5, oldProtect, &oldProtect);
// За бажанням зберігаємо оригінальні байти для відновлення пізніше
originalFunction = (void*)((BYTE*)targetFunction + 5);
}
Крок 3: Викликати оригінальну функцію
Якщо ви хочете викликати оригінальну функцію після виконання вашого коду, ви можете використати збережені байти для відновлення оригінальних інструкцій і перейти до них.
void CallOriginalFunction() {
DWORD oldProtect;
VirtualProtect(targetFunction, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
// Відновлюємо оригінальні байти
memcpy(targetFunction, originalBytes, 5);
// Викликаємо оригінальну функцію
((void(*)())originalFunction)();
// За бажанням, знову перехоплюємо функцію після виклику оригіналу
HookFunction();
// Відновлюємо захист пам'яті
VirtualProtect(targetFunction, 5, oldProtect, &oldProtect);
}
Крок 4: Видалити перехоплення
Щоб видалити перехоплення та відновити оригінальну функцію, ви можете просто замінити перезаписані байти на оригінальні.
void UnhookFunction() {
DWORD oldProtect;
VirtualProtect(targetFunction, 5, PAGE_EXECUTE_READWRITE, &oldProtect);
// Відновлюємо оригінальні байти
memcpy(targetFunction, originalBytes, 5);
VirtualProtect(targetFunction, 5, oldProtect, &oldProtect);
}
Перекладено з: [Inline hook executables via injected DLL (Windows)](https://medium.com/@alonalush5/inline-hook-execvia-injected-dll-windows-ee12c7151e43)