Что такое хук в КС:ГО

Хотел продолжить первый гайд, но понял что нужно объяснить что такое хуки

  1. Создание ASI-плагина с нуля
  2. Хуки – что это такое и как с ними работать
  3. Безопасная инициализация и работа с SAMP
  4. Работа с рендером и Directx9
  5. Обработка событий окна + ImGui

При использовании на других ресурсах необходимо указание авторства и ссылки на оригинальную темы!

Перед тем как начать:
Так как этот гайд сделан в целях обучения, здесь не будет показано использование готовых библиотек, а только сырой код.
В процессе написания гайда я понял что без знаний ассемблера и низкоуровневых вы поймете лишь малую часть от написанного здесь. Но если вы поймете что здесь написано — будет очень хорошо.

Все действия производились на Visual Studio 2019 с параметром /std:c++17 , в других версиях интерфейс может отличаться.
Все адреса указаны для SAMP R3-1, на других версиях будете ловить краши

И так, начнем:
Хук(от англ. Hook) — перехват. В нашем случае это перехват внутриигровых функций; Когда игра захочет их вызвать — будут выполняться наши действия (наш код), а затем уже можно продолжить выполнение функции, либо сразу сделать возврат, чтобы функция ничего не сделала.

ЧТО ПРОИСХОДИТ НА СЕРВЕРАХ КС С БЕСПЛАТНОЙ ПАУТИНКОЙ (ХУКОМ) // ТИПИЧНЫЙ FREE HOOK // CS 1.6

Перед тем как я расскажу про сами хуки, нужно немного углубится в устройство вызова функций.
У каждой функции есть свое соглашение о вызове. Соглашение о вызове — «Правило» которое регулирует каким образом аргументы функции будут переданы самой функции и как именно будет произведен возврат значения, а также кто будет очищать стек после вызова функции(это не полный список, но самое основное что стоит знать). Если например вызвать cdecl функцию указав соглашение о вызове stdcall , то вы получите UB(Undefined behaviour — неопределенное поведение)
В архитектуре x86 исторически сложилось, что разным людям не нравилось что-то в других соглашениях о вызове, и они создавали свои. На x64 такой бардак тоже есть, но уже между разными OC.
Существует много соглашений о вызовах, но описывать все я не буду, ибо они вам вряд ли пригодятся( pascal к примеру)
Мы же рассмотрим 4 соглашения о вызовах: cdecl , stdcall , fastcall , thiscall
У всех соглашений аргументы передаются справа налево через стек.

cdecl является основным соглашением о вызове и используется почти везде. Возврат осуществляется через регистр eax, регистр st0 для x87, и пару регистров eax:edx для значений размером в 5-8 байт. Стек очищает тот кто вызывает функцию, поэтому cdecl поддерживает переменное число аргументов. Установлено по умолчанию в MSVC.

stdcall является основным соглашением о вызовах в Windows, а также во многих библиотеках(например basslib). Возврат осуществляется через регистр eax, очистка стека производится самой функцией. Переменное число аргументов не поддерживает.

thiscall используется для вызова методов класса. В регистр ecx кладется скрытый аргумент this, очистка стека производится самой функцией, возврат значения через регистр eax. Переменное число аргументов не поддерживает.

Как использовать паутинку (хук) в кс 1.6? Легко!

fastcall используется редко. В хуках зачастую используется для обхода thiscall в msvc(чуть позже расскажу что это). Первые два аргумента кладутся в регистры ecx и edx, остальные в том же порядке через стек. Очистка стека производится самой функцией. Переменное число аргументов не поддерживает.

Из-за использования регистров для передачи аргументов его назвали fastcall, т.к. операции с регистрами на старых компьютерах были заметно быстрее операциями со стеком.

Теперь можно перейти к теории о хуках.
Для перехвата используются две техники — подмена вызова(call hook) и уже после вызова(в прологе) прыжок в хук.
Начнем с первого: в основном вызовы происходят по релативному адресу, но бывают и вызовы по абсолютному адресу который находится в регистре.
Релативный адрес(от англ. Relative address) — это адрес, относительно места откуда происходит вызов.
Абсолютный адрес — это адрес, указываемый относительно всего адресного пространства программы.
Наперед скажу что мы будем работать только с релативными адресами.
Покажу на примере вызова функции в GTA:SA:

