[0x4]Легкий Геймхакинг: Шаг за шагом.

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Author: Unseen
Source: XSS.IS


Предыдущая часть
: https://xss.is/threads/104820

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

Предыстория…
На прошлых частях мы научились находить смещения(оффсеты) и указатели, при помощи которых мы вычисляли адреса(здоровья, патронов и т.д.) в памяти, выделяемые динамично в игре и ее модулях. Но мы делали это при помощи сканера Cheat Engine в автоматическом режиме. То есть сканер сам вычислял оффсеты от модуля игры до нужной структуры или адресов переменных. Переписали наш софт под наши новые потребности, а именно находить процесс игры из снимка запущенных процессов в системе. Разработали функцию, которая принимала список(массив) оффсетов полученных от сканера и в результате она вычисляла конечный искомый динамический адрес(Пример: адрес здоровья).

В этой части…
До этого мы разбирались с базовыми моментами и не так часто приходилось работать на уровне байт кода. С данный части мы уже начнем углубляться в мир ассемблера, машинных команд и реверс-инжиниринга. Ведь без этих навыков нам будет трудно что либо реализовать да и понимать логику игры, выявлять уязвимые места в играх для дальнейшей эксплуатации их в нашем продукте. Эта информация будет полезно абсолютно многим разработчикам. Не зависимо от того, что являетесь ли вы крекером, разработчиком читов, игр, новичком в программировании или начинающим экспертом в кибербезопасности и т.д. Думаю стоит начать нашу статью с программных обеспечений, которые очень упрощают жизнь реверс-инженера. Реверс-инжиниринг это процесс анализа машинного кода программы, который ставит своей целью понять принцип работы, восстановить алгоритм, обнаружить недокументированные возможности программы и многие другие моменты.

Подробнее можно прочитать об Реверс-Инжиниринг на Wiki Здесь.
Что это?...
В рамках данного текста мы рассмотрим список некоторых программ, используемых для реверс-инжиниринга, охватим разнообразные области их применения, и рассмотрим типы и функциональные аспекты, которые они предоставляют. Обсудим их значение в этой области, обсудим направления для которых они применяются, их типы и функции которые они предоставляют. Эти программы находят свое применение в различных областях, начиная от разработки программного обеспечения и заканчивая обеспечением кибербезопасности. Их способность анализа исполняемого кода и восстановления исходного кода открывает широкие перспективы для разработчиков читов и исследователей в области информационной безопасности.

Значение программ для реверс-инжиниринга…
Сейчас сложно найти область деятельности человека в которой не использовались бы программы тем или иным образом, как и в нашем случае - как можно обойтись без программ в работе с программами. Они стали непременным инструментом, независимо от того, занимаетесь ли вы анализом безопасности программного обеспечения, разработкой новых приложений или обеспечением целостности и защиты данных.

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

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

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

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

Ну а со вторым всё понятно - кто-то же должен бороться на стороне добра со взломами и уязвимостями которые приносят убытки компаниям и обычным пользователям в случае вирусов, а также негативные эмоции игрокам онлайн игр в случае читов.

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

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

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

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

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

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

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

