GameHackLab[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти
    1. Главная
    2. Promising
    • Профиль
    • Подписки 0
    • Подписчики 2
    • Темы 20
    • Сообщения 21
    • Группы 1

    Promising

    @Promising

    35
    Репутация
    93
    Просмотры профиля
    21
    Сообщения
    2
    Подписчики
    0
    Подписки
    Регистрация
    Последнее посещение

    Promising Отписаться Подписаться
    Разработчик

    Лучшие сообщения Promising

    • О MMX и SSE - некоторые команды, регистры

      В этой теме показаны примеры использования регистров и команд:

      Список некоторых команд (не всех, их очень много):

      Регистры
      xmm0
      xmm1
      xmm...
      xmm15
      Выполняют те же функции что и обычные регистры, но могут хранить в разы больше. Могут быть приёмником и источником для команд MMX.
      
      Команды записи
      movd *,* - записывает 4 байта из переменной в приёмник.
      movq *,* - записывает 8 байт.
      movss *,* - записываем float (4 байта) из переменной в приёмник
      movsd *,* - записывает doble (8 байт) их переменной в приёмник
      Массивные
      movups *,* - записывает 4 элемента массива в том порядке в котором они идут в приёмник
      movaps *,* - записывает выравненные 4 элемента массива
      movhlps *,* - записываем 2 левых элемента из источника в 2 правых приёмника
      movlhps *,* - записываем 2 правых элемента из источника в 2 левых приёмника
      movhps *,* - записывает 2 левых элемента из источника в 2 левых приёмника.
      movlps *,* - то же что и выше но 2 правых элемента.
      
      Арифметические команды. Любые действия выполняются в следующем порядке - приёмник на источник, запись в приёмник. (приёмник это первая *, источник - вторая *)
      addsd *,* - сложение двух чисел с плавающей запятой, типа doble (8 байт).
      subsd *,* - то же что выше но вычитание.
      mulsd *,* - Умножение.
      divsd *,* - Деление.
      sqrtsd *,* - Корень из doble
      addss *,* - Сложение двух float (4 байта)
      subss *,* - Вычитание float
      mulss *,* - Умножение float
      divss *,* - Деление float
      sqrtss *,* - Корень из float
      Массивные
      addps *,* - складывает 2 массива
      subps *,* - вычитает массив из массива
      divps *,* - делит массив на массив.
      mulps *,* - умножает массив на массив.
      sqrtps *,* - корни из массива
      
      Команды сравнения
      comiss - сравнение двух float
      comisd - сравнение doble
      
      Команды преобразования
      cvtsi2ss - преобразовать целое в float
      cvtsi2sd - преобразовать целое в doble
      cvttss2si - преобразовать вещественное в целое с округлением. 
      

      Регистры в этих дополнениях сопроцессора очень похожи на основные, но в отличии от них могут содержать целых четыре элемента, и даже работать сразу со всеми четырьмя!

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

      Такая инструкция addss xmm0,[MyLabel] сработает:
      А такая addss [MyLabel],xmm0 - нет.

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

      movss xmm0,[MyLabel]  //Записываем в xmm0 число из label
      addss xmm0,[MyAddValue]  //Добавляем к нему другое
      movss [MyLabel],xmm0  //Записываем из xmm0 назад в label.
      

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

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

      MyList:
      dd (float)2
      dd (float)7
      dd (float)29324.126
      dd (float)8261.3
      

      Что бы записать этот список в xmm мы можем использовать инструкцию movups xmm0,[MyList].

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

      MyListMul:
      dd (float)1
      dd (float)2
      dd (float)0.5
      dd (float)2
      

      Умножение:

      movups xmm0,[MyList] //Загружаем умножаемый список
      movups xmm1,[MyListMul] //Загружаем умножающий список
      mulps xmm0,xmm1 //Умножаем
      movups [MyList],xmm0 //Возвращаем в умножаемый список.
      

      После выполнения этого кода, список примет такой вид:

      2
      14
      14662,063
      16522,6
      

      Так же можно вычитать, делить, находить корень, складывать, и многое другое.

      Не используйте movaps если не знаете выравнен ли адрес, проверить это можно разделив адрес на 16, он должен делиться без остатка. Используйте movups разница по скорости минимальная для простых одиночных операций.

      Imaginary

      написал в Взлом игр (начинающим)
      PromisingP
      Promising
    • Функции

      В этой статье описано что такое функции


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

      Для перемещения в функцию используется команда call, для возврата из функции команда ret. Значение результата функции обычно передаётся через регистр eax, то есть функция заполняет его значением результата, но может и любым другим способом.

      call - Вычитает из адреса стека 4, или 8 (в зависимости от разрядности приложения) и записывает по этому адресу адрес инструкции следующей за инструкцией call, после чего перемещает поток по адресу который был передан.

      call eax //Перемещает поток на адрес находящийся в eax
      

      ret - Берёт значение адреса (или любое) находящееся по адресу стека и перемещает на него поток, после чего добавляет к адресу стека 4, или 8.
      Если у инструкции есть аргумент в виде числа, тогда дополнительно сдвигает стек после переноса потока по адресу.
      Например, по стандарту ret должен был сдвинуть 4 байта, но это была инструкция ret 8 и в итоге ret сдвинет стек (добавит к адресу стека в esp) на 12 байт.

      ret //Простой
      ret 8 //С дополнительным сдвигом
      

      Пример функции "fo" без аргументов которая всегда возвращает значение 16:

      fo:
       mov eax,5
       mov ecx,#11
       add ecx,eax
       mov eax,ecx
       ret
      

      Пример "fo2" функции с аргументами, которая принимает через стек 2 аргумента и складывает их, после чего возвращает значение результата через регистр eax и убирает из стека помещённые значения:

      //После вызова с помощью call в [esp] находится адрес куда вернуться потоку, в [esp+4] и [esp+8] находятся аргументы.
      fo2: 
       mov eax,[esp+4] 
       add eax,[esp+8]
       ret 8
      

      Пример вызова функции "fo2" с аргументами:

      push 9 //Загрузка первого аргумента
      push 7 //Загрузка второго аргумента
      call fo2
      // Теперь в eax находится число 16
      

      Подробнее про вызов функций рассказано в следующих статьях

      написал в Базовая информация функции поток вызов функций
      PromisingP
      Promising
    • Принцип создания свободной камеры в играх

      Создание свободной камеры для одиночной игры на примере игры War Thunder

      Свободная камера, подразумевает возможность полёта камеры отдельно от объекта/персонажа и тому подобного, используется в самых разных целях, для обнаружения противников, для создания красивых снимков, для нахождения секретов и прочего.

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

      Более детально всё показано в следующем видео:
      My video

      Видео с демонстрацией работы разных формул:
      My video formules

      Видео от другого участника форума на примере игры Dark Souls:
      My video formules

      Imaginary

      написал в Взлом игр (средний уровень и выше)
      PromisingP
      Promising
    • Оглавление

      С чего начать новичку


      Статья содержит информационное-оглавление полезное для новичков, разделы расположены в последовательном порядке.


      • Инструменты:
        1. Cheat Engine
        2. Process Monitor
      • Отладка приложения:
        1. Типы данных
          1. Поиск значения
          2. Поиск неизвестного значения
          3. Хоткеи для значений
        2. Инструкции ассемблера и регистры процессора
          1. Поиск инструкций работающих с адресом
          2. Изменение инструкций ассемблера
        3. Память процесса
        4. Потоки
          1. Стек
        5. Функции
      • Создание скриптов autoassembler:
        1. Синтаксис и команды
        2. Выделение памяти и инъекция кода
        3. Выбор места для инъекции кода
        4. AOBScan и динамическая инъекция
        5. Создание и возврат нового потока
        6. Вызов существующей функции
      • Числа с плавающей запятой:
        1. FPU
      написал в Базовая информация
      PromisingP
      Promising
    • Взлом мобильных приложений с помощью CE server

      Cheat Engine сервер:

      Предназначен для удалённого взлома каких либо приложений, сервер располагается на целевом устройстве, а клиент подключается к нему по IP, после этого становятся доступны почти все функции стандартного Cheat Engine.

      Установка Cheat Engine сервера на Android:

      Для установки и использования вам потребуются:

      • root права в системе.
      • Приложение - терминал, скачать можно например из Google play.
      • Сам сервер, который можно скачать с официального сайта, в разделе Download снизу, под вашу версию Android.

      После того, как у вас есть все эти компоненты, можно приступать к установке.
      Сначала, вам нужно найти системную папку с файлом sh, у меня это /system/bin:

      cd260d0d-f973-42d9-965d-ba38dc43cbd0-изображение.png

      После, нужно распаковать файлы из скачанного архива сервера в эту папку (файлы могут называться иначе):

      67f5d8b6-8d99-4256-8953-943768b38a66-изображение.png

      После распаковки, останется только запустить сервер. Сделать это можно с помощью приложения терминал.
      Команды:

      su --Дать терминалу права суперпользователя.
      system/bin/ceserver_x86 --Путь к файлу сервера. (какой у вас файл, и путь, вводите свой)
      

      При успешном запуске, вы увидите сообщение от сервера, в котором он пишет что ожидает подключения клиента:

      4ce9580a-0372-483b-afa5-981a74a9f55c-изображение.png

      Что бы подключиться к серверу, вам нужно открыть клиент CE, и ввести ip адрес сервера, и порт (стандартный 52736), не забывайте что для подключения вне локальной сети порт должен быть открыт.

      31a44160-409c-4bc3-bf41-ec33e4f03cb5-изображение.png

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

      f8153945-8ae2-4a25-8fc9-4059f88e26cd-изображение.png

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

      
      [ENABLE]
      aobscan(PlayerL, 8B 9B A4 04 00 00) //Поиск инструкции по сигнатуре
      registersymbol(PlayerL)
      
      libopus.haar1: //Код в выбранном месте, неиспользуемая функция библиотеки
      mov [ebx+000004A4],#500 //Установить 500 здоровья
      
      originalcode: 
      mov ebx,[ebx+000004A4] //Оригинальная инструкция
      
      jmp returnhere //Возврат в код после прыжка
      
      PlayerL:
      jmp libopus.haar1 //Прыжок на новый код
      nop 
      
      returnhere:
       
      [DISABLE]
      PlayerL:
      db 8B 9B A4 04 00 00 //Восстановление оригинальной инструкции
      unregistersymbol(PlayerL)
      

      Imaginary

      написал в Взлом игр (начинающим)
      PromisingP
      Promising
    • Поиск неизвестного значения

      В теме показано как искать неизвестное значение

      Рассмотрены некоторые особенности поиска неизвестных значений и координат


      Поиск неизвестного значения применяется, если вы не знаете точно, каким является значение, например, если оно отображено просто заполняющейся полоской, или в странном формате (например как формат времени).

      В этой статье показано как найти координаты персонажа на примере игры Terraria.
      Сначала откройте игру и подключитесь к процессу с помощью Cheat Engine, как показано в предыдущей статье:

      4975dd11-be82-4456-8276-b9e9d2f40c49-изображение.png

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

      d4f5f57d-dfa9-4816-a085-15ebed67ed4c-изображение.png

      Установите персонажа впритык к самому левому:

      6c771dee-0420-4141-a3c8-b15145105bfe-изображение.png

      Поставьте игру на паузу и перейдите в Cheat Engine, там выберете поиск неизвестного значения из списка:

      7745a1ec-1fcb-4ae3-a221-85bd2327a282-изображение.png

      Нажмите First Scan, не появится никаких значений слева, но должно показать общее их количество:

      488862fa-387e-492c-ad68-d64b84e5ef7b-изображение.png

      Теперь перейдите в игру и передвиньте персонажа вплотную к следующей отметке:

      e0d36d6f-085d-4b2f-8110-37c0ea2ef462-изображение.png

      Перейдите в Cheat Engine и выберите Scan Type как Increased value (увеличенное значение):

      c3a92b4e-2caa-436e-bccb-663109d4a91c-изображение.png

      После этого нажмите Next Scan, если вы всё сделали верно и поиск успешен то сверху появятся значения и их общее количество (около Found) уменьшится:

      f7f4f417-207d-4600-ae41-0f83553f2cca-изображение.png

      Значений слишком много и нужно провести отсеивание, для этого передвигайте персонажа и выбирайте тип следующего поиска в соответствии с этим, переместите персонажа снова впритык к левому ограничителю:

      12bfadbc-0296-4a99-a428-18b0f6884556-изображение.png

      В Cheat Engine выберите тип поиска Decreased value (уменьшенное значение):

      2a6f9d2d-d88d-45e2-a21f-cae0ab9cc43a-изображение.png

      После этого нажмите Next Scan:

      7d4536b7-1a4b-434d-a823-72b43217754a-изображение.png

      Если вы всё сделали верно то количество значений должно уменьшиться. Продолжайте перемещать персонажа вправо и влево производя соответствующий отсев, выбирая "Увеличилось" если персонаж стоит правее чем при прошлом поиске, и "Уменьшилось" если левее. Если вы совершили ошибку, например перепутали стороны поиска и поняли это, не обязательно начинать новый поиск, вы можете вернуться к результатам предыдущего отсева нажав Undo Scan.

      1bc077cc-1a06-410d-bd0f-568fc4dfb5ca-изображение.png

      Когда значений останется меньше и вы заметите что их количество от поиска к поиску уменьшается слабо, стоит использовать отсев с указанием "Не изменилось", для этого сдвиньте персонажа в определённую сторону, выберите соответствующий поиск (уменьшилось/увеличилось) и проведите его, после этого вернитесь в игру и не перемещайте персонажа с позиции последнего поиска.
      Позвольте ему немного постоять на месте и перейдите назад в программу, выберите тип поиска Unchanged value, это значит что вы хотите что бы Cheat Engine убрал все значения из списка которые изменились с прошлого поиска и оставил лишь те которые не изменились, если персонаж не двигался с прошлого поиска то его значение должно попадать в диапазон:

      33d9c5a7-3814-4c93-a664-c59e5454cb91-изображение.png

      Произведите поиск:

      682c8e14-bc65-4224-8bf6-e4c8417cfb98-изображение.png

      Количество значений довольно заметно сократилось. Теперь, не перемещая персонажа продолжайте возвращаться в игру, а потом в Cheat Engine и нажимать Next Scan с выбранным Unchanged value, пока количество значений ещё сильнее не уменьшится:

      ad7dbba5-3461-4003-aa4c-2c3e0ac54c39-изображение.png

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

      e985d9b4-00e3-4312-b08d-2b77f16407a5-изображение.png

      Перейдите в Cheat Engine и поставьте галочку на Compare to first scan, тогда при следующем нажатии Next Scan программа будет сравнивать значения не с результатом прошлого поиска, а с результатом самого первого:

      681e5958-7dd8-4706-98db-d2edf157989b-изображение.png

      Выберите тип Unchanged value, потому что персонаж стоит в той же позиции что и при первом поиске и произведите отсев:

      d80bc1b4-edf0-4ba1-a5f3-3c81c1085065-изображение.png

      Значений стало меньше, но всё равно ещё слишком много. Не забудьте снять галочку с Compare to first scan когда сдвините персонажа с позиции. Что бы ещё уменьшить их количество, попробуйте сделать что то необычное. Поиск производился для координаты X персонажа, то есть для горизонтального положения, поэтому попробуйте уменьшить другую координату, опустите, или поднимите его:

      74a758f8-439a-4cce-9303-f68e09192dca-изображение.png

      После этого произведите отсев с параметром "не изменившееся":

      a38f3efb-4604-49e6-b4ea-be4fd2b41b05-изображение.png

      Значений стало намного меньше, но всё равно ещё слишком много. Что бы ещё уменьшить их количество, попробуйте увести персонажа далеко вправо от позиции начального поиска:

      44919afa-f3c1-443f-81a5-9fe0c022c487-изображение.png

      И проведите отсев увеличившегося значения:

      ac1fae1e-3748-4773-91e9-a2b7e7e9c56c-изображение.png

      Значений стало ещё меньше, вернитесь в изначальную позицию и произведите отсев уменьшившегося значения:

      b2c4a246-2846-49d2-a556-9ad63f5c9cd2-изображение.png

      db8d5876-0280-4d6a-9ff2-7ce14bd28176-изображение.png

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

      Выберите все значения и добавьте их в таблицу, для этого нажмите на любое значение в окне поиска и нажмите Ctrl+A на клавиатуре что бы выделить все значения, после чего нажмите на красную стрелочку, все значения переместятся в таблицу:

      35c64520-60d8-440e-af0f-098590c74957-изображение.png

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

      6a60ac86-3605-4606-b00c-d1764111336e-изображение.png

      Для того что бы быстро заморозить, или разморозить значения, нажмите пробел находясь в активном окне Cheat Engine:

      661098b0-3ec9-4cfb-a3f8-1761c48c7d1f-изображение.png

      Перейдите в игру и попробуйте переместить персонажа вправо, или влево:

      77382ef4-d68c-4b18-ac6b-849fa86f6045-изображение.png

      Персонаж перемещается, но дёргается небо и облака, значит это не нужные значения. Удалите выделенные значения нажав клавишу Del на клавиатуре, если они вам не нужны, или просто снимите с них заморозку нажав пробел. Выделите следующую группу значений и повторите процедуру.
      Для удобства и быстроты поиска, самый эффективный способ это выделять и замораживать сразу половину от всех значений в таблице, проверять в игре, может ли персонаж перемещаться по X, если искомое значение будет среди них и он не сможет, вы сможете сразу удалить другую половину значений в таблице и повторить процедуру с половиной оставшихся значений:

      a2df2f37-1c98-4709-84ec-0cedb1700f3f-изображение.png

      После нескольких повторений осталось лишь несколько значений:

      01c69901-0d96-41cf-91b6-c8ef69a5090d-изображение.png

      Так как персонаж может перемещаться, значит верхние значения не нужные, удалите их:

      09ded069-939a-414e-9023-ba9b5e6563d0-изображение.png

      Теперь можно поочерёдно замораживая значения и проверяя игру, найти нужное:

      12e02fb5-7135-4b24-8709-5dde714618e9-изображение.png

      Остальные значения можно удалить:

      19220571-bc6c-4bae-9c02-f6d1e30b5264-изображение.png

      Сравним значение в позиции около первого ограничителя и около второго:

      74ae16ea-6bdd-48a5-8c5a-abecb439caa9-изображение.png

      4f34e159-6329-4d81-a50e-60ea7e213f06-изображение.png

      И у второго:

      2fdef773-6e1e-4636-8d8d-3c8aa1733518-изображение.png

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

      Теперь вы можете заметить, что значение координат выглядит странным слишком большим. Можно проверить свои подозрения, попробовав изменить его тип, как программа читает его из памяти, для этого два раза кликните на "4 Bytes" в строке Type, появится окно выбора типа:

      fb67b12e-94ef-451a-bfe1-afdd5cc5f6b5-изображение.png

      Выберите тип float и посмотрите как изменится внешний вид значения:

      bf97e21b-e3ac-41ec-89b4-d7ba9f7e8890-изображение.png

      Посмотрите как оно выглядит в первой и второй позициях:

      4b61e376-1f0b-4577-98f2-80b54c64ab28-изображение.png

      4a046b9d-c6bb-49be-b793-a8c560904d0d-изображение.png

      Теперь оно приняло читаемый вид и можно попробовать вычислить расстояние, которое занимает один блок в игре, посчитав блоки между столбиками и разделив разницу между вторым и первым значением на это количество, получится (51340 - 51280) / 4 (блоков 5, но персонаж занимает 2 блока, потому -1 блок будет 4) = 15
      Для проверки попробуем вычесть из значения около правого столба 30 и записать его, посмотрев, на сколько блоков переместится персонаж, производить арифметические операции можно прямо в строке изменения значения:

      f5eb92f8-2cc6-44f7-a672-696f492a0bf0-изображение.png

      b887140a-6c8a-47ba-887f-fde497a25ff7-изображение.png

      Персонаж переместился ровно на 2 блока влево, значит всё посчитано верно.
      Это было математическое отступление, а теперь нужно найти вторую координату, что бы перемещать персонажа не только вправо и влево, но и вверх и вниз.
      Можно начать новый поиск, но сначала попробуйте добавить значение по адресу расположенное прямо следующим за этим, так как координаты обычно располагаются рядом. Есть разные виды расположения координат, x y, x y z, x z y, и прочие, это двухмерная игра, поэтому стоит попробовать проверить первый тип, для этого продублируйте значение в таблице, выделив его, нажав Ctrl+C и затем Ctrl+V, после того как вы сделаете это, появится окно спрашивающее, как добавить значение:

      00722555-d979-4bbd-aff6-f1ee4b98166a-изображение.png

      В нём можно указать на сколько сместить адрес, чем заменить и прочее, сейчас просто нажмите кнопку Paste ничего не меняя, значение появится в таблице:

      3a0eb440-7acf-43ac-bbdc-24b31ae07009-изображение.png

      Для удобства назовите первое значение "X", для этого кликните дважды на No description и введите свой текст.

      d23655c7-f67e-480e-a16b-786635bc0eaa-изображение.png

      Что бы проверить, находится ли координата Y поблизости, нужно изменить адрес только что добавленной записи. Для этого нажмите на адрес в графе Address второго значения и добавьте к адресу 4, так как тип float занимает 4 байта, а получить нужно значение идущее следующим:

      6c6ef57e-0f90-4185-b715-318a49bbdbbe-изображение.png

      Как только вы введёте + 4, вам станет видно какое значение располагается по этому адресу, если оно выглядит адекватным, тогда можно нажать OK и адрес в таблице изменится. Если бы поиск начинался с Y, тогда для получения X нужно было бы вычитать 4, а не добавлять. Помните что адрес считается в байтах в шестнадцатеричной системе счисления.

      2316201e-df27-4484-8817-e2031411334c-изображение.png

      Для проверки попробуйте изменить значение, например добавив к нему 60 (4 блока):

      eac7cb4c-efb9-4a9c-8495-242b4d6f2011-изображение.png

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

      написал в Базовая информация поиск unknown value
      PromisingP
      Promising
    • Поиск инструкций работающих с адресом

      В теме описанао как найти инструкции работающие с адресом, а так же использование nop для отключения инструкций


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

      af897ad5-b132-4158-8611-c14ae32e0b17-изображение.png

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

      b1f1c6b9-cfc6-4825-b171-00dc6bb7890b-изображение.png

      Когда вы нажмёте на этот пункт, если отладчик не подключен то программа спросит вас, подключить ли отладчик к игре, подтверждайте и увидите вот такое окно:

      e7ebd4a0-92bb-4036-ac3a-410c9453710a-изображение.png

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

      985f4548-30ad-482b-bca5-5fb4d6c58cde-изображение.png

      После этого перейдите в Cheat Engine и посмотрите на инструкции в окне:

      8bf4af4e-22d0-4bf1-957f-ad0c7f58af58-изображение.png

      Появилось две интструкции, описанные в предыдущей статье, первая вычитает из адреса здоровья число находящееся в регистре eax, а вторая увеличивает здоровье на 1.
      Значит, первая инструкция это урон при касании врага, а вторая это инструкция отвечающая за постоянную регенерацию персонажа.
      Что бы прекратить отслеживание новых инструкций нажмите кнопку Stop, после чего добавьте найденные инструкции в лист сохранённых инструкций, что бы в дальнейшем использовать их, для этого выделите обе инструкции таким же способом как выделяете записи в таблице и нажмите кнопку Add to the codelist:

      f1019584-b529-45c5-823c-713887bedbb8-изображение.png

      После нажатия инструкции появятся в новом окне:

      713f2464-8a5f-4c4f-bd50-99b83b6e8575-изображение.png

      Закройте окно поиска инструкций нажав клавишу Close, или крестик:

      a088885b-b35b-4c1c-9bf8-11ef774d11c8-изображение.png

      Теперь вы можете сохранить таблицу в любое удобное для себя место с помощью этой кнопки:

      8b8d2ce9-0a72-4261-b035-7981a6c70b33-изображение.png

      Если вы закроете окно с сохранёнными инструкциями Code List, вы можете снова открыть его, нажав на надпись Advanced options в левом нижнем углу главного окна Cheat Engine:

      36373510-f3ba-4b2d-9a3d-677822d7cc04-изображение.png

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

      Перейдите в окно Code List и выберите инструкцию вычитающую здоровье персонажа:

      c0b35f60-03dc-452c-be8a-8e526a6cb5b5-изображение.png

      Вызовите контекстное меню для неё и выберите "Заменить ничего не делающим кодом" (нопами nop):

      e4232132-067a-49d1-8038-7e70ce31971e-изображение.png

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

      Что бы восстановить инструкцию, снова нажмите на неё вызвав контекстное меню и выберите "Восстановить оригинальный код":

      15cb0564-260a-4908-b86c-9a66bc32133f-изображение.png

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

      написал в Базовая информация assembler nop ноп отладка инструкции
      PromisingP
      Promising
    • Память процесса

      В этой статье описывается общее устройство того как процесс использует память


      Весь код процесса выполняется в его памяти, память процесса это выделенная область в оперативной памяти компьютера, которая может изменять свой размер динамически и начинается с загрузки .exe файла процесса при его запуске.
      Память выделяется страницами, обычно минимальный размер страницы на windows это 4096 байт, то есть меньше этого значения быть не может при выделении. Когда выделяется память, просто говоря - для процесса резервируется больший участок в оперативной памяти.
      У памяти бывают разные типы защиты, этим определяются типы памяти, которые могут быть использованы для сужения региона поиска в Cheat Engine, настройки предоставлены здесь:

      a9a009f1-6354-4807-9f50-d114f3e81acb-изображение.png

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

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

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

      Readable память - читаемая, та, которая может быть прочитана. Этот флаг есть почти у всех регионов памяти.

      Подробнее про CopyOnWrite можно прочитать здесь.

      Если поток попытается сделать операцию с памятью которая не позволяет этого из за своего типа защиты, приложение будет закрыто с ошибкой. Помните об этом в дальнейшем. Посмотреть тип текущей страницы памяти с которой вы работаете можно через Cheat Engine, в нижней части окна отладчика:

      e99bdcf5-e2a4-43b3-8468-579fd0e240b4-изображение.png

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

      ab83bc9f-bfdf-4d58-bca5-1b3c43b190d0-изображение.png

      Верхнее показывает машинные коды преобразованные в ассемблерные инструкции.

      Вы можете выделить новую страницу в памяти процесса для своих нужд, сделать это можно через меню инструментов:

      8a7aea6f-8869-4e96-92be-7a9edd176bdc-изображение.png

      После выделения памяти через Cheat Engine, она будет иметь разрешения и на запись, и на чтение, и на исполнение, вы можете делать что угодно в этой памяти:

      05e61fd5-be11-42d0-b977-44a3de6a561f-изображение.png

      Size на изображении указан 1000, это 4096 в шестнадцатеричной системе счисления, потому что для примера я выделила одну страницу памяти.

      написал в Базовая информация memory память типы
      PromisingP
      Promising
    • FPU

      О том что такое FPU и его команды, обзор принципов взаимодействия


      Fpu это математический сопроцессор который позволяет легко работать с числами с плавающей запятой и с обычными числами, совершать операции типа умножения и деления. Он может работать с любыми значениями 4 и 8 байт размера и любыми типами, float, double, int32, int64.
      Все операции Fpu производятся в его стеке, в который сначала нужно загрузить значения, после вычислений значения нужно выгрузить если вам нужно получить результат и что бы не портить стек, если вы делаете инъекцию в код игры и она использует fpu.

      Некоторые команды сопроцессора:

      //Если команда не имеет *, значит она работает с числом в стеке и не принимает переменных.
      //Почти все команды могут быть использованы на регистрах стека fpu с уже загруженными значениями, например fld st(0) продублировать последнее загруженное значение, или fadd st(0), st(1), сложить два последних загруженных значения в стеке и тому подобное.
      //Для выгрузки значения из стека вникуда используйте fstp st(0)
      //Почти все команды с f поддерживают вариант с fi, например fadd - fiadd, что указывает сопроцессору что сложение надо производить сначала сконвертировав число в число с плавающей запятой, например используйте fiadd если добавляете целое число int32.
      
      //Команды загрузки и выгрузки
      fld * - Загрузить вещественное число
      fild * - Загрузить в стек целое число
      fst * - Скопировать из стека в переменную
      fstp * - Выгрузить из стека в переменную
      fist * - Скопировать из стека в переменную и преобразовать в целое
      fistp * - Выгрузить из стека в переменную и преобразовать в целое
      
      fldpi - Поместить в стек число Пи
      fldz - Поместить 0
      fld1 - Поместить 1
      
      //Команды арифметический операций
      fadd * - Складывает значение в стеке и переменную
      fsub * - Вычитает из значения в стеке переменную
      fsubr * - Вычитает из переменной значение в стеке, и помещает в стек.
      fmul * - Выполняет умножение числа в стеке на переменную
      fdiv * - Выполняет деление
      fdivr * - Делит переменную на число в стеке и помещает результат в стек.
      
      fsqrt - Извлекает квадратный корень из числа в стеке.
      fabs - Убирает минус у числа в стеке (делает положительным)
      
      //Команды проверок
      fcom * - Сравнить значение в стеке с переменной
      ftst - Сравнить с нулём
      fstsw ax сохраняет флаги в приёмник (ax) 
      sahf загружает флаги после команды выше.
      

      Рассмотрим пример использования FPU в скрипте для конвертации в разные типы, из int32 во float и double:

      написал в Базовая информация fpu float double assembler
      PromisingP
      Promising
    • Cheat Engine

      Cheat Engine - универсальный инструмент для отладки

      В этой статье описаны особенности программы и установка.


      Cheat Engine, переводится как Чит Двигатель, Двигатель Обмана, и является по аналогии с игровыми "движками" инструментом для создания читов, cheat - значит обманывать (англ).

      Это самая продвинутая и многопрофильная программа из существующих в этой области на данных момент, позволяющая изменять игры и приложения как угодно, если у вас достаточно знаний.
      Хотите добавить новые правила в игру, изменить существующие, или просто сделать что бы пшеница на вашей виртуальной ферме росла быстрее? Всё это позволяет данная программа, но этим её возможности не ограничиваются.
      Для профессиональных программистов данная программа может послужить отличным отладчиком, позволяя найти проблему в чужом, или своём продукте и исправить её на лету.
      Как и другие подобные программы, эта так же позволяет исследовать код игры для дальнейших его модификаций и изменений извне (например, с помощью программ написанных на высокоуровневых языках, таких как C#, или С++).
      Программа имеет поддержку lua и позволяет автоматизировать многие действия внутри себя с его помощью, поддерживаются плагины написанные на lua, которые могут включать dll написанные на других языках.

      Скачать программу можно с официального сайта, она распространяется бесплатно, если при установке возникают проблемы, стоит отключить антивирус, некоторые антивирусы и стандартный защитник windows (только на windows 10+) удаляет файлы программы при установке и установщик навечно зависает.
      Интерфейс программы на английском, хотя бы минимальное понимание желательно, но есть неофициальные русификаторы, ссылки на которые приведены не будут, потому что часто эти русификаторы вызывают проблемы в работе программы.
      Для работы программа при каждом запуске будет требовать повышения прав, что бы иметь возможность внедряться в чужие процессы.
      При первом запуске появляется предложение пройти туториал и указать данные для автоматической публикации ваших работ на официальном форуме программы, которые можно пропустить. Если вы понимаете английский, стоит пройти туториал, он очень информативный и простой.

      написал в Базовая информация
      PromisingP
      Promising

    Недавние сообщения Promising

    • RE: Pocket Rogues 1 убийство = +1 лвл

      @CoinsDMG cmp инструкция работает с целыми числами, а у тебя float

      написал в Взлом игр (начинающим)
      PromisingP
      Promising
    • Cheat Engine

      Cheat Engine - универсальный инструмент для отладки

      В этой статье описаны особенности программы и установка.


      Cheat Engine, переводится как Чит Двигатель, Двигатель Обмана, и является по аналогии с игровыми "движками" инструментом для создания читов, cheat - значит обманывать (англ).

      Это самая продвинутая и многопрофильная программа из существующих в этой области на данных момент, позволяющая изменять игры и приложения как угодно, если у вас достаточно знаний.
      Хотите добавить новые правила в игру, изменить существующие, или просто сделать что бы пшеница на вашей виртуальной ферме росла быстрее? Всё это позволяет данная программа, но этим её возможности не ограничиваются.
      Для профессиональных программистов данная программа может послужить отличным отладчиком, позволяя найти проблему в чужом, или своём продукте и исправить её на лету.
      Как и другие подобные программы, эта так же позволяет исследовать код игры для дальнейших его модификаций и изменений извне (например, с помощью программ написанных на высокоуровневых языках, таких как C#, или С++).
      Программа имеет поддержку lua и позволяет автоматизировать многие действия внутри себя с его помощью, поддерживаются плагины написанные на lua, которые могут включать dll написанные на других языках.

      Скачать программу можно с официального сайта, она распространяется бесплатно, если при установке возникают проблемы, стоит отключить антивирус, некоторые антивирусы и стандартный защитник windows (только на windows 10+) удаляет файлы программы при установке и установщик навечно зависает.
      Интерфейс программы на английском, хотя бы минимальное понимание желательно, но есть неофициальные русификаторы, ссылки на которые приведены не будут, потому что часто эти русификаторы вызывают проблемы в работе программы.
      Для работы программа при каждом запуске будет требовать повышения прав, что бы иметь возможность внедряться в чужие процессы.
      При первом запуске появляется предложение пройти туториал и указать данные для автоматической публикации ваших работ на официальном форуме программы, которые можно пропустить. Если вы понимаете английский, стоит пройти туториал, он очень информативный и простой.

      написал в Базовая информация
      PromisingP
      Promising
    • Память процесса

      В этой статье описывается общее устройство того как процесс использует память


      Весь код процесса выполняется в его памяти, память процесса это выделенная область в оперативной памяти компьютера, которая может изменять свой размер динамически и начинается с загрузки .exe файла процесса при его запуске.
      Память выделяется страницами, обычно минимальный размер страницы на windows это 4096 байт, то есть меньше этого значения быть не может при выделении. Когда выделяется память, просто говоря - для процесса резервируется больший участок в оперативной памяти.
      У памяти бывают разные типы защиты, этим определяются типы памяти, которые могут быть использованы для сужения региона поиска в Cheat Engine, настройки предоставлены здесь:

      a9a009f1-6354-4807-9f50-d114f3e81acb-изображение.png

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

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

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

      Readable память - читаемая, та, которая может быть прочитана. Этот флаг есть почти у всех регионов памяти.

      Подробнее про CopyOnWrite можно прочитать здесь.

      Если поток попытается сделать операцию с памятью которая не позволяет этого из за своего типа защиты, приложение будет закрыто с ошибкой. Помните об этом в дальнейшем. Посмотреть тип текущей страницы памяти с которой вы работаете можно через Cheat Engine, в нижней части окна отладчика:

      e99bdcf5-e2a4-43b3-8468-579fd0e240b4-изображение.png

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

      ab83bc9f-bfdf-4d58-bca5-1b3c43b190d0-изображение.png

      Верхнее показывает машинные коды преобразованные в ассемблерные инструкции.

      Вы можете выделить новую страницу в памяти процесса для своих нужд, сделать это можно через меню инструментов:

      8a7aea6f-8869-4e96-92be-7a9edd176bdc-изображение.png

      После выделения памяти через Cheat Engine, она будет иметь разрешения и на запись, и на чтение, и на исполнение, вы можете делать что угодно в этой памяти:

      05e61fd5-be11-42d0-b977-44a3de6a561f-изображение.png

      Size на изображении указан 1000, это 4096 в шестнадцатеричной системе счисления, потому что для примера я выделила одну страницу памяти.

      написал в Базовая информация memory память типы
      PromisingP
      Promising
    • Поиск значения

      Статья демонстрирует как можно найти и изменить значение в памяти процесса с помощью Cheat Engine


      Для начала работы вам понадобится Cheat Engine.
      Если вы прошли встроенный в него туториал то уже знаете как искать значения. В этой статье рассмотрен пример на игре Terraria.

      Заходим в игру, и выясняем сколько здоровья у персонажа:

      a9524c26-992e-44c4-b415-d0ccb7136985-изображение.png

      500 здоровья. Что бы найти это значение в Cheat Engine, сначала нужно подключиться к процессу игры. Для этого нажимаем переливающуюся разными цветами кнопку со значком монитора и лупы:

      e021f5a6-88d6-4445-b91b-f768ef66b749-изображение.png

      После нажатия появится окошечко выбора процесса, найдите в нём процесс игры, обычно, имеет название как .exe файл игры:

      9808f018-4982-47cd-97cd-57a5f8473b03-изображение.png

      Или перейдите на вкладку Applications сверху и выбере там, по названию окна, после чего нажимайте кнопку Open, если вы планируете проводить отладку процесса, можете вместо этого нажать кнопку Attach debugger to process, это можно сделать и позже.

      db78472c-756c-4ac9-8fac-b89793e7f88d-изображение.png

      Если процесс успешно открылся, вы увидите его название над строкой поиска:

      121374dd-feb8-462e-985b-107a00a0e272-изображение.png

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

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

      790de82a-2270-4cfd-bdc1-ff2071567cf6-изображение.png

      Впишите значение в строку поиска, расположенной под словом Value и нажмите кнопку First scan:

      b9ace2a2-a77b-4628-8bbd-8c704a071eda-изображение.png

      Если поиск прошёл удачно, слева будет показан список найденных значений такого типа и размера:

      80e10b27-1d0e-4678-86c3-776d25d49497-изображение.png

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

      c1485687-7f82-4980-8697-2b26e70789b5-изображение.png

      Следите что бы значение не изменялось когда вы его ищите, поставьте игру на паузу.
      Теперь введите отображаемое значение вместо первых 500 и нажмите кнопку Next Scan:

      8f613232-f85c-4b4d-8499-6b9ddb436720-изображение.png

      При успешном поиске список значений изменится, в этой игре значение осталось всего одно сразу, но обычно требуется повторить процедуру изменения значения и отсеивания (Next Scan) несколько раз:

      915767cd-5d35-49be-a989-f3f8f376975d-изображение.png

      Для того что бы проверить, нужное ли это значение, добавьте его в таблицу, сделать это можно выделив значение нажав на него и нажав на кнопку со стрелочкой, или через контекстное меню которое появляется нажатием другой кнопки мыши на значение, (в нём же можно и изменить значение не добавляя в таблицу):

      904be9db-b033-4b7c-af0c-644b0b892d17-изображение.png

      f780291d-ccaa-4686-a2df-e001c94cd7d9-изображение.png

      Если всё сделано правильно, значение появится в таблице:

      7debee00-4604-4167-82e7-fceef50ca467-изображение.png

      Теперь попробуйте изменить значение, дважды кликнув на цифру 417 в графе Value, появится окно изменения значения (так же можно изменить значение не вызывая окна, просто выделив его и нажав ентер, набирать цифрами, для применения нажать ентер):

      675c2779-d679-4b76-99e2-f7bae3e0a35b-изображение.png

      Введите желаемое значение и нажмите OK, значение должно измениться:

      91e3b266-6ecf-4f65-855a-f855d1f6c2e0-изображение.png

      Перейдите в игру и посмотрите, изменилось ли значение в ней:

      549ee355-600f-4091-96d5-6071b209ecf9-изображение.png

      Если вы нашли верное значение, вы увидете изменения в игре, если значение не изменилось, стоит начать поиск заново, изменив тип значения на другой. Стоит попробовать типы 4 байта, float, double. Для начала нового поиска нажмите кнопку New Scan.

      Вы можете управлять значением из таблицы, например запретить ему изменяться. Оно будет изменяться, но Cheat Engine будет возвращать его к выбранному вами. Для заморозки значения нажмите на квадратик в графе Active:

      88971073-9318-484d-92c6-d808faf28184-изображение.png

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

      Так же можно нажать справа от крестика и указать тип заморозки, стрелка вверх значит что значению можно увеличиваться, но нельзя уменьшаться, стрелка вниз - наоборот:

      7f3a3b9b-dd50-4905-b5de-9c4556165086-изображение.png
      3ceec365-6b66-4a80-8e20-42eeb4450cf5-изображение.png

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

      написал в Базовая информация поиск значение
      PromisingP
      Promising
    • Инструкции ассемблера и регистры процессора

      В теме рассматриваются простые команды ассемблера, принцип работы и основные регистры процессора


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

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

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

      eb6efdde-8fd7-49ce-bbf0-4ef1392f82bd-изображение.png

      Как показано на этой картинке, регистр eax состоит из первой части, где 16 бит не обозначены отдельным подрегистром, и регистра AX, размером 16 бит, как вы помните (2 байта), который в свою очередь состоит из двух частей по 8 бит (1 байт) AH и Al.
      Данная информация нужна для понимания если вам нужно работать с разноразмерными значениями, но в основном вам будут встречаться значения размером 4 и 8 байт, rax это 64 битная версия регистра eax которая вмещает 8 байт и бывает в 64 битных приложениях.

      Основные регистры следующие, с указанием размера в байтах:

      8   4   2  1  1
      RAX EAX AX AH AL
      RBX EBX BX BH BL
      RCX ECX CX CH CL
      RDX EDX DX DH DL
      RSI ESI SI
      RDI EDI DI
      RBP EBP BP
      RSP ESP SP
      

      В дальнейшем использовать для временного хранения данных вам следует все кроме ebp и esp, так как эти регистры могут использоваться для взаимодействия со стеком, о котором будет рассказано позже.
      Помните что использовать 8 байтовые регистры можно только в приложениях 64 бит. Регистры имеют осмысленные названия, например ESP - Extended Stack Pointer (Расширенный указатель на стек). Расширенный он, грубо описывая, потому что архитектура эволюционировала постепенно, было 16 бит, существовал только SP, разработали 32 бит, добавили ещё 2 байта вперёд и так далее.
      Подробнее про эти регистры можно почитать на английском тут.

      Команды ассемблера:
      Команды ассемблера используются для операций со значениями расположенными в регистрах и памяти приложения.
      Основные команды с синтаксисом Cheat Engine autoassembler которые пригодятся для понимания следующих статей, с примерами:

      mov - переместить (скопировать) данные

      mov eax, A //Поменстить в eax число 10 (A - шестнадцатиричная система)
      mov eax, #10 //Поместить в eax число 10 (#10 - десятичная система)
      mov eax, [адрес] //Переместить значение по адресу 4 байта в регистр eax
      mov [адрес], eax //Переместить значение из регистра eax 4 байта по адресу
      mov ecx, eax //Переместить значение из регистра eax в регистр ecx
      mov [адрес], al ///Переместить значение из регистра al 1 байт по адресу
      
      mov [адрес], [адрес] //Не правильно и работать НЕ БУДЕТ, все двойные операции только с регистрами.
      

      add - добавить

      mov eax, 5
      mov ecx, 4
      add eax, ecx //Добавить ecx к eax, после этого eax = 9
      add [адрес], eax //Добавить к значению по адресу eax 4 байта
      

      sub - вычесть

      mov eax, 5
      mov ecx, 4
      sub eax, ecx //Вычесть из eax ecx, после этого eax = 1
      sub [адрес], eax //Вычесть из значения по адресу eax 4 байта
      

      inc - увеличить на 1
      dec - уменьшить на 1

      inc [адрес] //Увеличить значение по адресу на 1
      dec eax //Уменьшить eax на 1
      

      mul - умножить, использует регистры и операнд. Регистр eax умножается на операнд и результат помещается в eax, остаток помещается в edx

      mov eax, 5
      mov ecx, 4
      mul ecx //Результат, eax = 20, edx = 0
      

      div - разделить, использует регистры и операнд. Значение из двух частей в eax:edx (записывайте edx 0 если хотите делить значение в рамках размерности 4 байт) делится на операнд и результат помещается в eax, остаток помещается в edx

      mov eax, 8
      mov edx, 0
      mov ecx, 4
      div ecx //Результат eax = 2, edx = 0
      
      mov eax, #10
      mov edx, 0
      mov [адрес], 5
      div [адрес] //Результат eax = 2, edx = 0
      

      xor - побитовое исключающее ИЛИ, но для начала достаточно знать что это команда часто используется для обнуления регистров компиляторами, сравнивая их самих с собой, так как она обычно занимает меньше байткода чем например mov eax, 0

      mov eax, 5
      xor eax, eax //eax = 0
      
      mov rax, 8
      xor rax, rax //rax = 0
      

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

      //Допустим адрес = A040D8, значение по адресу 5
      mov eax, [адрес] //eax = 5
      lea eax, [адрес] //eax = A040D8
      

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

      nop //Ничего не произошло, занимает 1 байт
      nop 5 //Ничего не произошло, занимает 5 байт
      

      Справочник со всеми командами на английском

      Структура выполнения кода:
      Байткод выполняется последовательно, ассемблерные инструкции тоже. Поток проходит по порядку с инструкции на инструкцию и выполняет их. Его положение может быть изменено с помощью некоторых команд, специальный регистр EIP отображает положение потока, текущий адрес на котором он находится:

      aa3b6288-bc38-4b8c-ab6c-cff0d9e0c83e-изображение.png

      Скриншот из отладчика Cheat Engine. В этом примере можно заметить, слева адрес инструкции, дальше байты инструкции (байткод), а справа интерпретация в виде ассемблерного кода который можно прочитать.
      Инструкция jmp позволяет перемещать поток на определённое количество байт вперёд, или назад. Cheat Engine сам посчитает байты, вам нужно только указать адрес:

      2f6a2069-bde2-424f-b8fc-d600b0c820af-изображение.png

      В этом примере инструкция add eax, ecx выполняться не будет, вместо этого сразу будет выполняться sub eax, ecx.

      Другой пример:

      06ef3446-86fe-46a6-a5aa-8f8c07cce0ec-изображение.png

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

      написал в Базовая информация assembler регистры инструкции
      PromisingP
      Promising
    • Потоки

      В этой теме описывается что такое потоки в общих чертах


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

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

      В Cheat Engine посмотреть список работающих потоков можно в окне отладчика через меню View:

      ac6ca786-1192-449e-91f0-dbcef87c9bc3-изображение.png

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

      112db97a-9d6f-4cbd-925e-fafcf6d09951-изображение.png

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

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

      244b0ee6-e269-4fcd-990d-145cf1b9014a-изображение.png

      Код задан, этот код берёт число 5, добавляет его к самому себе, увеличивает на 1 и вычитает из результата 4, результат записывается по адресу 08600000. В нижнем окне показано текущее значение адреса, оно является нулевым. Что бы код выполнился нужно вызвать поток на него. Так как это функция, она имеет команду ret что бы поток вернулся после выполнения.
      Для создания потока, выделите первую команду функции и в меню инструментов выберите создание потока:

      1236e201-4bbd-4a34-afd7-fee191565688-изображение.png

      Вас спросят на каком адресе создать поток, если вы выделили определённую инструкцию, адрес автоматически подставится в это окно:

      e8aa664b-89c3-4764-92ea-bd2336f55a50-изображение.png

      После этого появится окно с вопросом какой параметр задать потоку перед запуском, который попадёт в регистры. Оставьте его 0, в данном коде не нужно задавать предварительные значения регистрам:

      c1b9647c-968e-4f8e-9be0-79e1d886be5f-изображение.png

      После того как вы подтвердите создание потока, он выполнит функцию и вернётся, значение в адресе изменится:

      0ed5ea7a-6357-458b-bded-f5eb00a6adf9-изображение.png

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

      79a6c20a-cc9f-48ef-a190-d66024fbc6b3-изображение.png

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

      написал в Базовая информация поток потоки регистры память
      PromisingP
      Promising
    • Изменение инструкций ассемблера

      В этой статье описывается процесс изменения инструкций автоассемблера на другие


      В статье использованы инструкции найденные в предыдущей статье:

      407abc0f-7b3a-492b-b6aa-0c8440fad377-изображение.png

      Загрузите сохранённую таблицу Cheat Engine и подключите его к игре. Если инструкции в вашей игре статичные и не изменились, то вам не нужно искать их снова. Откройте code list и проверьте инструкции, заменив их нопами и восстановив.
      Для того что бы изменять инструкции, нужно открыть их в окне отладчика, сделать это можно через контекстное меню, или дважды кликнув по ним:

      4b0282f6-574f-43a6-b00c-6fe4860c9da1-изображение.png

      После этого появится окно отладчика с подробностями:

      eda1c388-c11c-444a-9c47-9145d74e3000-изображение.png

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

      9ef25661-9a63-48fc-88be-44984144c53c-изображение.png

      После этого в буфере обмена окажется Terraria.Player::Hurt+1201, вы можете записать это в удобное место и в дальнейшем перейти на этот адрес в окне отладчика нажав Ctrl+G, или через контекстное меню.

      Для изменения инструкции дважды кликните на неё, откроется окно редактирования:

      fdb72a7d-4f40-4a0e-9003-b9a107a73814-изображение.png

      Если вы читали статью о командах ассемблера, то скорее всего понимаете что делает эта инструкция, она вычитает из значения здоровья персонажа число находящееся в регистре eax, то есть в eax находится урон нанесённый персонажу.
      Если вы измените sub на add, тогда персонаж будет лечиться вместо получения урона, для наглядности попробуйте изменить её на mov, тогда персонаж будет получать здоровье равное значению полученного урона:

      949fb5f8-fb01-44f4-8b37-d5e9ee2b8f30-изображение.png

      Перейдите в игру и посмотрите на результат:

      c54c0bcf-500b-48ad-a2f1-0ff1cc5e73c1-изображение.png

      Получив 1 урона, персонаж получил 1 здоровье:

      b4781112-c588-4434-b263-4def47e68a4c-изображение.png

      Восстановите оригинальную инструкцию заменив mov на sub.
      Таким образом вы можете изменять одну линию в коде, если создаваемый вами код больше чем оригинальная инструкция, он займёт место следующей и Cheat Engine спросит, заменить ли оставшуюся часть от инструкции nop, если вы не замените, то скорее всего получите ошибку игры, из за неправильных инструкций. Если ваш код меньше - тогда выбирайте замену нопами, если вы восстанавливаете оригинальную инструкцию из меньшей и дальше уже есть нопы, отказывайтесь от замены нопами, что бы код восстановился полностью.

      написал в Базовая информация assembler отладка инструкции
      PromisingP
      Promising
    • Поиск неизвестного значения

      В теме показано как искать неизвестное значение

      Рассмотрены некоторые особенности поиска неизвестных значений и координат


      Поиск неизвестного значения применяется, если вы не знаете точно, каким является значение, например, если оно отображено просто заполняющейся полоской, или в странном формате (например как формат времени).

      В этой статье показано как найти координаты персонажа на примере игры Terraria.
      Сначала откройте игру и подключитесь к процессу с помощью Cheat Engine, как показано в предыдущей статье:

      4975dd11-be82-4456-8276-b9e9d2f40c49-изображение.png

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

      d4f5f57d-dfa9-4816-a085-15ebed67ed4c-изображение.png

      Установите персонажа впритык к самому левому:

      6c771dee-0420-4141-a3c8-b15145105bfe-изображение.png

      Поставьте игру на паузу и перейдите в Cheat Engine, там выберете поиск неизвестного значения из списка:

      7745a1ec-1fcb-4ae3-a221-85bd2327a282-изображение.png

      Нажмите First Scan, не появится никаких значений слева, но должно показать общее их количество:

      488862fa-387e-492c-ad68-d64b84e5ef7b-изображение.png

      Теперь перейдите в игру и передвиньте персонажа вплотную к следующей отметке:

      e0d36d6f-085d-4b2f-8110-37c0ea2ef462-изображение.png

      Перейдите в Cheat Engine и выберите Scan Type как Increased value (увеличенное значение):

      c3a92b4e-2caa-436e-bccb-663109d4a91c-изображение.png

      После этого нажмите Next Scan, если вы всё сделали верно и поиск успешен то сверху появятся значения и их общее количество (около Found) уменьшится:

      f7f4f417-207d-4600-ae41-0f83553f2cca-изображение.png

      Значений слишком много и нужно провести отсеивание, для этого передвигайте персонажа и выбирайте тип следующего поиска в соответствии с этим, переместите персонажа снова впритык к левому ограничителю:

      12bfadbc-0296-4a99-a428-18b0f6884556-изображение.png

      В Cheat Engine выберите тип поиска Decreased value (уменьшенное значение):

      2a6f9d2d-d88d-45e2-a21f-cae0ab9cc43a-изображение.png

      После этого нажмите Next Scan:

      7d4536b7-1a4b-434d-a823-72b43217754a-изображение.png

      Если вы всё сделали верно то количество значений должно уменьшиться. Продолжайте перемещать персонажа вправо и влево производя соответствующий отсев, выбирая "Увеличилось" если персонаж стоит правее чем при прошлом поиске, и "Уменьшилось" если левее. Если вы совершили ошибку, например перепутали стороны поиска и поняли это, не обязательно начинать новый поиск, вы можете вернуться к результатам предыдущего отсева нажав Undo Scan.

      1bc077cc-1a06-410d-bd0f-568fc4dfb5ca-изображение.png

      Когда значений останется меньше и вы заметите что их количество от поиска к поиску уменьшается слабо, стоит использовать отсев с указанием "Не изменилось", для этого сдвиньте персонажа в определённую сторону, выберите соответствующий поиск (уменьшилось/увеличилось) и проведите его, после этого вернитесь в игру и не перемещайте персонажа с позиции последнего поиска.
      Позвольте ему немного постоять на месте и перейдите назад в программу, выберите тип поиска Unchanged value, это значит что вы хотите что бы Cheat Engine убрал все значения из списка которые изменились с прошлого поиска и оставил лишь те которые не изменились, если персонаж не двигался с прошлого поиска то его значение должно попадать в диапазон:

      33d9c5a7-3814-4c93-a664-c59e5454cb91-изображение.png

      Произведите поиск:

      682c8e14-bc65-4224-8bf6-e4c8417cfb98-изображение.png

      Количество значений довольно заметно сократилось. Теперь, не перемещая персонажа продолжайте возвращаться в игру, а потом в Cheat Engine и нажимать Next Scan с выбранным Unchanged value, пока количество значений ещё сильнее не уменьшится:

      ad7dbba5-3461-4003-aa4c-2c3e0ac54c39-изображение.png

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

      e985d9b4-00e3-4312-b08d-2b77f16407a5-изображение.png

      Перейдите в Cheat Engine и поставьте галочку на Compare to first scan, тогда при следующем нажатии Next Scan программа будет сравнивать значения не с результатом прошлого поиска, а с результатом самого первого:

      681e5958-7dd8-4706-98db-d2edf157989b-изображение.png

      Выберите тип Unchanged value, потому что персонаж стоит в той же позиции что и при первом поиске и произведите отсев:

      d80bc1b4-edf0-4ba1-a5f3-3c81c1085065-изображение.png

      Значений стало меньше, но всё равно ещё слишком много. Не забудьте снять галочку с Compare to first scan когда сдвините персонажа с позиции. Что бы ещё уменьшить их количество, попробуйте сделать что то необычное. Поиск производился для координаты X персонажа, то есть для горизонтального положения, поэтому попробуйте уменьшить другую координату, опустите, или поднимите его:

      74a758f8-439a-4cce-9303-f68e09192dca-изображение.png

      После этого произведите отсев с параметром "не изменившееся":

      a38f3efb-4604-49e6-b4ea-be4fd2b41b05-изображение.png

      Значений стало намного меньше, но всё равно ещё слишком много. Что бы ещё уменьшить их количество, попробуйте увести персонажа далеко вправо от позиции начального поиска:

      44919afa-f3c1-443f-81a5-9fe0c022c487-изображение.png

      И проведите отсев увеличившегося значения:

      ac1fae1e-3748-4773-91e9-a2b7e7e9c56c-изображение.png

      Значений стало ещё меньше, вернитесь в изначальную позицию и произведите отсев уменьшившегося значения:

      b2c4a246-2846-49d2-a556-9ad63f5c9cd2-изображение.png

      db8d5876-0280-4d6a-9ff2-7ce14bd28176-изображение.png

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

      Выберите все значения и добавьте их в таблицу, для этого нажмите на любое значение в окне поиска и нажмите Ctrl+A на клавиатуре что бы выделить все значения, после чего нажмите на красную стрелочку, все значения переместятся в таблицу:

      35c64520-60d8-440e-af0f-098590c74957-изображение.png

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

      6a60ac86-3605-4606-b00c-d1764111336e-изображение.png

      Для того что бы быстро заморозить, или разморозить значения, нажмите пробел находясь в активном окне Cheat Engine:

      661098b0-3ec9-4cfb-a3f8-1761c48c7d1f-изображение.png

      Перейдите в игру и попробуйте переместить персонажа вправо, или влево:

      77382ef4-d68c-4b18-ac6b-849fa86f6045-изображение.png

      Персонаж перемещается, но дёргается небо и облака, значит это не нужные значения. Удалите выделенные значения нажав клавишу Del на клавиатуре, если они вам не нужны, или просто снимите с них заморозку нажав пробел. Выделите следующую группу значений и повторите процедуру.
      Для удобства и быстроты поиска, самый эффективный способ это выделять и замораживать сразу половину от всех значений в таблице, проверять в игре, может ли персонаж перемещаться по X, если искомое значение будет среди них и он не сможет, вы сможете сразу удалить другую половину значений в таблице и повторить процедуру с половиной оставшихся значений:

      a2df2f37-1c98-4709-84ec-0cedb1700f3f-изображение.png

      После нескольких повторений осталось лишь несколько значений:

      01c69901-0d96-41cf-91b6-c8ef69a5090d-изображение.png

      Так как персонаж может перемещаться, значит верхние значения не нужные, удалите их:

      09ded069-939a-414e-9023-ba9b5e6563d0-изображение.png

      Теперь можно поочерёдно замораживая значения и проверяя игру, найти нужное:

      12e02fb5-7135-4b24-8709-5dde714618e9-изображение.png

      Остальные значения можно удалить:

      19220571-bc6c-4bae-9c02-f6d1e30b5264-изображение.png

      Сравним значение в позиции около первого ограничителя и около второго:

      74ae16ea-6bdd-48a5-8c5a-abecb439caa9-изображение.png

      4f34e159-6329-4d81-a50e-60ea7e213f06-изображение.png

      И у второго:

      2fdef773-6e1e-4636-8d8d-3c8aa1733518-изображение.png

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

      Теперь вы можете заметить, что значение координат выглядит странным слишком большим. Можно проверить свои подозрения, попробовав изменить его тип, как программа читает его из памяти, для этого два раза кликните на "4 Bytes" в строке Type, появится окно выбора типа:

      fb67b12e-94ef-451a-bfe1-afdd5cc5f6b5-изображение.png

      Выберите тип float и посмотрите как изменится внешний вид значения:

      bf97e21b-e3ac-41ec-89b4-d7ba9f7e8890-изображение.png

      Посмотрите как оно выглядит в первой и второй позициях:

      4b61e376-1f0b-4577-98f2-80b54c64ab28-изображение.png

      4a046b9d-c6bb-49be-b793-a8c560904d0d-изображение.png

      Теперь оно приняло читаемый вид и можно попробовать вычислить расстояние, которое занимает один блок в игре, посчитав блоки между столбиками и разделив разницу между вторым и первым значением на это количество, получится (51340 - 51280) / 4 (блоков 5, но персонаж занимает 2 блока, потому -1 блок будет 4) = 15
      Для проверки попробуем вычесть из значения около правого столба 30 и записать его, посмотрев, на сколько блоков переместится персонаж, производить арифметические операции можно прямо в строке изменения значения:

      f5eb92f8-2cc6-44f7-a672-696f492a0bf0-изображение.png

      b887140a-6c8a-47ba-887f-fde497a25ff7-изображение.png

      Персонаж переместился ровно на 2 блока влево, значит всё посчитано верно.
      Это было математическое отступление, а теперь нужно найти вторую координату, что бы перемещать персонажа не только вправо и влево, но и вверх и вниз.
      Можно начать новый поиск, но сначала попробуйте добавить значение по адресу расположенное прямо следующим за этим, так как координаты обычно располагаются рядом. Есть разные виды расположения координат, x y, x y z, x z y, и прочие, это двухмерная игра, поэтому стоит попробовать проверить первый тип, для этого продублируйте значение в таблице, выделив его, нажав Ctrl+C и затем Ctrl+V, после того как вы сделаете это, появится окно спрашивающее, как добавить значение:

      00722555-d979-4bbd-aff6-f1ee4b98166a-изображение.png

      В нём можно указать на сколько сместить адрес, чем заменить и прочее, сейчас просто нажмите кнопку Paste ничего не меняя, значение появится в таблице:

      3a0eb440-7acf-43ac-bbdc-24b31ae07009-изображение.png

      Для удобства назовите первое значение "X", для этого кликните дважды на No description и введите свой текст.

      d23655c7-f67e-480e-a16b-786635bc0eaa-изображение.png

      Что бы проверить, находится ли координата Y поблизости, нужно изменить адрес только что добавленной записи. Для этого нажмите на адрес в графе Address второго значения и добавьте к адресу 4, так как тип float занимает 4 байта, а получить нужно значение идущее следующим:

      6c6ef57e-0f90-4185-b715-318a49bbdbbe-изображение.png

      Как только вы введёте + 4, вам станет видно какое значение располагается по этому адресу, если оно выглядит адекватным, тогда можно нажать OK и адрес в таблице изменится. Если бы поиск начинался с Y, тогда для получения X нужно было бы вычитать 4, а не добавлять. Помните что адрес считается в байтах в шестнадцатеричной системе счисления.

      2316201e-df27-4484-8817-e2031411334c-изображение.png

      Для проверки попробуйте изменить значение, например добавив к нему 60 (4 блока):

      eac7cb4c-efb9-4a9c-8495-242b4d6f2011-изображение.png

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

      написал в Базовая информация поиск unknown value
      PromisingP
      Promising
    • Поиск инструкций работающих с адресом

      В теме описанао как найти инструкции работающие с адресом, а так же использование nop для отключения инструкций


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

      af897ad5-b132-4158-8611-c14ae32e0b17-изображение.png

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

      b1f1c6b9-cfc6-4825-b171-00dc6bb7890b-изображение.png

      Когда вы нажмёте на этот пункт, если отладчик не подключен то программа спросит вас, подключить ли отладчик к игре, подтверждайте и увидите вот такое окно:

      e7ebd4a0-92bb-4036-ac3a-410c9453710a-изображение.png

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

      985f4548-30ad-482b-bca5-5fb4d6c58cde-изображение.png

      После этого перейдите в Cheat Engine и посмотрите на инструкции в окне:

      8bf4af4e-22d0-4bf1-957f-ad0c7f58af58-изображение.png

      Появилось две интструкции, описанные в предыдущей статье, первая вычитает из адреса здоровья число находящееся в регистре eax, а вторая увеличивает здоровье на 1.
      Значит, первая инструкция это урон при касании врага, а вторая это инструкция отвечающая за постоянную регенерацию персонажа.
      Что бы прекратить отслеживание новых инструкций нажмите кнопку Stop, после чего добавьте найденные инструкции в лист сохранённых инструкций, что бы в дальнейшем использовать их, для этого выделите обе инструкции таким же способом как выделяете записи в таблице и нажмите кнопку Add to the codelist:

      f1019584-b529-45c5-823c-713887bedbb8-изображение.png

      После нажатия инструкции появятся в новом окне:

      713f2464-8a5f-4c4f-bd50-99b83b6e8575-изображение.png

      Закройте окно поиска инструкций нажав клавишу Close, или крестик:

      a088885b-b35b-4c1c-9bf8-11ef774d11c8-изображение.png

      Теперь вы можете сохранить таблицу в любое удобное для себя место с помощью этой кнопки:

      8b8d2ce9-0a72-4261-b035-7981a6c70b33-изображение.png

      Если вы закроете окно с сохранёнными инструкциями Code List, вы можете снова открыть его, нажав на надпись Advanced options в левом нижнем углу главного окна Cheat Engine:

      36373510-f3ba-4b2d-9a3d-677822d7cc04-изображение.png

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

      Перейдите в окно Code List и выберите инструкцию вычитающую здоровье персонажа:

      c0b35f60-03dc-452c-be8a-8e526a6cb5b5-изображение.png

      Вызовите контекстное меню для неё и выберите "Заменить ничего не делающим кодом" (нопами nop):

      e4232132-067a-49d1-8038-7e70ce31971e-изображение.png

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

      Что бы восстановить инструкцию, снова нажмите на неё вызвав контекстное меню и выберите "Восстановить оригинальный код":

      15cb0564-260a-4908-b86c-9a66bc32133f-изображение.png

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

      написал в Базовая информация assembler nop ноп отладка инструкции
      PromisingP
      Promising
    • Стек

      В этой теме рассказано о том что такое стек потока


      Стек потока представляет собой временное хранилище данных для работы с ними. Данные могут быть помещены в стек и достаны из него с помощью разных инструкций ассемблера. Стек на самом деле является просто выделенной памятью.
      Поток получает странницу памяти представляющую стек при создании и хранит текущее смещение (адрес) стека в регистре esp.
      Изначально стек пустой, то есть имеет нулевые значения. Для взаимодействия со стеком есть специальные инструкции:

      push - Сдвинуть адрес стека (вычесть из esp) и записать в него значение. В 64 битных процессах сдвигает стек на 8 байт, в 32 битных процессах на 4 байта.

      push 5 //Сдвигает стек (значение адреса в esp) и записывает по адресу стека число 5 
      push [адрес] //Тоже самое, но загружает значение из адреса
      push eax //Тоже самое, но загружает значение регистра
      

      pop - Прочитать из стека и сдвинуть адрес стека (добавить к esp) и записать в него значение. Правила такие же как у push по разрядности процессов.

      push 5 
      pop eax //Выгружает из стека число 5 в регистр eax, теперь в нём число 5 
      push 6
      pop [адрес] //Выгружает из стека число 6 по адресу
      

      Использование обычных команд для работы со стеком

      //Аналог push 5, это то что он делает
      sub esp,4
      mov [esp],5
      
      //Аналог pop eax, это то что он делает
      mov eax,[esp]
      add esp,4
      
      //Загрузка и чтение нескольких разных значений из стека
      push 5
      push 4
      push 8
      mov eax,[esp] //eax = 8
      mov ecx,[esp+4] //ecx = 4
      mov ebx,[esp+8] //ebx = 5
      add esp,#12 //Или add esp,C в шестнадцатеричной системе счисления
      
      //Пример замены значения в стеке и выгрузки командой pop
      push 5
      mov [esp],8
      pop eax //eax = 8
      

      В Cheat Engine стек можно увидеть при выполнении отладки процесса, о которой рассказано в следующих статьях.

      написал в Базовая информация стек регистры assembler инструкции
      PromisingP
      Promising