sg
-
Автор темы
- #1
0. EntryPoint
Приветствую вас друзья. На связи ньюкамыч всея Руси. Сегодня оформим небольшом гайдик. Думаю он может быть полезен для новичков в сфере разработки читиксов для игр. Так как, находя какой-либо баг в своем mega-харош-хитаетвообщевсё продукте надо его отлаживать и изменять иногда по крупице в коде. А каждый раз компилить dll, закрывать игру, реинжектить, заходить в игру - занятие не из приятных.
Итак приступим же:
1. VMT
Даже сейчас, многие используют VMT хуки, что является небезопасным ( могу ошибаться, на ньюкамычах же ). Думаю, что вряд ли, среди тех, кто смотрит эту тему найдутся люди, которым не впадлу будет спастить VMT из лв или другого сурса. Так что, если вы такой, то в любом таком классе существует метод unhook. Называется в разных читах он по-разному, но вряд ли кто-то будет изъёбыаться и писать что-то иное.
Пример:
2. Detour
Чуть сложнее, чем просто написать unload(). Для этого нам понадобится функция DetourRemove(). Которая включается в себя 2 аргумента типа PBYTE. Первый аргумент - наша оригинальная функция, которой мы присвоили значение, когда хукали функцию, и второй аргумент - наша хукнутая функция.
Пример:
3. MinHook
Так же одна из простейших отгрузок, которая выполняется чисто одной строчкой:
По хорошему, лучше ещё проверять, равен ли он MH_OK, т.е. завершилась ли отгрузка удачно.
4. Динамическая память
Ну просто ради хорошего тона надо освобождать динамическую память. "Если сделал malloc, будь добр, устрой и free". Нескладно ? Да и хуй с ним, никому не нужна утечка памяти же. Важно понимать, что если мы используем malloc, то надо делать освобождение памяти через free с аргументом в виде нашего поинтера. Так как это СИшная функция. А если вы умелец и сделали это как предполагают плюсы, то будет проще - delete и наш поинтер.
5. Возвращение оригинальных адресов
Звучит странно ? Ну щас поймёте на примере отгрузки меню из кс:
6. Выгрузка DLL
Ну и наконец-то заключающаяся часть сего гайда, это простая выгрузка DLL. Так что приведу простенький и примитивный код:
7. DLL_PROCESS_DETACH
Вот как-то так. Хочу сказать, чтобы вы не били меня камнями, т.к. это один из первых моих гайдов, собрал всю информацию с UC, GH ( noad ) и из своей головы. Пишите, что стоит исправить, буду рад любой адекватной критике)
Приветствую вас друзья. На связи ньюкамыч всея Руси. Сегодня оформим небольшом гайдик. Думаю он может быть полезен для новичков в сфере разработки читиксов для игр. Так как, находя какой-либо баг в своем mega-харош-хитаетвообщевсё продукте надо его отлаживать и изменять иногда по крупице в коде. А каждый раз компилить dll, закрывать игру, реинжектить, заходить в игру - занятие не из приятных.
Итак приступим же:
1. VMT
Даже сейчас, многие используют VMT хуки, что является небезопасным ( могу ошибаться, на ньюкамычах же ). Думаю, что вряд ли, среди тех, кто смотрит эту тему найдутся люди, которым не впадлу будет спастить VMT из лв или другого сурса. Так что, если вы такой, то в любом таком классе существует метод unhook. Называется в разных читах он по-разному, но вряд ли кто-то будет изъёбыаться и писать что-то иное.
Пример:
C++:
// Инициализируем
vmthook* directx_hook;
//
// Что-то пишем
//
// Резко понадобилось отгрузить хук
directx_hook->unhook();
Чуть сложнее, чем просто написать unload(). Для этого нам понадобится функция DetourRemove(). Которая включается в себя 2 аргумента типа PBYTE. Первый аргумент - наша оригинальная функция, которой мы присвоили значение, когда хукали функцию, и второй аргумент - наша хукнутая функция.
Пример:
C++:
// Инициализируем
static auto setupbones = (DWORD)(util::FindSignature(crypt_str("client.dll"), "xy ?? ?? i xy i pi zd a ??"));
DWORD original_setupbones = (DWORD)DetourFunction((PBYTE)setupbones, (PBYTE)hooked_setupbones);
//
// Жестко использовали наши хуки
//
// Понадобилось выгрузить
DetourRemove((PBYTE)original_setupbones, (PBYTE)hooked_setupbones);
Так же одна из простейших отгрузок, которая выполняется чисто одной строчкой:
MH_DisableHook(MH_ALL_HOOKS);
По хорошему, лучше ещё проверять, равен ли он MH_OK, т.е. завершилась ли отгрузка удачно.
4. Динамическая память
Ну просто ради хорошего тона надо освобождать динамическую память. "Если сделал malloc, будь добр, устрой и free". Нескладно ? Да и хуй с ним, никому не нужна утечка памяти же. Важно понимать, что если мы используем malloc, то надо делать освобождение памяти через free с аргументом в виде нашего поинтера. Так как это СИшная функция. А если вы умелец и сделали это как предполагают плюсы, то будет проще - delete и наш поинтер.
5. Возвращение оригинальных адресов
Звучит странно ? Ну щас поймёте на примере отгрузки меню из кс:
C++:
// При иницализации мы находим наше окно, где будем рисовать и так же
// запоминаем ориг. WNDPROC ( неимоверно логично )
do
window = FindWindow(crypt_str("Valve001"), nullptr);
while (window == NULL);
oWndProc = (WNDPROC)SetWindowLongPtr(window, GWL_WNDPROC, (LONG_PTR)WndProc);
//
// Дальше хуки, отрисовка меню и т.п.
//
// Резко приспичило отгрузиться
if (hooks::unhook) {
// Отгружаем всё с помощью методов, описанных выше
hooks::unload();
pDevice->Release();
// Снова запоминаем оригинал WNDPROC'а
oWndProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)(oWndProc));
// ImGui moment...
ImGui_ImplWin32_Shutdown();
ImGui_ImplDX9_Shutdown();
ImGui::DestroyContext();
return 0;
Ну и наконец-то заключающаяся часть сего гайда, это простая выгрузка DLL. Так что приведу простенький и примитивный код:
C++:
// Ждем нажатия клавиши END и всё. В случае нажатия,
// выходим из цикла и потока
while (!GetAsyncKeyState(VK_END) & 1) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
FreeConsole();
Sleep(2000);
FreeLibraryAndExitThread(static_cast<HMODULE>(lpReserved), 0);
return TRUE;
7. DLL_PROCESS_DETACH
Вот как-то так. Хочу сказать, чтобы вы не били меня камнями, т.к. это один из первых моих гайдов, собрал всю информацию с UC, GH ( noad ) и из своей головы. Пишите, что стоит исправить, буду рад любой адекватной критике)