В игре Source SDK
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В этом гайде я расскажу про использование библиотеки 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 b)
{
return a + b;
}
int main()
{
while (true)
{
std::cout << FuncToHooked(5,5) << std::endl;
Sleep(2000);
}
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
плагин.Кидаем в папку Plugins
заходим в IDA 6.8
и ищем нашу функцию.
Вот она:
Далее пкм по ней и Text View
Видим что-то типо этого
Это и есть наша функция.
Выделяем её от типа до retn.
Далее жмём Edit -> Plugins -> SigMaker
и выбираем второе
В низу появится паттерн + маска
Выделаем и идём в студию.
Видим Это
Код:
FuncAddr = Scanner->FindPattern(" ", " ", " ");
В результате у вас получится примерно это
Код:
FuncAddr = Scanner->FindPattern("testprogram.exe", " \x55\x8B\xEC\x8B\x45\x08\x03\x45\x0C\x5D\xC3", "xxxxxxxxxxx");
Хукаемая функция выглядит так:
int __cdecl FuncToHooked(int a, int b)
И наш тайпдеф будет таким
Код:
typedef int(*hFunc)(int a, int b);
Код:
int OurHooked(int a, int b)
{
a += 100;
b += 50;
hFunc original = (hFunc)FuncAddr;
return original(a,b);
}
Теперь при хуке будет не 5 + 5, а 105 + 55.
Ну в принципе всё. Для хука void функций делайте так:
Код:
typedef LPVOID(*hFunc)(int a, int b);
kek OurHooked(int a, int b)
{
a += 100;
hFunc original = (hFunc)FuncAddr;
return (hFunc)original(a,b);
}
Последнее редактирование: