Модератор форума
-
Автор темы
- #1
В GameOverlayRenderer.dll есть замечательная функция с инициализацией и удалением всех хуков, соответственно есть и функции для хука/анхука
Как в ней выглядит снятие хука:
То есть, для того, чтобы снять хук, созданный GameOverlayRenderer, нужно вызвать условно названную unhook_fn функцию, при этом в аргумент поместить адрес функции (не оригинала, его не нужно искать)
Внизу как обычно будет прикреплен весь код + дамп gameoverlayrenderer.dll
Создадим структуру и функцию, которую мы запишем и вызовем:
В основной функции откроем процесс игры, найдем в ней адрес и размер gameoverlayrenderer.dll
Для примера рассмотрим снятие хука ShellExecuteExW из shell32.dll
Создадим структуру, заполним ее. Саму функцию анхука найдем с помощью поиска паттерна
Выделим память под функцию и аргумент, запишем туда их и вызовем функцию. Закроем поток и освободим память
Как выглядит ShellExecuteExW до снятия хука:
После:
Как видите, хук снят
Уже под самый конец заметил, что это практически то же самое, что и показал d4rkd3n1337 в https://yougame.biz/threads/126447/, только у меня цель не хукнуть, а снять хук с любой функции
хотел у него спросить не против ли он этой темы, но................................
Код проекта и дамп gameoverlayrenderer.dll + gameoverlayrenderer.idb (если хотите найти функцию инициализации хуков/их снятия, в поиске ищите setup_hooks):
Как в ней выглядит снятие хука:
То есть, для того, чтобы снять хук, созданный 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);
}
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;
Создадим структуру, заполним ее. Саму функцию анхука найдем с помощью поиска паттерна
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);
После:
Как видите, хук снят
Уже под самый конец заметил, что это практически то же самое, что и показал d4rkd3n1337 в https://yougame.biz/threads/126447/, только у меня цель не хукнуть, а снять хук с любой функции
хотел у него спросить не против ли он этой темы, но................................
Код проекта и дамп gameoverlayrenderer.dll + gameoverlayrenderer.idb (если хотите найти функцию инициализации хуков/их снятия, в поиске ищите setup_hooks):
Пожалуйста, авторизуйтесь для просмотра ссылки.