Также существует огромное множество инструментов для еще более узких направлений по типу дамперов структур для игровых движков (https://github.com/Spuckwaffel/UEDumper) или же, например, Il2CppDumper - предназначенный для анализа и извлечения данных из приложений, скомпилированных с использованием Unity и IL2CPP. Перед тем как вы собираетесь приступать к работе с приложением лучшим решением будет поиск информации в интернете, потому что вы можете найти кучу полезной информации и избежать изобретения велосипеда.

Список программ для реверс-инжиниринга…
Поскольку нашей задачей является получение преимущества в игре нам необходимо понимать логику работы самой игры чтобы вносить в нее свои коррективы. Чтобы делать это максимально эффективно и правильно - нужно понимать логику работы и структуры данных к которым эта логика применяется. Ключевые функции, к которым мы будем обращаться будут позволять нам делать это. Думаю будет правильным привести список программ разделяя их по категориям и сравнивая их между собой попутно описывая их функционал и чем они будут нам полезны. Начнём с тех, которые позволяют максимально выполнить функцию декомпиляции - преобразования в высокоуровневый код. Такое возможно в случае использования движка Unity и языка программирования C#, особенно в случае использования Mono реализации платформы .NET.

Для этих целей могу выделить три софта, каждый из которых является бесплатным:

ILSpy - это инструмент для декомпиляции .NET-приложений. В основном, он позволяет анализировать исходный код, который был скомпилирован в байт-код, использующийся на платформе .NET. Это позволяет разработчикам исследовать внутреннюю структуру .NET-сборок, просматривать и редактировать исходный код, а также изучать работу приложений. Сама Visual Studio использует его для генерации исходного кода из сборок .NET во время отладки. Несколько его отличительных функций: Декомпиляция всей сборки, декомпиляция двух версий сборки и сравнение результатов, создание графика зависимостей. Этот проект имеет открытый исходный код и расположен на github
dotPeek
- это ещё один инструмент для декомпиляции .NET. Этот софт разработан компанией JetBrains и так же предоставляет возможности анализа исходного кода. Его особенностью является то, что он интегрируется с Resharper (Расширение для улучшения процесса разработки в VS и Rider). Он повторяет функции ILSpy, перечисленные выше, а также усовершенствованные функции поиска и навигации Resharper или Rider в декомпилированном коде. Из его минусов можно сказать, что это гораздо более тяжеловесная программа по сравнению с ILSpy, а так же закрытый исходный код.

dnSpy - это отладчик и редактор .NET-приложений. Считается, что это стандарт в области реверс-инжиниринга .NET. Вы его можете увидеть гораздо чаще, по сравнению с предыдущими инструментами, по причине того, что вы имеете полный контроль над сборкой .NET. Этот софт позволяет запускать и отлаживать скомпилированную сборку. Нужно отметить, что dnSpy также может подключаться к работающему процессу и отлаживать декомпилированный код его сборок, а также вносить изменения в сами сборки. Создателем dnSpy является человек под псевдонимом wtfsck, также известный как 0xd4d, который создал de4net .NET Deobfuscator (софт который прилагает все усилия, чтобы восстановить упакованную и запутанную сборку почти до исходной). В данный момент исходный репозиторий этой утилиты архивирован (https://github.com/dnSpy/dnSpy), но есть активно развивающийся форк - https://github.com/dnSpyEx/dnSpy.

Основные функции, которые нас интересуют это собственно сама декомпиляция, отладка и в некоторых случаях экспорт в проект (больше для десктопных приложений). Всем этим критериям удовлетворяет dnSpy, по этому он и является более используемым инструментом. На форуме были хорошие статьи от EXE по реверсу программ на .NET при помощи dnSpy. https://xss.is/threads/78823 Но что-то данный персонаж перестал выходить на связь...

С категорией декомпиляторов можно закончить, поскольку полная декомпиляция на данный момент возможна только для игр Unity (и то не во всех случаях), поскольку других популярных движков использующих C# нет, ну а преобразование инструкций в псевдокод нельзя назвать полноценной декомпиляцией.

Из дизассемблеров могу выделить два софта IDA и Ghidra.

IDA - это мощный инструмент для реверс-инжиниринга и дизассемблирования бинарных файлов, предоставляющий возможности для изучения и анализа исполняемого кода. Разработанный компанией Hex-Rays, IDA Pro предлагает поддержку широкого спектра архитектур процессоров и форматов файлов, включая экзотические и редко используемые, что нас не очень интересует, поскольку в основном мы будем работать на одной и той же архитектуре всего несколькими типами файлов. С его помощью можно проводить анализ исходного кода, строить графы управления потоком, находить структуры данных и обнаруживать потенциальные уязвимости для разработки нестандартных функций в читах. Есть минусы - IDA Pro является коммерческим продуктом и имеет закрытый исходный код, его полнофункциональная версия является платной, но есть бесплатная версия, в которой тоже много чего доступно. Считается, что IDA быстрее работает с большими проектами, по сравнению с аналогами. Присутствует возможность написания собственных плагинов и скриптов на языке IDC (IDA C). Это C-подобный язык используемый в этой среде для написания сценариев, макросов и плагинов, который предоставляет мощный и гибкий способ автоматизировать процессы анализа кода.

Ghidra - это тоже инструмент для реверс-инжиниринга и дизассемблирования, разработанный Агентством национальной безопасности США и выложенный в открытый доступ вместе с открытым исходным кодом (https://github.com/NationalSecurityAgency/ghidra). Этот софт написан на Java, требует дополнительной установки JDK, также поддерживает множество архитектур, включая нужные нам x86 и x86-64, есть возможность визуализации структур данных, а также он обладает хорошей расширяемостью за счёт открытого исходного кода и поддержки скриптов на языке Java, имеет много плагинов работающих "из коробки".

Далее хочу обратить ваше внимание на категорию отладчиков. Понятие отладчика мы уже касались, упоминая его в контексте dnSpy, а также обращая внимание на его присутствие в IDA и Ghidra. Однако, если вам необходим функционал, специально нацеленный на задачи отладки, то разумным выбором станет обращение к таким программам, как OllyDbg и x64dbg (https://github.com/x64dbg/x64dbg).

Не смотря на то, что оба эти отладчика бесплатны, стоит отметить, что OllyDbg применяется не так часто, особенно по сравнению с x64dbg. Это объясняется, в частности, активностью сообщества разработчиков, поддерживающих x64dbg. На гитхабе они постоянно обновляют и дополняют исходный код. Важным фактором является также наличие обширного сообщества, создающего и поддерживающего множество актуальных плагинов для x64dbg. Поскольку некоторые игры и античиты борются с использованием подобного программного обеспечения, доступ к исходному коду и возможность самостоятельной сборки в этом случае это ещё один жирный плюс. Это делает последний инструмент еще более привлекательным для использования.

Перейдем к еще одному важному аспекту - снифферам и прокси-серверам. В контексте анализа сетевой активности невозможно обойти стороной инструменты, такие как Wireshark и HTTPAnalyzer.

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

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

Упоминание об этих инструментах необходимо, так как они играют ключевую роль в понимании сетевого реверс-инжиниринга.

Перед тем как я перейду к уже более вспомогательным программам нужно рассказать про ReClass и Cheat Engine. Начнём с более простого - ReClass.

ReClass.NET представляет собой мощный инструмент, разработанный для статического анализа и обратной разработки программного обеспечения. Этот инструмент обеспечивает возможность анализа структур данных в памяти процессов. В его основе лежит концепция реверс-инжиниринга, позволяющая пользователям изучать и понимать внутреннее устройство программ, идентифицировать структуры данных, классы и их взаимосвязи. ReClass.NET обладает рядом ключевых функциональных возможностей, которые делают его востребованным инструментом в сфере статического анализа и реверс-инжиниринга, а именно: Анализ структур данных, просмотр и извлечение данных из памяти, редактирование этих данных и одно из самых важных - экспорт размеченных структур в C#/C++ код с сохранением оффсетов для дальнейшего взаимодействия с ними из чита.

Не очень лестно будет упоминать программу, о которой дальше пойдет речь, в последнюю очередь. Но это обусловлено тем, что она является стандартом в области разработки читов и включает в себя очень большую часть функционала программ описанных выше. Речь от Cheat Engine. Мы с ним уже работали и разбирали его базовый функционал. Будучи мощным и многогранным инструментом, он предоставляет пользователю широкий спектр функций, сфокусированных на исследовании и манипуляции памятью процессов. Одной из его ключевых возможностей является сканирование памяти, что позволяет пользователям находить конкретные значения и адреса в памяти, такие как игровые баллы, здоровье персонажа или другие переменные, подлежащие изменению или модификации. С использованием многоуровневых фильтров и поисковых опций, Cheat Engine предоставляет возможность нахождения нужных значений. Одним из выдающихся элементов функционала является возможность внесения изменений в обнаруженные значения, что позволяет пользователям манипулировать параметрами игрового процесса. Благодаря встроенному дизассемблеру, Cheat Engine дает пользователям возможность писать собственные скрипты для автоматизации изменений в процессе выполнения программы на языке LUA. Основываясь на концепции трейнеров, Cheat Engine также предоставляет функционал создания собственных трейнеров для игр, что позволяет пользователям создавать персонализированные сценарии и управлять различными параметрами в играх. Дополнительно, он обеспечивает инструменты для обхода анти-чит систем, таких как VAC. Это осуществляется за счет взаимодействия CE с процессом игры через драйвер. Помимо поиска, редактирования значений в памяти эта программа позволяет просматривать области памяти в различных представлениях, дизассемблировать участки в этой памяти, есть встроенный обзорщик структур с авто-определением типов и подтягиванием названий классов/структур используемых в коде через дополнительные плагины, поиск указателей и отладчик - это всё есть в CE, описать весь функционал этого софта в рамках одной статьи не представляется возможным. Проект имеет исходный код и расположен на GitHub это один из его больших плюсов, поскольку его также можно редактировать и компилировать под конкретные нужды.

Завершить данный материал предлагаю парой слов о вспомогательных, но не менее важных софтов.

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

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

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

Последними в списке будут программы по типу Process Explorer и Process Hacker, рассмотрим одну из них.

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

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

Это можно сказать джентельменский набор любого эксперта по реверсингу. Вам не обязательно сразу устанавливать все это на свою систему, на первое время хватит CheatEngine, IDA Pro, OllyDbg.По мере необходимости в статьях мы будем устанавливать и другие. Но прежде, чем приступать к реверс-инжинирингу игр, нам нужно ознакомиться, пусть даже на базовом уровне с языком ассемблера. Потому что мы будем часто взаимодействовать с дизассемблированным кодом при реверсе игр. Да-да это может для кого-то показаться сложным и не понятным, но я постараюсь максимально передать суть и идею. Вам в жизни не обязательно нужно писать на этом языке, достаточно базовых пониманий. Не обязательно становиться профессионалом в области язык ассемблера =)

Немного ассемблерного чая…
Мы знаем, что скомпилированная программа представляет собой набор инструкций, известных как машинный код в двоичном виде(0 и 1), понятный для процессора, но трудный для понимания обычному человеку.

Пример двоичного машинного кода:
Спойлер: Машинный код
4.png

Как видим здесь изображено 2 байта машинного кода, но что он делает? Для каждой последовательности бит машинного кода существует соответствие: двоичный машинный код -> текстовая запись. Соответственно, зная это можно перевести машинный код в читаемый вид для человека.

Читаемый вид машинного кода:
Спойлер: Читаемый код
5.png

Сделав читаемый вид, мы получаем язык ассемблера. То есть мы сделали дизассемблирование двоичного кода в понятый для человека вид. Уже выглядит получше. Но все же что это значит mov al, 1? Давайте рассмотрим эту строку по подробнее. MOV - это инструкция, текстовое указание процессору выполнить заданное простейшее действие. Инструкция это самое минимальное действие, которое может выполнить процессор. Следующая часть al, 1 это операнды(входные данные инструкции), операндом может выступать регистры, константы, адреса оперативной памяти. Мы рассмотрели текстовый вид инструкции и давайте еще раз посмотрим на ее двоичный вид:
Спойлер: Инструкция
6.png

Зеленым выделенный блок называется кодом инструкции, код инструкции(Opcode) – понятное процессору двоичное число, соответствующее инструкции с операндами, оно состоит из 1 и более байт. Чтобы избежать путаницы разберем отличие инструкции от кода инструкции.

Существует только одна инструкция MOV, но при этом у нее есть очень много кодов, например:
Спойлер: Коды инструкции MOV для 8бит регистров
7.png

То есть различные вариации инструкций машинного кода в зависимости от регистра к которому она применяется. Допустим для регистра CL, это будет 11010001.

Из-за того, что компилятор знает все соответствия машинных кодов и инструкций он умеет превращать ассемблерный код в машинный. А дизассемблеры делают это обычно наоборот и мы получаем код на языке ассемблера. Для иллюстрации давайте возьмем исходный код программы на языке Си, как он будет выглядеть после компиляции в машинный код и в дизассемблированном виде.
Сравнение исходных кодов:
Спойлер: Сравнение
8.png

Так, что теперь видим, у нас в первой колонке имеется код на языке Си

int a = 5. То есть создать переменную целого типа int и внести туда число 5. Во второй же колонке теперь наша запись имеет вид B8 05 00 00 00, почему же? А если заметили это машинный код в 16-ной системе(HEX) счисления, который мы разбирали на прошлых статьях. Его удобно представлять в таком виде, так как занимает мало места и читаемость получше. B8(HEX) или же 10111000(binary) это код инструкции(Opcode) mov eax, а 05 00 00 00 это наше число записанное в 4ячейки памяти(4 байта). Почему 4? Так же из прошлых статей знаем, что тип данных int имеет размер 4 байта. Получается команда MOV говорит процессору перенести или переслать какие то данные, в нашем случае код инструкции mov, а именно B8 говорит что нужно перенести число 5 в регистр EAX. Стой, стой! Что значит в регистр eax? Давайте поговорим про регистры памяти процессора.

Регистры и Архитектура Процессора...
Регистры
- это небольшие хранилища данных внутри процессора, что то наподобие оперативной памяти, но гораздо быстрой для доступа. Они используются для выполнения операций и хранения промежуточных результатов. Например, регистр EAX часто используется для общих вычислений. Архитектура процессора определяет структуру регистров, инструкции и основные принципы работы. Важно понимать, что язык ассемблера уникален для каждой архитектуры процессора. x86 и x86-64 - две распространенные архитектуры. Когда мы говорим об ассемблере, мы обычно имеем в виду ассемблер для конкретной архитектуры.

Использование языка ассемблера обеспечивает более непосредственный контроль над процессором, но он также более сложен для написания и понимания. В современном программировании ассемблер используется редко, но его понимание помогает лучше осознать, как работает низкоуровневое программирование.

Давайте посмотрим на таблицу регистров 64-битной архитектуры:
Спойлер: Таблица регистров 64бит
2.png

На этой таблице изображены регистры 8 / 16 / 32 / включительно 64 бит. Если посмотрите на колонку Lower 32 bits(32 битные) то как раз в ней находится регистр EAX, который мы рассматривали на примере и его размер равен 32 бит или же 4байта. Если бы нам нужно было сохранить большое число в регистр, то вероятно нам бы пришли на помощь 64-битные регистры, допустим RAX. Компиляторы обладают оптимизациями и стратегиями для эффективного использования регистров при генерации машинного кода.

Немного практики на ассемблере:

Создайте 32 битное приложение C/С++ в Visual Studio.
C++: Скопировать в буфер обмена
Код:
#include <iostream>

int main()
{
    int a = 10;
    int b = 2;
    int result = 0;
    __asm {

        mov eax, a
        mov ebx, b
        add eax, ebx
        mov result, eax
    }

    std::cout << "Result = " << result << std::endl;
 
    getchar();
}
Думаю всем понятно что значат int a,b и result. Как видно у нас появилась новая строчка __asm { //code }

При помощи оператора __asm мы делаем inline вставку ассемблерного кода в наш код на с++. На самом деле это очень круто, когда нужно сделать оптимизацию программы при помощи ассемблера. Пусть нашей задачей будет при помощи ассемблера посчитать сумму двух переменных а и b, значение записать в переменную result.

mov eax, a - говорит, что нужно перенести значение из переменной а в регистр eax. Команда mov пересылает данные между регистрами.

Add eax, ebx говорит, что нужно прибавить два операнда, в данном случае регистры eax и ebx. А значение суммы будет записано в первый операнд, то есть eax, для экономии памяти! Получается eax = eax + ebx.

Потом снова при помощи команды mov пересылаем данные из eax в result. И уже идет вывод значения на консоль.

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

Краткий перечень инструкций ассемблера можно прочитать Здесь. На самом деле, как говорил вначале, вам не нужно запоминать или учить их. Так как их очень много)) Конечно если вы не мазохист xD
В итоге любая скомпилированная программа преобразуется в двоичный код(бинарный), понятный центральному процессору. А двоичный код может быть представлен в виде байтов. То что мы видели при работе с Cheat Engine на прошлых статьях.

Давайте под конец еще немного разберем дизассемблированный команду из нашей игры AssaultCube. Запустите игру. Запустите CheatEngine и подключитесь к процессу игры. После найдите адрес патронов, точно так же как в прошлых частях(помоему 2 статья).

У меня получилось это:
Спойлер: Адрес
9.png

Теперь кликаем ПКМ на этот адрес или же выбрав этот адрес нажимаем F5.
Спойлер: Далее
10.png

То есть мы сейчас найдем инструкцию, которая обращается к этому адресу(В данном случае к адресу патронов). После откроется окошко, вернитесь в игру и сделайте выстрел и затем обратно вернитесь в это окошко.
Спойлер: Окошко
11.png

То что красным выделено пока нам не нужно. Затем выберите инструкцию, которая выделена зеленым и нажмите на “Show disassembler”.
Спойлер: Show disassembler
12.png

У нас откроется обозреватель памяти и тут видим саму инструкцию.
Спойлер: Инструкция в памяти
13.png

Инструкция cmp dword ptr [eax], 00 сравнивает значение, хранящееся по адресу, на который указывает регистр eax, с нулем. Давайте разберем, что происходит:

cmp - это инструкция сравнения.

dword ptr - указывает на то, что операнд (значение для сравнения) имеет размер 32 бита (4 байта).

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

00 - это значение, с которым сравнивается содержимое по адресу. В данном случае, сравнивается с нулем.
А машинный байт код этой инструкции будет 83 38 00.
Таким образом, инструкция cmp dword ptr [eax], 00 проверяет, равно ли значение, хранящееся по адресу, на который указывает eax, нулю. Результат сравнения влияет на установку флагов процессора, которые могут быть использованы для принятия решений в последующем исполнении кода, например, при использовании условных переходов. В нашем случае, проверка идет с 0 из-за количество патронов, то есть есть ли в наличии патроны, чтобы можно было сделать выстрел.

Таким образом, мы научимся читать исходный код игры в дизассемблированном виде и выяснять логику и много других технических моментов. Научимся обходить разные античит системы, анализировать траффик игры, и наконец уже начнем писать настоящий боевой😤 софт для популярных игр вроде CS2, CS:GO, Dota и т.д🥵. Это статья была как введение в реверс-инжиниринг и нам предстоит разобраться во многих моментах. Это уже думаю будем делать походу дела на лету. Думаю материал так лучше освоится.

Как всегда если что-то Вам не понятно или вы не уверены, то пожалуйста пишите в комментариях под этой статьей. Более опытных коллег попрошу исправить/дополнить меня в моментах, где мог допустить ошибку. На этом у меня все! До следующей части!

View hidden content is available for registered users!
 
Сверху Снизу