Гайд Снимаем любой хук GameOverlayRenderer.dll

Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
В GameOverlayRenderer.dll есть замечательная функция с инициализацией и удалением всех хуков, соответственно есть и функции для хука/анхука

Как в ней выглядит снятие хука:
1585829763947.png

То есть, для того, чтобы снять хук, созданный GameOverlayRenderer, нужно вызвать условно названную unhook_fn функцию, при этом в аргумент поместить адрес функции (не оригинала, его не нужно искать)

Внизу как обычно будет прикреплен весь код + дамп gameoverlayrenderer.dll

Создадим структуру и функцию, которую мы запишем и вызовем:
C++:
typedef FARPROC(__stdcall* fnGetProcAddress)(HMODULE, LPCSTR);
typedef void(__cdecl* unhook_fn)(int);

struct Input
{
    HMODULE hModule;
    char Function[64];
    fnGetProcAddress pGetProcAddress;
    unhook_fn unhook;
};

void Unhook(Input* info)
{
    PVOID func = info->pGetProcAddress(info->hModule, info->Function);
    info->unhook((int)func);
}
В основной функции откроем процесс игры, найдем в ней адрес и размер gameoverlayrenderer.dll
C++:
DWORD pId = GetProcessId("csgo.exe");
ModInfo gameoverlayrenderer = GetModuleInfo("gameoverlayrenderer.dll", pId);
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);

cout << "GameOverlayRenderer.dll info: base at 0x" << std::hex << gameoverlayrenderer.Base << " size is 0x" << gameoverlayrenderer.Size << endl;
Для примера рассмотрим снятие хука ShellExecuteExW из shell32.dll
Создадим структуру, заполним ее. Саму функцию анхука найдем с помощью поиска паттерна
C++:
Input info;
ZeroMemory(&info, sizeof(Input));

info.pGetProcAddress = GetProcAddress;
info.unhook = (unhook_fn)FindPattern(hProc, gameoverlayrenderer, (BYTE*)"\x55\x8B\xEC\xC7", (char*)"xxxx");
info.hModule = (HMODULE)(GetModuleInfo("SHELL32.dll", pId).Base);
strcpy_s(info.Function, "ShellExecuteExW");

cout << "Unhook Function address: " << info.unhook << endl;
Выделим память под функцию и аргумент, запишем туда их и вызовем функцию. Закроем поток и освободим память
C++:
PVOID pFunc = VirtualAllocEx(hProc, 0, 0x1000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
PVOID pArg = VirtualAllocEx(hProc, 0, sizeof(Input), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);

WriteProcessMemory(hProc, pFunc, Unhook, 0x1000, 0);
WriteProcessMemory(hProc, pArg, &info, sizeof(Input), 0);

HANDLE hThread = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)pFunc, pArg, 0, 0);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);

VirtualFreeEx(hProc, pFunc, 0, MEM_RELEASE);
VirtualFreeEx(hProc, pArg, 0, MEM_RELEASE);

CloseHandle(hProc);
Как выглядит ShellExecuteExW до снятия хука:
1585830962556.png

После:
1585830996495.png

Как видите, хук снят


Уже под самый конец заметил, что это практически то же самое, что и показал d4rkd3n1337 в https://yougame.biz/threads/126447/, только у меня цель не хукнуть, а снять хук с любой функции
хотел у него спросить не против ли он этой темы, но................................


Код проекта и дамп gameoverlayrenderer.dll + gameoverlayrenderer.idb (если хотите найти функцию инициализации хуков/их снятия, в поиске ищите setup_hooks):
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
f3mb0y
Участник
Статус
Оффлайн
Регистрация
14 Фев 2017
Сообщения
625
Реакции[?]
291
Поинты[?]
1K
Ходят слухи, что раньше Valve хукали VirtualAlloc и VirtualFree. Там они собирали информацию что и зачем это вызывает в процессе игры. На данный момент это не делается.

Так же дополню что если снять хуки с тех функций, что использовались в "VAC Bypass'e", тоооо...
 
Эксперт
Статус
Оффлайн
Регистрация
16 Ноя 2017
Сообщения
1,570
Реакции[?]
1,266
Поинты[?]
4K
Ходят слухи, что раньше Valve хукали VirtualAlloc и VirtualFree. Там они собирали информацию что и зачем это вызывает в процессе игры. На данный момент это не делается.

Так же дополню что если снять хуки с тех функций, что использовались в "VAC Bypass'e", тоооо...
тоооо... :seemsgood::roflanEbalo::roflanEbalo::roflanEbalo:

А что, звучит Hypeово
 
Сверху Снизу