Перейти к содержанию
Опубликовано
comment_124
В этом гайде я расскажу про использование библиотеки detour для сетапа хуков.

Поехали.

 

Создаём Win32 Dll.

Скачиваем архив (клик) с файлами.

После создания проекта добавляем файлы из архива в папку с проектом и в сам проект.

После в файле DllMain подключаем всё файлы



#include <Windows.h>
#include <iostream>
#include "detours.h"
#include "PatternScan.h"


 

Далее создаём объекты для работы



DWORD FuncAddr= 0;
PatternScan * Scanner = nullptr;


 

После описываем апиентри дллки



BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
//Здесь будет наш паттерн.
FuncAddr = Scanner->FindPattern(" ", " ", " ");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//сетап хука
DetourAttach(&(LPVOID&)FuncAddr, &OurHooked;
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//снятие хука
DetourDetach(&(LPVOID&)FuncAddr, &OurHooked);
DetourTransactionCommit();
delete Scanner;
}
return TRUE;
}


 

После этого мы начинаем искать что мы будем хукать.

Допустим у нас есть такое приложение



#include <Windows.h>
#include <iostream>
int FuncToHooked(int a, int
{
return a + b;
}
 
int main()
{
while (true)
{
std::cout << FuncToHooked(5,5) << std::endl;
Sleep(2000);
}
}


 

Теперь для иды нужно поставить этот плагин.

Кидаем в папку Plugins

 

заходим в IDA 6.8

и ищем нашу функцию.

Вот она:


http://s019.radikal.ru/i638/1709/1c/8632b23bbb6c.png


 

Далее пкм по ней и Text View


http://s019.radikal.ru/i644/1709/50/1d67137e6270.png


 

Видим что-то типо этого


http://s016.radikal.ru/i337/1709/60/654205a7d6d6.png


 

Это и есть наша функция.

Выделяем её от типа до retn.


http://s019.radikal.ru/i637/1709/99/b485740a81a3.png


 

Далее жмём Edit -> Plugins -> SigMaker

и выбираем второе


http://s019.radikal.ru/i621/1709/13/e13af51732bf.png


и жмём ОК.

 

В низу появится паттерн + маска


http://i075.radikal.ru/1709/d6/7a4da758340b.png


 

Выделаем и идём в студию.

Видим Это



FuncAddr = Scanner->FindPattern(" ", " ", " ");


В первый параметр передаём имя процесса, во второе паттерн, и в 3 маску.

 

В результате у вас получится примерно это



FuncAddr = Scanner->FindPattern("testprogram.exe", " \x55\x8B\xEC\x8B\x45\x08\x03\x45\x0C\x5D\xC3", "xxxxxxxxxxx");


 

Всё теперь осталось описать Хук-функцию. Идём вверх(над апиентри) и создаём тайпдеф нашей функции с параметрами(или без) - это мы увидим в IDA.

 

Хукаемая функция выглядит так:

int __cdecl FuncToHooked(int a, int B)

 

И наш тайпдеф будет таким



typedef int(*hFunc)(int a, int ;


 

Далее опишем саму функцию

 



int OurHooked(int a, int
{
a += 100;
b += 50;
hFunc original = (hFunc)FuncAddr;
return original(a,;
}


Наша хукаемая функция возвращает сумму a , b;

Теперь при хуке будет не 5 + 5, а 105 + 55.

 

Ну в принципе всё. Для хука void функций делайте так:

 



typedef LPVOID(*hFunc)(int a, int ;
kek OurHooked(int a, int
{
a += 100;
hFunc original = (hFunc)FuncAddr;
return (hFunc)original(a,;
}


 

Пробуйте)

Рекомендуемые сообщения

  • 2 месяца спустя...
Гость
Эта тема закрыта для публикации ответов.