Категория > Новости > Чит своими руками. Смотрим сквозь стены и делаем автоприцеливание для 3D-шутера - «Новости»
Чит своими руками. Смотрим сквозь стены и делаем автоприцеливание для 3D-шутера - «Новости»1-04-2023, 13:09. Автор: Enderson |
Чит своими руками. Вскрываем компьютерную игру и пишем трейнер на C++» я заложил базу для будущих читов и объяснил основные понятия. Рекомендую ознакомиться с ней, чтобы лучше понимать, что мы будем сегодня делать.Выбор игрыМой выбор пал на AssaultCube — бесплатный многопользовательский шутер от первого лица, основанный на движке CUBE. Используется графическая библиотека OpenGL. warningИспользование читов нарушает пользовательское соглашение игры и может повлечь юридическое преследование. Мы обсуждаем здесь создание чита исключительно в целях обучения. Автор и редакция не несут ответственности за возможные последствия применения и распространения такого ПО. Читайте также - Безопасность - один из важных элементов любой системы управления. Наш скрипт имеет следующие параметры защиты, профессиональный, надежный, безопасный скрипт обменника электронных валют по доступным ценам. Поиск значенийДля начала запустим игру и в настройках выберем оконный режим, ведь нам нужно, чтобы на экране помещалось еще что‑то, кроме игры. ![]() Также создадим локальный сервер. Нужно будет настроить его, а именно задать время игры, чтобы таймер не торопил нас. Конфиг лежит по следующему пути: ![]() Поменяем время на максимальное — 100 минут. Новые настройки времени А после уже запускаем сам сервер. ![]() И подключаемся к нему. ![]() Запускаем Cheat Engine и подключаемся к процессу игры. ![]() Поиск показателя здоровьяДля тестирования нам понадобится второй игрок. Можешь подключиться со второго устройства или, как сделал я, из виртуальной машины. Для поиска показателя здоровья выставляем параметры сканирования в Cheat Engine и вторым игроком наносим урон первому. После этого ищем здоровье в Cheat Engine. ![]() Будем наносить урон до тех пор, пока не найдем адрес, по которому хранится показатель здоровья нашего игрока. ![]() На этом все знакомые по прошлой статье действия в Cheat Engine заканчиваются и начинаются новые. Наша цель — реализовать extrasensory perception и aimbot. Для этого нам нужно узнать класс игрока и его статический адрес. Чтобы найти класс, кликаем правой кнопкой мыши по нашему адресу и выбираем Find out what writes to this address (можно просто нажать F6). Поиск места, где идет запись по адресу Появится новое окно, где будут отображаться инструкции, которые производят запись по нашему адресу. Чтобы они появились, снова наносим урон вторым игроком первому. ![]() Показатель здоровья записывает всего одна инструкция, она расположена по смещению ![]() Поиск статического адреса объекта игрокаВ прошлый раз я использовал отладчик, чтобы наглядно показать, что собой представляет статический адрес. В этот раз для поиска статического адреса мы будем использовать Cheat Engine. Жмем на ранее добавленный адрес ![]() Как видишь, у нас есть множество параметров для поиска указателя, но нас интересует Max level. Это значение отвечает за то, сколько раз будет разыменован наш указатель (статический адрес). Оно‑то и поможет нам получить искомый адрес. ![]() Исполняемый файл игры занимает мало, и кода в нем тоже негусто. Это наводит на мысль, что классов и структур в игре не так много и не будет большого количества смещений. Поэтому глубину поиска мы установим равной единице. ![]() Мы видим следующий результат. Об адресах вида ![]() Добавим найденные пять адресов в список. ![]() И выставим для каждого адреса смещение до показателей здоровья. ![]() Далее перезапускаем игру, и Cheat Engine предложит сохранить наши адреса. Мы их сохраняем, чтобы загрузить при повторном подключении. ![]() После переподключения к игре в списке адресов Cheat Engine видим, что только два адреса указывают на показатель здоровья: ![]() Попробуем повторно получить урон и посмотреть, что будет с другими адресами. Как видим, еще в двух адресах появился наш показатель здоровья. Значит, в списке мы оставляем только два упомянутых ранее адреса. ![]() Добавим статический адрес ![]() Добавим статический адрес ![]() Класс игрокаПредположим, что статический адрес ![]() К счастью, у Cheat Engine есть инструмент, который позволяет нам лучше визуализировать структуры памяти, а не просматривать байты в дампе. Просто жми правой кнопкой мыши по выделенному байту и выбирай Open in dissect data/structure. ![]() Откроется новое окно с адресом выбранного байта. Нажми Structures, затем Define new structure (или Ctrl-N). ![]() Назовем структуру ![]() Поставив галочку Guess field type, мы попросили Cheat Engine угадать тип поля. И он неплохо с этим справился. Полученная структура Перейдем по смещению Проверка класса Также можно по смещению Имя игрока В дальнейшем нам нужен этот класс, но, к сожалению, Cheat Engine не позволяет экспортировать структуру, а делать это вручную — значит подвергать себя мучениям. Это не нужно, поскольку существует готовый инструмент — ReClass.NET. Он дает возможность напрямую выгрузить структуру в виде кода на C++. Скачиваем, устанавливаем и подключаемся к процессу игры. ![]() После присоединения к процессу создается класс по базовому адресу В данном контексте отображаемое количество байтов СE воспринимает как класс, который мы экспортируем. Если размер нашего класса больше, чем стандартное количество отображаемых байтов, нужно вручную увеличить размер. Настройка ReClass.NET Переходим к смещению Присвоение типа Поиск координатНачиная с этого места, мы будем искать значения, нужные непосредственно для реализации ESP и aimbot. Для ESP нам понадобятся координаты самого игрока и его головы в трехмерном пространстве. wwwТем, кто не знает или забыл, как работает трехмерная система координат в компьютерной графике, рекомендую статью «3D своими руками» на «Хабрахабре». Для реализации aimbot нам понадобятся значения тангажа (pitch), рысканья (yaw) и крена (roll). Не знаешь, что это? Давай покажу на примере игрового движка Godot. Координаты XYZ Запись координат может разниться в зависимости от движка. Часто различается направление осей и то, какая из них считается высотой. Вариации координат Для демонстрации возьмем с GitHub готового персонажа и посмотрим, как он будет двигаться, если менять координаты. Персонаж на нулевых координатах Тангаж — движение персонажа относительно оси X. Нижняя стрелка — фактическое движение персонажа в данный момент, верхняя — другой вариант движения. Pitch Рысканье — движение персонажа относительно оси Y. Yaw Крен — движение персонажа относительно оси Z. Roll Поиск координат игрока С новыми знаниями возвращаемся к игре и окну Cheat Engine. Начинаем перемещаться по карте и вертеть мышкой из стороны в сторону, а также вверх и вниз. В окне Cheat Engine можем видеть три последовательности из значений с плавающей запятой, которые менялись при наших действиях. Значит, это координаты игрока, координаты головы игрока и его поворот относительно осей. Можно заметить, что два набора из трех повторяются по X и Y, а вот координата Z у них разная. Отсюда мы можем сделать вывод, что один набор — это координаты игрока, а второй — головы. Так как в OpenGL в качестве высоты используется координата Z, мы попытаемся поменять высоту для каждого набора. Начнем с первого, но после попытки поменять значение c -0.5 на другое оно снова станет прежним. Значит, это координаты головы, второй набор — координаты игрока, а третий — движение относительно осей. Но мы в этом еще должны убедиться. Неправильный выбор числа Теперь давай попробуем сделать для второго набора то, что мы делали для первого. Правильный выбор Для наглядной демонстрации встанем на ящик, а в Cheat Engine будем смотреть на значение по смещению Становимся на высоту Попробуем изменить это значение и увидим, как наш персонаж провалился сквозь ящик. Изменение высоты игрока Это значит, что наши предположения верны. ![]() Вернемся в окно ReClass.NET и выберем типы для этих смещений. ![]() Поиск pitch, yaw, roll Сделаем такую же проверку. Веди мышью из стороны в сторону, а потом вверх и вниз. Попробуем поменять значения, и оказывается, что наши предположения были верны. ![]() Вернемся в окно ReClass.NET и выберем типы для этих смещений. ![]() Вот так теперь выглядит наш класс. Но что за ![]() Теперь экспортируем наш класс (нажми на него правой кнопкой мыши и выбери соответствующий пункт меню). Можешь видеть, что есть поля, которые мы с тобой не искали: ![]() Entity ListС нашим игроком мы разобрались, а как быть с другими игроками? Обычно где‑то есть огромный список всех игровых сущностей, в который входят и персонажи игроков. Можно предположить, что где‑то в коде должен существовать и цикл, который перебирает игроков, и дальше с их данными как‑то взаимодействует логика игры. Попробуем оттолкнуться от показателя здоровья и поискать, какие инструкции его запрашивают. ![]() С наскока ничего найти не удается, но наметанный глаз заметит, что доступ к показателям здоровья нашего игрока идет через какой‑то статический адрес. Оказывается, мы выбрали неправильный! Правильный адрес такой: ![]() Попробуем теперь поискать через имя игрока, которое находится по смещению Имя игрока И получим список инструкций, которые обращаются к имени. ![]() ![]() Перебираем варианты и находим такой, где доступ происходит в цикле. ![]() Те, кто знаком с ассемблером, понимают, что в регистре Таким образом, статический адрес списка сущностей будет таким: "ac_client.exe"+0018AC04 ![]() Убедиться в этом можно, проверив по смещению ![]() Также нам понадобится общее количество игроков. Полистав вывод дизассемблера, в конце цикла увидим проверку. В регистре ![]() Немного подебажив, замечаем, что выше цикла находится статический адрес количества игроков: ![]() Перезапустим и проверим, что адреса правильные. Поиск View MatrixПерейти обратно к новости |