.text:0053E972 00C E8 89 AE 1D 00 call _ZN5CFont12InitPerFrameEv ; CFont::InitPerFrame(void)

Вызов происходит по адресу 0x53E972, вызываемая функция находится по адресу 0x719800
Но asm код выше — дизассемблированный код. В самой программе он хранится вот так:
E8 89 AE 1D 00
Как вы уже могли догадаться, размер инструкции вызова — 5 байт
E8 — опкод вызова. В asm мнемонике записывается как call
89 AE 1D 00 — Релативный адрес вызова, записанный в порядке байт little endian. Что такое порядок байт — лучше почитать на википедии
Если перевести релативный адрес в нормальное число, то получим 0x1DAE89. Откуда же вышло это число?
Оно было посчитано как разница между адреса вызова и адреса вызываемой функции. Считается по формуле: (Адрес назначения вызова/прыжка) — (Адрес вызова/прыжка) — 5

  Эншент КС:ГО это

Спойлер: Для тех, кому интересно откуда взялась цифра 5

В процессоре есть специальный регистр EIP(RIP на x64). Расшифровывается как Instruction Pointer. После считывания процессором инструкции по адресу 0x53E972, Instrustion pointer смещается на 5 байт вперед(инструкция вызова имеет размер 5). А конечный адрес вызова вычисляется относительно EIP, поэтому нужно добавлять 5 байт смещения.

Очевидно что для перехвата нужно заменить релативный адрес на свой. Но если лишь заменить адрес вызова функции, то вы затрете оригинальную функцию, и те действия что должны были произойти — не перезайдут. Поэтому помимо этого нам нужно сохранить оригинальный релативный адрес и пересчитать его.
Займемся этим.
Сама функция установки хука будет предельна проста и будет лишь возвращать адрес, по которому нужно сделать прыжок обратно.
Перед подменой релативного адреса нужно снять защиту с секции кода приложения(защита там стоит воизбежание случайной записи в код и дальшейнего UB), а после подмены вернуть все обратно

Установка call хука:

