Вбудоване перехоплення виконуваних файлів через ін’єкцію DLL (Windows)

Крок 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)

Leave a Reply

Your email address will not be published. Required fields are marked *