Опубликовано 30 ноября, 20178 г. 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 И наш тайпдеф будет таким 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,; } Пробуйте) With love by P45H3 =)
comment_124With love by P45H3 =)