void* SetCallHook(uintptr_t HookAddress, void* DetourFunction) < uintptr_t OriginalFunction = *reinterpret_cast(HookAddress + 1) + HookAddress + 5; DWORD oldProt; VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), PAGE_READWRITE, *reinterpret_cast(HookAddress + 1) = reinterpret_cast(DetourFunction) — HookAddress — 5; VirtualProtect(reinterpret_cast(HookAddress + 1), sizeof(uintptr_t), oldProt, return reinterpret_cast(OriginalFunction); >
Показывать буду на примере хука вывода сообщения в чат.
Хук будем ставить вот сюда:
.text:10067A2A 008 6A 00 push 0 ; a6 .text:10067A2C 00C C1 E8 08 shr eax, 8 .text:10067A2F 00C 0D 00 00 00 FF or eax, 0FF000000h .text:10067A34 00C 50 push eax ; a5 .text:10067A35 010 6A 00 push 0 ; a4 .text:10067A37 014 56 push esi ; a3 .text:10067A38 018 6A 04 push 4 ; a2 .text:10067A3A 01C 8B CF mov ecx, edi ; this .text:10067A3C 01C E8 1F FA FF FF call CChat__AddEntry ; this call will be hooked

Соглашение о вызове у нас thiscall (перед вызовом в ecx кладется pChat)
MSVC не дает использовать thiscall вне классов, поэтому мы будем эмулировать его через fastcall . Единственное отличие — дополнительный параметр EDX. В самой функции вы увидите его как void* EDX
Сначала напишем тело функции хука:

void __fastcall HOOK_AddChatMessage(void* pChat, void* EDX, int nType, const char* szText, const char* szPrefix, unsigned long textColor, unsigned long prefixColor) < std::cout : »

Ну а теперь установим сам хук:

// Где нибудь за пределами функции using CChat__AddChatMessage = void(__fastcall*)(void*, void*, int, const char*, const char*, unsigned long, unsigned long); // прототип функции, взят из IDA PRO CChat__AddChatMessage pOriginalFunction = nullptr; // Сама установка хука if (uintptr_t dwSAMP = reinterpret_cast(GetModuleHandleA(«samp.dll»)); dwSAMP != 0) < pOriginalFunction = reinterpret_cast(SetCallHook(dwSAMP + 0x67A3C, >

Компилируем код, кидаем асишник в папку игры, устанавливаем DebugConsole, заходим в игру и видим в консоли сообщения из чата.

Перейдем к jmp хукам.
jmp хуки ставятся где угодно(на самом деле call хуки тоже, но более запарно)
Для установки jmp хука требуется немного больше действий. Так как ставить мы его будем в случайном месте, не факт что там где мы будем ставить его, будет ровно 5 байт. Поэтому перед установкой хука нужно смотреть сколько байт занимают инструкции на месте установки хука. Я буду смотреть опять же на функции добавления сообщения в чат. Переходим в пролог(начало) функции и смотрим на ассемблерный код:

.text:10067460 000 55 push ebp .text:10067461 004 56 push esi .text:10067462 008 8B E9 mov ebp, ecx .text:10067464 008 57 push edi

И видим что у нас тут 4 опкода занимающих ровно 5 байт. Но если вам не повезет как тут, то нужно брать в большую сторону.
Например тут, нужно будет взять 6 байт.

.text:10067478 00C 8B 74 24 18 mov esi, [esp+0Ch+a4] .text:1006747C 00C 85 F6 test esi, esi

Идем дальше. Если мы просто затрем код по адресу, то у нас все сломается. Поэтому перед тем как ставить сам хук, нужно скопировать оригинальный код.
Пишем функцию для установки jmp хука(опкод у JMP — E9):

void* SetJmpHook(uintptr_t HookAddress, size_t HookSize, void* DetourFunction) < void* Trampoline = VirtualAlloc(0, HookSize + 5, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); // Аллоцируем память для трамплина if (Trampoline) < uintptr_t TrampolineJmpBack = reinterpret_cast(Trampoline) + HookSize; memcpy(Trampoline, reinterpret_cast(HookAddress), HookSize); // Копируем оригинальные байты в трамплин DWORD oldProt; VirtualProtect(reinterpret_cast(HookAddress), HookSize, PAGE_READWRITE, memset(reinterpret_cast(HookAddress), 0x90, HookSize); // Заполняем место хука нопами(чтобы не ломать листинг ассемблера) *reinterpret_cast(HookAddress) = 0xE9; // Ставим опкод прыжка *reinterpret_cast(HookAddress + 1) = reinterpret_cast(DetourFunction) — HookAddress — 5; // Ставим релативный адрес для прыжка в функцию обработчик хука VirtualProtect(reinterpret_cast(HookAddress), HookSize, oldProt, *reinterpret_cast(TrampolineJmpBack) = 0xE9; // Ставим в конец трамплина прыжок обратно // Ставим релативный адрес для прыжка обратно в функцию для продолжения выполнения *reinterpret_cast(TrampolineJmpBack + 1) = (HookAddress + HookSize) — TrampolineJmpBack — 5; return Trampoline; > return nullptr; >

  Кто такой флейм КС:ГО

В конец трамплина мы добавляем прыжок обратно, чтобы продолжить выполнение и ничего не сломать
Теперь пишем обработчик хука:
К сожалению в голых хуках не обойтись без функции-обработчика с ассемблерным кодом.

void HOOK_AddChatMessage(void* pChat, int nType, const char* szText, const char* szPrefix, unsigned long textColor, unsigned long prefixColor) < std::cout : » void __declspec(naked) HOOK_Raw_AddChatMessage(void) < static void* pChat; static int nType; static const char* szText; static const char* szPrefix; static unsigned long textColor, prefixColor; __asm < // Вытаскиваем все аргументы со стека mov eax, [esp + 0x04] mov nType, eax mov eax, [esp + 0x08] mov szText, eax mov eax, [esp + 0x0C] mov szPrefix, eax mov eax, [esp + 0x10] mov textColor, eax mov eax, [esp + 0x14] mov prefixColor, eax pushad // Сохраняем все регистры >HOOK_AddChatMessage(pChat, nType, szText, szPrefix, textColor, prefixColor); __asm < popad // вытаскиваем сохраненные регистры // Прыгаем в трамплин для продолжения исполнения. Если не нужно продолжать исполнение — нужно поставить опкод ret jmp pOriginalFunction >>

Вероятно посмотрев на код вы ничего не поняли. Сейчас объясню.
Т.к. теперь телом хука выступает функция HOOK_Raw_AddChatMessage и из нее мы вызываем наш обработчик, т.к. вызов делаем мы сами, то __fastcall и прочие заморочки в обработчике не нужны
__declspec(naked) указывает компилятору на то что не нужно генерировать код на входе и выходе из функции — мы сделаем это сами
pushad и popad нужны для сохранения и возврата в исходное состояние регистров. Т.к. мы указали компилятору не генерировать код на входе и выходе, то сохранять регистры некому, поэтому делаем это вручную.
Аргументы со стека теперь придется тащить самим, т.к. мы перехватываем уже после вызова. В этот момент на стеке появится еще одно значение, и еще один вызов сместит все аргументы в функции на 1, и произойдет не то, чего мы ожидали.
Теперь устанавливаем сам хук. Ставить будем тут:

.text:10067460 000 55 push ebp .text:10067461 004 56 push esi .text:10067462 008 8B E9 mov ebp, ecx .text:10067464 008 57 push edi

Источник: www.blast.hk

Тренировка хука Пуджа – отличный способ поднять свой скилл от Navi

Тренировка хука Пуджа – отличный способ поднять свой скилл от Navi

Несмотря на то что внешне Pudge можно безо всяких сомнений назвать самым неуклюжим и толстым героем DOTA, в действительности он представляет собой одного из наиболее необходимых и при этом сложных персонажей на сегодняшний день. При этом главной сложностью игры за этого персонажа является бросок крюка, вследствие чего многих, кому нравится за него играть, интересует тренировка хука.

Почему крюк так важен?

тренировка хук

Крюк представляет собой не просто вариант того, как можно компенсировать недостаточную мобильность этого персонажа, это еще и чрезвычайно важный тактический элемент, который может мгновенно изменить исход боя. В частности тренировка хука позволяет вам научиться моментально вытягивать определенного героя в нужное вам место, реализуя план своей команды и обрекая ее на победу.

Тони Хоук – человек, на которого равнялось целое поколение молодых ребят, осваивающих нелегкий путь.

Крюк представляет собой абсолютно универсальную способность, которая может активно использоваться как для защиты своих, так и для атаки противника. При этом, если самостоятельно никакая тренировка хука не поможет Пуджу начать эффективно гангать противников, то в команде грамотное использование этой способности может кардинально изменить исход боя.

пудж хук тренировка игра

Атака

Таким образом, если речь идет об использовании хука в качестве атакующей способности, вытягивание определенного героя в группу союзников практически всегда заканчивается моментальной его нейтрализацией, что является уже достаточно важным преимуществом для вашей команды, которая может атаковать в условиях 5 vs 4. Это не говоря уже о том, насколько сильно можно изменить исход боя, если вытянуть крюком какого-либо ключевого героя из команды противника. Однако это лишь одна сторона медали.

Все больше и больше людей, желающих снизить массу тела и скорректировать фигуру, отдают.

Защита

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

  Как убрать инверсию мыши в КС:ГО

Именно по этой причине крюк представляет собой универсальный и настолько важный скилл, а тренировка хука Пуджа – это главный элемент обучения игры за этого персонажа.

Тренировка Пуджа от Navi

тренировка хука пуджа

Команда Navi, которая является сегодня одной из наиболее успешных на территории СНГ и мира, выпустила собственную игру. Тренировка хука от «Нави» представляет собой флеш-игру с достаточно приятной графикой, в которой каждый игрок может самостоятельно потренироваться без каких-либо помощников. За счет того, что в игре представлен предельно простой и понятный сеттинг, обучаться таким образом могут даже те, кто лишь недавно познакомился с миром DOTA и начал обучаться игре за этого персонажа.

Тренировка хука Пуджа осуществляется по достаточно простой схеме – появляются мобы, которые являются несколько схожими по своему внешнему виду на самого героя и управляются исключительно искусственным интеллектом. Эти мобы передвигаются и периодически останавливаются, поэтому игрок может безо всякого труда потренироваться кидать хук в любых условиях.

Один из наиболее опасных ударов — сильный удар локтем. Он может успешно применяться как в.

Отдельное внимание следует уделить тому, что мобы передвигаются достаточно спонтанно и могут постоянно менять траектории, за счет чего у Pudge тренировка хука становится максимально приближенной к реалиям DOTA. Именно по этой причине можно с полной уверенностью сказать о том, что такая тренировка является действительно необходимой и на ее основе каждый игрок в DOTA может практически в совершенстве освоить игру за Пуджа, просто переложив наработанные навыки на отдельные ситуации в различных партиях.

Комбинации

pudge тренировка хука

Сразу видно, что разработкой занимались настоящие специалисты, которые знают особенности и тонкости игры за персонажа, так как в ней есть все, что только может понадобиться игроку для полноценного освоения особенностей игры за этого героя. Никаких лишних элементов, которые могли бы просто приукрасить геймплей, но при этом отвлекали бы игрока от непосредственного выполнения нужных действий, за что многим особенно нравится Пудж Хук тренировка. Игра представляет собой именно симулятор игры за Pudge и первоначально не является средством развлечения, хотя вполне может им стать для тех, кто любит играть в DOTA.

Особенно следует отметить тот факт, что для приближения к реалиям игры за Pudge разработчики также ввели возможность активации и других активных скиллов героя. Таким образом, можно включить ядовитый дым, действие которого в данном случае является лишь визуальным и предназначено именно для ощущения приблизительной реальности происходящего и оттачивания комбинаций, а после притягивания может включить ульт, который в преимущественном большинстве случаев и представляет собой логическое продолжение комбинации.

Система очков

тренировка хука от нави

Для того чтобы проверить, насколько тренировка хука является эффективной, присутствует система очков, которая позволяет пользователю максимально определить степень владения данным персонажем. Таким образом, очки зарабатываются в зависимости от того, насколько быстро герой хукает появляющихся мобов (реакция), насколько далеко находятся цели, которых он притягивает (расчет), а также использует ли он специальные комбинации (умение). Таким образом, по мнению разработчиков от Navi, идеальной комбинацией Пуджа является Hook+Root+Dismember.

Помимо всего прочего предоставляется также отдельный мод игры, который позволяет проверить умение хукать невидимок, что является особенно актуальным для страховки от ганга себя и своих союзников по лайну.

Таким образом, первоначально игрок обучается азам игры за Пуджа, а с течением времени постепенно осваивает все более и более сложные особенности игры за этого персонажа. Помимо всего прочего полученные умения помогут и при игре за других персонажей, таких как, например, Mirana.

Источник: autogear.ru

Чит Exero Hook (External) для CS:GO

Читы для CS:GO

Представляю беспалевный external легит чит для CS:GO под названием Exero Hook. Функционал полностью рабочий а самое главное — полезный, имеется скрытие от OBS, если Вы вдруг захотите играть с читом, стримить или записывать видео. При помощи чита Exero Hook.

Представляю беспалевный external легит чит для CS:GO под названием Exero Hook. Функционал полностью рабочий а самое главное — полезный, имеется скрытие от OBS, если Вы вдруг захотите играть с читом, стримить или записывать видео. При помощи чита Exero Hook КС ГО можете не боятся и записывать как играете и никто не поймет, что используете хак. Это самый лучший чит в 2022 году, поэтому рекомендую его использовать.

Инструкция по установке и запуску чита:

  • Скачать чит с procheats.net
  • Извлеките его из архива .rar
  • Запустите CS:GO
  • Запускаем лоадер (имеется в архиве)
  • Играем.

Пароль от архива: 123321

Источник: insed.ru

Рейтинг
( Пока оценок нет )
Загрузка ...