D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Всем привет! В качестве активного отдыха я предпочитаю изучение новых направлений которые можно монетизировать! Я уже длительное время изучаю геймхак и предлагаю вам погрузиться в этот удивительный мир.
Можно здесь заработать или нет - у меня уже давно нет сомнений в этом вопросе.
Посмотрите сколько копий своего бота Glider продал Michael Donnelly.
И это только в Китае, где читеров отправляют на долгий срок в тюрьму! А что в остальном мире? Огромный спрос! Особенно на игры с анти-читами - это настоящая золотая жила!
Но к сожалению, разработка читов это далеко не легкий процесс, требующий компетенций в различных областях, начиная от навыков низкоуровневого программирования - заканчивая продвинутыми навыками реверс-инжиниринга. Но те кто смогут осилить этот путь получают доступ к огромному рынку который контролирует небольшая группа настоящих энтузиастов.
Что же такое геймхак?
Создание годмода, флайхака, редактирование сохранений, просмотр сквозь стены - все это геймхак.
Так как я пришел в геймхак из скама - у меня не было никакого релевантного опыта в этом деле.
На этом этапе многие сталкиваются с трудностями, а как же подступиться к той самой игре?
Поэтому мы разберем все с самых азов, начиная от нулей и единиц, заканчивая разбором полноценной игры.
И уже сегодня попробуем на практике поколупать настоящую игру!
А по мере нашего цикла статей (если он вам понравится) затронем более интересные и продвинутые техники.
А может быть кто-то нам поможет пореверсить и анти-читы!
Приступим!
Самый основной навык в геймхаке - умение редактировать память. Все что вы хотите - годмод, подкрутить бабки, телепорт - все это можно сделать с помощью редактирования памяти. Но если вы хотите создать что-то более комплексное, например, аимбот или воллхак, нам потребуется редактировать машинный код на самом низком уровне, здесь нам нужно хотя бы базовое понимание ассемблера, чтобы записывать / редактировать конструкции.
Для понимания приведу пример:
Например, у вас есть 100 HP в игре.
Вы можете создать программу, которая будет бесконечно часто перезаписывать значение HP на максимальное.
Все что требуется это найти где это значение находится в памяти и записывать туда "100" с некоторым KD в миллисекундах. Но это может очень сильно: а) нагружать систему, т. к. происходит непрерывная запись, огромное количество итераций б) подвести вас, когда вам в моменте нанесут больший урон чем значение HP.
Редактирование инструкций позволит нам изменить же самому логику нанесения урона, т. е. фактически мы можем переписать определенный игровой модуль и заменить его своим, с той логикой что нужна нам!
Если условно у вас была конструкция:
При нанесении урона персонажем с уровнем Damage "X" персонажу "B"
отнять у персонажа "B" - "X" HP
То вы можете заменить "отнять" на "прибавить". Таким образом вам не потребуется постоянно записывать что-то в память, нагружать систему, достаточно единожды изменить логику!
Помимо редактирования памяти и машинных кодов есть техника редактирования шестнадцатеричного представления на самом диске, это используют для редактирования сохранений, но мы рассмотрим это в контексте для понимания, чтобы перейти к редактированию пакетов, где редактируются не локальные файлы, а все то чем обменивается клиент с сервером. И несмотря на различные server-side проверки, почти всегда находятся лазейки, которые можно использовать.
Теперь у вас есть примерное понимание того, что же представляет из себя геймхак и возможно мы развеяли чуточку магии в этом вопросе. И самый венец - это автоматизация, он же боттинг, когда наш софт сам играет в игру без нашего участия. Эта область включает в себя как правило совокупность всех предыдущих.
Michael Donnelly продал 100 тысяч копий своего бота за 45$, а это на минуточку 4.500.000$ :smile10:
Скорее всего прямо сейчас для вас загадка, если вы как и я пришли из НЕ технической области, что же там твориться в памяти? Но как и инженеры, химики, врачи не часто говорят об атомах, а об отдельных частях, веществах, органах - мы также перейдем на ступень несколько выше чем нули и единицы, но и к ней мы вернемся.
Первый пункт (управление аппаратным обеспечением) мы затрагивать особо не будем, так как он не затрагивает нас напрямую. Хотя в последнее время Hardware-hacking набирает обороты.
А вот второй пункт нам интересен в большей степени. Когда вы запускаете .EXE файл (например, вашу игру) операционная система понимает согласно формату (.EXE) как работать с данным файлом, помещает его с вашего hard-drive (жесткого диска) т. е. холодной памяти в "горячую", то бишь RAM (оперативная память). Если описать очень вкратце, другие детали нам пока не нужны.
Поэтому когда мы ломаем игру мы ломаем ее НЕ на диске, мы ломаем ее в оперативной памяти, RAM.
Это главное отличие между крякингом и геймхаком, в том что в 1 случае редактируют копию на диске, у нас же копия в памяти.
Т. е. выполняем все "на лету" прямо во время работы.
Один из основных инструментов которым мы будем работать - Cheat Engine.
Загрузить можно с оф. сайта: https://www.cheatengine.org/
Не забудьте снять галочки чтобы не установить спонсорский софт, т.к. CE распространяется условно-бесплатно.
Как же работает Cheat Engine?
Так как операционная система имеет управление над теми процессами что работают в системе, мы будем эксплуатировать это и абузить ее чтобы она помогала нам делать внутри игр то, что нам нужно.
Чтобы перезаписать условное значение HP, нам нужно обратиться к ОС и попросить ее найти нужный процесс, нужную область памяти и записать необходимое значение в переменную. Все это можно делать с помощь API.
Чтобы записать что-то в оперативную память мы используем функцию WriteProcessMemory
По этом принципу и работает Cheat Engine.
Но как нам найти ту область, ту переменную, куда мы должны записать значение?
На помощь нам приходит Memory Scanning, т.е. сканирование памяти.
Мы можем найти что угодно, начиная от HP заканчивая XYZ (оси X, Y, Z) координатами местоположения игрока в игровом пространстве.
Но чтобы отредактировать что-то, нам нужно понимать в каком виде эти данные находятся в памяти и затем записать их в нужном формате.
Если вы сделаете дамп оперативной памяти (выгрузите содержимое) например в текстовом формате вы увидите примерно следующее:
Просто океан из нулей и единиц. Да, компьютер в самом элементарном представлении работает с двоичными данными (двоичный код). Где самая минимальная единица измерения это БИТ, который может принимать два значения: 0/1
Но инструменты могут упростить нам работу и работать мы будем уже с БАЙТАМИ, т. е. группой битов (8 бит).
согласитесь, выглядит уже куда приятнее и вроде бы более структурированно, но все равно не понятно где же наше значение HP в памяти?
Представим что наше значение HP = 100
Так как же нам его раскопать?
Значение 100 в нашем представлении это ДЕСЯТИЧНАЯ система, т.е. DECIMAL.
Память - ДВОИЧНАЯ, т.е. BINARY.
Используем научный метод. Нам нужно конвертировать наше значение 100 из десятичной в двоичную.
Как вы можете заметить, что в десятичной что в двоичной системе каждый столбец числа = разряд, который несет какое-то значение.
В десятичной это 1/10/100/1000/и т.д.
В двоичной это 0/2/4/8/16/32/64/128/и т.д. то есть степень двойки.
Теперь мы знаем что 01100100 соответствует нашему значение HP = 100.
Но если мы попытаемся просканировать нашу память, он найдет нам сотни и тысячи таких значений! А как же тогда нам найти именно HP?
Да, в системе множество переменных могут в данный момент иметь значение 100, да и не только в системе, но и в самой игре.
Для нахождения мы делаем следующие этапы:
1. Сканируем память, то есть на простом языке делаем ОТПЕЧАТОК памяти, копию листа бумаги, как угодно для вашего понимания.
2. Меняем значение HP в игре (например, специально провоцируем, получаем урон)
3. Наше значение HP поменялось, например, с 100 до 55.
4. Сканируем память снова, т.е. делаем еще одну копию
5. Наш инструмент накладывает две одинаковые страницы друг на друга и ищет все переменные которые изначально были равны "100" и затем ищет на второй странице те из них, что были поменяны на "55"
6. Продолжаем процесс с 2 шага по 5 до тех пор пока не придем к 1 единственному и верному значению.
Если очень сильно упростить, то процесс поиска в памяти выглядит именно так.
Здесь нам нужно понять важный момент:
Дело в том что 1 байт может нести в себе только 8 бит, а значит (если вы посчитаете) - он может нести только сумму из 8 разрядов
(128 + 64 + 32 + 16 + 8 + 4 + 2 = 255) [11111111]
Со значением HP понятно, оно чаще всего не превышает в играх 100. Но что если превышает? Или например мы ищем показатель золота или что-то другое что может превысить 255?
В таком случае мы работаем сразу с группой байт, состоящей из двух байт, четырех или восьми.
Например вот такая прекрасная иллюстрация:
Т.е. чем больше бит/байт - тем больше мы можем вместить число.
Поэтому когда мы ищем что-то, мы должны использовать научный метод и точно задавать параметры искомых значений, предполагая, какие пределы и диапазоны мог задать разработчик, как разработчик хранит переменную?
Например, если игра написана на C++, в каком формате и какой тип данных использовал разработчик чтобы сохранить HP? А что если это координаты? Может быть float (с типами данных познакомимся позже)? Тут к нам на помощь и приходит понимание языка на котором написана игра и дальнейшее построение нашей теории по поиску нужного значения.
К примеру, мы нашли, нужную ячейку. Перезапустили игру. А где найти ее теперь?
Все дело в том, что ячейка будет на том же самом месте.
Но наша игра не обязательно будет загружаться в тот же самый участок памяти.
Представим что мы нашли участок памяти, в который наша игра была загружена?
Назовем его N.
Таким образом мы можем найти смещение (оффсет, offset) относительно этого участка N.
Например:
Чтобы вы лучше поняли давайте разберем какой-нибудь пример вместе!
Возьмем простую игру которую вы сможете быстро Скачать
Можно здесь заработать или нет - у меня уже давно нет сомнений в этом вопросе.
Посмотрите сколько копий своего бота Glider продал Michael Donnelly.
Интерес к подобному ПО огромен — та же Tencent в сентябре прошлого года оценивала китайский сегмент данного черного рынка в $293 млн.
Нажмите, чтобы раскрыть...
И это только в Китае, где читеров отправляют на долгий срок в тюрьму! А что в остальном мире? Огромный спрос! Особенно на игры с анти-читами - это настоящая золотая жила!
Но к сожалению, разработка читов это далеко не легкий процесс, требующий компетенций в различных областях, начиная от навыков низкоуровневого программирования - заканчивая продвинутыми навыками реверс-инжиниринга. Но те кто смогут осилить этот путь получают доступ к огромному рынку который контролирует небольшая группа настоящих энтузиастов.
Что же такое геймхак?
Создание годмода, флайхака, редактирование сохранений, просмотр сквозь стены - все это геймхак.
Так как я пришел в геймхак из скама - у меня не было никакого релевантного опыта в этом деле.
На этом этапе многие сталкиваются с трудностями, а как же подступиться к той самой игре?
Поэтому мы разберем все с самых азов, начиная от нулей и единиц, заканчивая разбором полноценной игры.
И уже сегодня попробуем на практике поколупать настоящую игру!
А по мере нашего цикла статей (если он вам понравится) затронем более интересные и продвинутые техники.
А может быть кто-то нам поможет пореверсить и анти-читы!
Приступим!
Самый основной навык в геймхаке - умение редактировать память. Все что вы хотите - годмод, подкрутить бабки, телепорт - все это можно сделать с помощью редактирования памяти. Но если вы хотите создать что-то более комплексное, например, аимбот или воллхак, нам потребуется редактировать машинный код на самом низком уровне, здесь нам нужно хотя бы базовое понимание ассемблера, чтобы записывать / редактировать конструкции.
Для понимания приведу пример:
Например, у вас есть 100 HP в игре.
Вы можете создать программу, которая будет бесконечно часто перезаписывать значение HP на максимальное.
Все что требуется это найти где это значение находится в памяти и записывать туда "100" с некоторым KD в миллисекундах. Но это может очень сильно: а) нагружать систему, т. к. происходит непрерывная запись, огромное количество итераций б) подвести вас, когда вам в моменте нанесут больший урон чем значение HP.
Редактирование инструкций позволит нам изменить же самому логику нанесения урона, т. е. фактически мы можем переписать определенный игровой модуль и заменить его своим, с той логикой что нужна нам!
Если условно у вас была конструкция:
При нанесении урона персонажем с уровнем Damage "X" персонажу "B"
отнять у персонажа "B" - "X" HP
То вы можете заменить "отнять" на "прибавить". Таким образом вам не потребуется постоянно записывать что-то в память, нагружать систему, достаточно единожды изменить логику!
Помимо редактирования памяти и машинных кодов есть техника редактирования шестнадцатеричного представления на самом диске, это используют для редактирования сохранений, но мы рассмотрим это в контексте для понимания, чтобы перейти к редактированию пакетов, где редактируются не локальные файлы, а все то чем обменивается клиент с сервером. И несмотря на различные server-side проверки, почти всегда находятся лазейки, которые можно использовать.
Теперь у вас есть примерное понимание того, что же представляет из себя геймхак и возможно мы развеяли чуточку магии в этом вопросе. И самый венец - это автоматизация, он же боттинг, когда наш софт сам играет в игру без нашего участия. Эта область включает в себя как правило совокупность всех предыдущих.
Michael Donnelly продал 100 тысяч копий своего бота за 45$, а это на минуточку 4.500.000$ :smile10:
Скорее всего прямо сейчас для вас загадка, если вы как и я пришли из НЕ технической области, что же там твориться в памяти? Но как и инженеры, химики, врачи не часто говорят об атомах, а об отдельных частях, веществах, органах - мы также перейдем на ступень несколько выше чем нули и единицы, но и к ней мы вернемся.
Первый пункт (управление аппаратным обеспечением) мы затрагивать особо не будем, так как он не затрагивает нас напрямую. Хотя в последнее время Hardware-hacking набирает обороты.
А вот второй пункт нам интересен в большей степени. Когда вы запускаете .EXE файл (например, вашу игру) операционная система понимает согласно формату (.EXE) как работать с данным файлом, помещает его с вашего hard-drive (жесткого диска) т. е. холодной памяти в "горячую", то бишь RAM (оперативная память). Если описать очень вкратце, другие детали нам пока не нужны.
Поэтому когда мы ломаем игру мы ломаем ее НЕ на диске, мы ломаем ее в оперативной памяти, RAM.
Это главное отличие между крякингом и геймхаком, в том что в 1 случае редактируют копию на диске, у нас же копия в памяти.
Т. е. выполняем все "на лету" прямо во время работы.
Один из основных инструментов которым мы будем работать - Cheat Engine.
Загрузить можно с оф. сайта: https://www.cheatengine.org/
Не забудьте снять галочки чтобы не установить спонсорский софт, т.к. CE распространяется условно-бесплатно.
Как же работает Cheat Engine?
Так как операционная система имеет управление над теми процессами что работают в системе, мы будем эксплуатировать это и абузить ее чтобы она помогала нам делать внутри игр то, что нам нужно.
Чтобы перезаписать условное значение HP, нам нужно обратиться к ОС и попросить ее найти нужный процесс, нужную область памяти и записать необходимое значение в переменную. Все это можно делать с помощь API.
Windows API (англ. application programming interfaces) — общее наименование набора базовых функций интерфейсов программирования приложений. Работа через Windows API — это наиболее близкий к операционной системе способ взаимодействия с ней из прикладных программ.
Нажмите, чтобы раскрыть...
Чтобы записать что-то в оперативную память мы используем функцию WriteProcessMemory
По этом принципу и работает Cheat Engine.
Но как нам найти ту область, ту переменную, куда мы должны записать значение?
На помощь нам приходит Memory Scanning, т.е. сканирование памяти.
Мы можем найти что угодно, начиная от HP заканчивая XYZ (оси X, Y, Z) координатами местоположения игрока в игровом пространстве.
Но чтобы отредактировать что-то, нам нужно понимать в каком виде эти данные находятся в памяти и затем записать их в нужном формате.
Если вы сделаете дамп оперативной памяти (выгрузите содержимое) например в текстовом формате вы увидите примерно следующее:
Просто океан из нулей и единиц. Да, компьютер в самом элементарном представлении работает с двоичными данными (двоичный код). Где самая минимальная единица измерения это БИТ, который может принимать два значения: 0/1
Но инструменты могут упростить нам работу и работать мы будем уже с БАЙТАМИ, т. е. группой битов (8 бит).
согласитесь, выглядит уже куда приятнее и вроде бы более структурированно, но все равно не понятно где же наше значение HP в памяти?
Представим что наше значение HP = 100
Так как же нам его раскопать?
Значение 100 в нашем представлении это ДЕСЯТИЧНАЯ система, т.е. DECIMAL.
Память - ДВОИЧНАЯ, т.е. BINARY.
Используем научный метод. Нам нужно конвертировать наше значение 100 из десятичной в двоичную.
Как вы можете заметить, что в десятичной что в двоичной системе каждый столбец числа = разряд, который несет какое-то значение.
В десятичной это 1/10/100/1000/и т.д.
В двоичной это 0/2/4/8/16/32/64/128/и т.д. то есть степень двойки.
Теперь мы знаем что 01100100 соответствует нашему значение HP = 100.
Но если мы попытаемся просканировать нашу память, он найдет нам сотни и тысячи таких значений! А как же тогда нам найти именно HP?
Да, в системе множество переменных могут в данный момент иметь значение 100, да и не только в системе, но и в самой игре.
Для нахождения мы делаем следующие этапы:
1. Сканируем память, то есть на простом языке делаем ОТПЕЧАТОК памяти, копию листа бумаги, как угодно для вашего понимания.
2. Меняем значение HP в игре (например, специально провоцируем, получаем урон)
3. Наше значение HP поменялось, например, с 100 до 55.
4. Сканируем память снова, т.е. делаем еще одну копию
5. Наш инструмент накладывает две одинаковые страницы друг на друга и ищет все переменные которые изначально были равны "100" и затем ищет на второй странице те из них, что были поменяны на "55"
6. Продолжаем процесс с 2 шага по 5 до тех пор пока не придем к 1 единственному и верному значению.
Если очень сильно упростить, то процесс поиска в памяти выглядит именно так.
Здесь нам нужно понять важный момент:
Дело в том что 1 байт может нести в себе только 8 бит, а значит (если вы посчитаете) - он может нести только сумму из 8 разрядов
(128 + 64 + 32 + 16 + 8 + 4 + 2 = 255) [11111111]
Со значением HP понятно, оно чаще всего не превышает в играх 100. Но что если превышает? Или например мы ищем показатель золота или что-то другое что может превысить 255?
В таком случае мы работаем сразу с группой байт, состоящей из двух байт, четырех или восьми.
Например вот такая прекрасная иллюстрация:
Т.е. чем больше бит/байт - тем больше мы можем вместить число.
Поэтому когда мы ищем что-то, мы должны использовать научный метод и точно задавать параметры искомых значений, предполагая, какие пределы и диапазоны мог задать разработчик, как разработчик хранит переменную?
Например, если игра написана на C++, в каком формате и какой тип данных использовал разработчик чтобы сохранить HP? А что если это координаты? Может быть float (с типами данных познакомимся позже)? Тут к нам на помощь и приходит понимание языка на котором написана игра и дальнейшее построение нашей теории по поиску нужного значения.
К примеру, мы нашли, нужную ячейку. Перезапустили игру. А где найти ее теперь?
Все дело в том, что ячейка будет на том же самом месте.
Но наша игра не обязательно будет загружаться в тот же самый участок памяти.
Представим что мы нашли участок памяти, в который наша игра была загружена?
Назовем его N.
Таким образом мы можем найти смещение (оффсет, offset) относительно этого участка N.
Например:
Чтобы вы лучше поняли давайте разберем какой-нибудь пример вместе!
Возьмем простую игру которую вы сможете быстро Скачать
View hidden content is available for registered users!