<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Базовая информация]]></title><description><![CDATA[Базовая информация]]></description><link>https://gamehacklab.ru/bb/category/12</link><generator>RSS for Node</generator><lastBuildDate>Tue, 10 Mar 2026 13:45:41 GMT</lastBuildDate><atom:link href="https://gamehacklab.ru/bb/category/12.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Apr 2023 21:00:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[FPU]]></title><description><![CDATA[<h3>О том что такое FPU и его команды, обзор принципов взаимодействия</h3>
<hr />
<p dir="auto">Fpu это математический сопроцессор который позволяет легко работать с числами с плавающей запятой и с обычными числами, совершать операции типа умножения и деления. Он может работать с любыми значениями 4 и 8 байт размера и любыми типами, float, double, int32, int64.<br />
Все операции Fpu производятся в его стеке, в который сначала нужно загрузить значения, после вычислений значения нужно выгрузить если вам нужно получить результат и что бы не портить стек, если вы делаете инъекцию в код игры и она использует fpu.</p>
<p dir="auto">Некоторые команды сопроцессора:</p>
<pre><code class="language-cpp">//Если команда не имеет *, значит она работает с числом в стеке и не принимает переменных.
//Почти все команды могут быть использованы на регистрах стека 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 загружает флаги после команды выше.
</code></pre>
<p dir="auto">Рассмотрим пример использования FPU в скрипте для конвертации в разные типы, из int32 во float и double:</p>
]]></description><link>https://gamehacklab.ru/bb/topic/34/fpu</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/34/fpu</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Thu, 06 Apr 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Синтаксис и команды]]></title><description><![CDATA[<h3>Синтаксис и команды скриптов в Cheat Engine.</h3>
<hr />
<p dir="auto">Скриптовой язык в Cheat Engine в основном позволяет создавать и внедрять в игру ассемблерный код на ходу, и выгружать его из игры восстанавливая оригинальный код.</p>
<p dir="auto">Окно скриптинга может быть открыто через окно отладчика, или сочетанием клавиш <code>Ctrl+A</code> в этом окне:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041275516-aa3d2169-17ba-46a0-8283-610eeac9bb0d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="aa3d2169-17ba-46a0-8283-610eeac9bb0d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После открытия вы увидите следующее окно:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041323309-dc90933e-a171-435d-8681-fc97e5aa4bde-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="dc90933e-a171-435d-8681-fc97e5aa4bde-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В нём можно написать скрипт и нажать кнопку <code>Execute</code> что позволит выполнить скрипт. Что бы добавить скрипт в таблицу и сохранить его, вам сначала нужно добавить в него определённые команды, а именно две команды обозначающие разделы, которые будут выполняться при включении и выключении скрипта <code>[ENABLE]</code> <code>[DISABLE]</code>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041450220-18a14491-4909-4895-b017-9a3a8e5b33e0-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="18a14491-4909-4895-b017-9a3a8e5b33e0-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Эти команды обозначают правила для включения и выключения скрипта. После их добавления можно добавить скрипт в таблицу с помощью контекстного меню:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041512244-e2ab9f5a-ac29-458f-9db2-7d45305ec53b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e2ab9f5a-ac29-458f-9db2-7d45305ec53b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если всё сделано верно, скрипт появится в таблице и окно редактора можно закрыть:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041550604-3549713b-31a9-4a37-a1e6-9651812135a0-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3549713b-31a9-4a37-a1e6-9651812135a0-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь вы можете снова открыть редактор, но уже для конкретно этого скрипта в таблице. Для этого дважды кликните по нему в графе <code>Value</code>, или откройте редактор через контекстное меню:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041615096-8dfbfc3d-4265-41c7-b5c8-6f3a7e013269-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8dfbfc3d-4265-41c7-b5c8-6f3a7e013269-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Откроется редактор для конкретно этого скрипта, вы можете сохранить изменённый скрипт нажав кнопочку <code>OK</code>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678041698906-7ab76f83-bde0-4213-b5b1-28cbcca1d222-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="7ab76f83-bde0-4213-b5b1-28cbcca1d222-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Основные команды которые могут пригодиться:</p>
<p dir="auto">Запись данных по адресу, необходимо указывать <a href="https://gamehacklab.ru/bb/topic/11">размерность</a>:</p>
<pre><code>//db - byte
//dw - word
//dd - dword
//dq - qword

(Адрес):
db/dw/dd/dq(размерность) (число)

//Пример, записать по адресу 0087745A подряд 12 байт, сначала 0, дальше 5, потом 7.

0087745A:
dd 0 5 7

//Пример, записать по адресу метки label подряд 4 байта 1, 7, 10, 2

label:
db 1 7 A 2
</code></pre>
<p dir="auto">Каждая метка обозначает после себя регион памяти все метки в котором будут относиться к ней, если они уже не определены в другом месте, или не являются настоящим адресом.</p>
<pre><code>//По адресу 0087745A располагается метка label, метка label нигде не определена, 
//значит она определяется и обозначается как место в скрипте после добавления. 
//Таким образом в данном примере label идёт в зоне 0087745A, сразу после него и указывает на тоже самое место, 
//то есть далее использовать label будет тоже самое что указать 0087745A:

0087745A:
label:
dd 0

//В следующем примере, указано что после 0087745A выделено 4 байта со значением 0, 
//зарезервировано командой dd 0, получается, метка будет указывать на следующие 4 байта после первых идущих в 0087745A:

0087745A:
dd 0
label:
dd 0
</code></pre>
<p dir="auto">Метка может быть зарегистрирована в текущем скрипте, или даже объявлена глобально для использования из других скриптов.<br />
<code>label(lack)</code> зарегистрировать метку lack для текущего скрипта.<br />
<code>registersymbol(lack)</code> зарегистрировать метку lack глобально.<br />
<code>unregistersymbol(lack)</code> снять регистрацию с метки lack, обычно используется в секции <code>[DISABLE]</code>.</p>
<p dir="auto">Пример скрипта, который записывает при включении по адресу 0087745A число float 4 байта 5, а при выключении int32 0:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678042943340-6a28906b-91b1-4705-8723-eb71d17e7f3a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="6a28906b-91b1-4705-8723-eb71d17e7f3a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">С помощью скрипта вы можете легко выделить память и записать в неё значения. Выделяется память с помощью команды <code>alloc(newmem, 1000)</code>, эта команда выделяет новую память как минимум размером 1000 и создаёт для неё метку newmem, которая аналогична адресу выделенной памяти.</p>
<p dir="auto">Пример скрипта в котором выделяется новая память и в неё записывается значение, после выключения скрипта память освобождается командой <code>dealloc(newmem)</code>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678043204307-0587b40e-a7b4-48ce-82f9-d96514d6d49c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="0587b40e-a7b4-48ce-82f9-d96514d6d49c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Мы можем зарегистрировать newmem что бы получить возможность добавить эту метку как адрес в таблицу и увидеть значение:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678043272105-b11f6e64-bb52-40f6-a153-d2eed90574af-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b11f6e64-bb52-40f6-a153-d2eed90574af-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Добавьте адрес newmem в таблицу, нажав на кнопку <code>Add Address Manually</code>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678043353435-8f3006e6-3215-494d-b885-53061d0a6d72-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8f3006e6-3215-494d-b885-53061d0a6d72-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678043377327-b027a2c5-e3cf-489f-b746-2308e7aca1c3-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b027a2c5-e3cf-489f-b746-2308e7aca1c3-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Включите скрипт нажав на квадратик слева от него, если всё сделано верно вы увидите значение записанное в память, не забудьте что Cheat Engine должен быть подключён к какому то процессу:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678043433159-a191fe28-9104-466d-9804-ff62d53e3ea8-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a191fe28-9104-466d-9804-ff62d53e3ea8-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Значение float, измените его тип дважды кликнув на <code>4 Bytes</code> в столбике <code>Type</code> что бы оно отображалось корректно:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1678043483724-c9687ac4-c521-46f7-89d8-caf560d90eae-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c9687ac4-c521-46f7-89d8-caf560d90eae-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Более продвинутые команды и примеры скриптов рассмотрены в следующих статьях.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/39/синтаксис-и-команды</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/39/синтаксис-и-команды</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Sun, 05 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Cheat Engine]]></title><description><![CDATA[<h3>Cheat Engine - универсальный инструмент для отладки</h3>
<h4>В этой статье описаны особенности программы и установка.</h4>
<hr />
<p dir="auto">Cheat Engine, переводится как Чит Двигатель, Двигатель Обмана, и является по аналогии с игровыми "движками" инструментом для создания читов, cheat - значит обманывать (англ).</p>
<p dir="auto">Это самая продвинутая и многопрофильная программа из существующих в этой области на данных момент, позволяющая изменять игры и приложения как угодно, если у вас достаточно знаний.<br />
Хотите добавить новые правила в игру, изменить существующие, или просто сделать что бы пшеница на вашей виртуальной ферме росла быстрее? Всё это позволяет данная программа, но этим её возможности не ограничиваются.<br />
Для профессиональных программистов данная программа может послужить отличным отладчиком, позволяя найти проблему в чужом, или своём продукте и исправить её на лету.<br />
Как и другие подобные программы, эта так же позволяет исследовать код игры для дальнейших его модификаций и изменений извне (например, с помощью программ написанных на высокоуровневых языках, таких как C#, или С++).<br />
Программа имеет поддержку lua и позволяет автоматизировать многие действия внутри себя с его помощью, поддерживаются плагины написанные на lua, которые могут включать dll написанные на других языках.</p>
<p dir="auto">Скачать программу можно с <a href="https://cheatengine.org/" target="_blank" rel="noopener noreferrer nofollow ugc">официального сайта</a>, она распространяется бесплатно, если при установке возникают проблемы, стоит отключить антивирус, некоторые антивирусы и стандартный защитник windows (только на windows 10+) удаляет файлы программы при установке и установщик навечно зависает.<br />
Интерфейс программы на английском, хотя бы минимальное понимание желательно, но есть неофициальные русификаторы, ссылки на которые приведены не будут, потому что часто эти русификаторы вызывают проблемы в работе программы.<br />
Для работы программа при каждом запуске будет требовать повышения прав, что бы иметь возможность внедряться в чужие процессы.<br />
При первом запуске появляется предложение пройти туториал и указать данные для автоматической публикации ваших работ на официальном форуме программы, которые можно пропустить. Если вы понимаете английский, стоит пройти туториал, он очень информативный и простой.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/9/cheat-engine</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/9/cheat-engine</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Оглавление]]></title><description><![CDATA[<h3>С чего начать новичку</h3>
<hr />
<h4>Статья содержит информационное-оглавление полезное для новичков, разделы расположены в последовательном порядке.</h4>
<hr />
<ul>
<li>Инструменты:
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/9">Cheat Engine</a></li>
<li><a href="https://gamehacklab.ru/bb/topic/10">Process Monitor</a></li>
</ol>
</li>
<li>Отладка приложения:
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/11">Типы данных</a>
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/13">Поиск значения</a></li>
<li><a href="https://gamehacklab.ru/bb/topic/15">Поиск неизвестного значения</a></li>
<li><a href="https://gamehacklab.ru/bb/topic/16">Хоткеи для значений</a></li>
</ol>
</li>
<li><a href="https://gamehacklab.ru/bb/topic/18">Инструкции ассемблера и регистры процессора</a>
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/19">Поиск инструкций работающих с адресом</a></li>
<li><a href="https://gamehacklab.ru/bb/topic/22">Изменение инструкций ассемблера</a></li>
</ol>
</li>
<li><a href="https://gamehacklab.ru/bb/topic/24">Память процесса</a></li>
<li><a href="https://gamehacklab.ru/bb/topic/28">Потоки</a>
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/32">Стек</a></li>
</ol>
</li>
<li><a href="https://gamehacklab.ru/bb/topic/33">Функции</a></li>
</ol>
</li>
<li>Создание скриптов autoassembler:
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/39">Синтаксис и команды</a></li>
<li><a>Выделение памяти и инъекция кода</a></li>
<li><a>Выбор места для инъекции кода</a></li>
<li><a>AOBScan и динамическая инъекция</a></li>
<li><a>Создание и возврат нового потока</a></li>
<li><a>Вызов существующей функции</a></li>
</ol>
</li>
<li>Числа с плавающей запятой:
<ol>
<li><a href="https://gamehacklab.ru/bb/topic/34">FPU</a></li>
</ol>
</li>
</ul>
]]></description><link>https://gamehacklab.ru/bb/topic/8/оглавление</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/8/оглавление</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Функции]]></title><description><![CDATA[<h3>В этой статье описано что такое функции</h3>
<hr />
<p dir="auto">Функциями в ассемблере называются участки кода, на которые поток может переместиться и после выполнения вернуться с помощью специальной команды <code>ret</code> не используя jmp на конкретный адрес. Таким образом функции могут быть вызваны из любого места что делает их универсальными.</p>
<p dir="auto">Для перемещения в функцию используется команда <code>call</code>, для возврата из функции команда <code>ret</code>. Значение результата функции обычно передаётся через регистр eax, то есть функция заполняет его значением результата, но может и любым другим способом.</p>
<p dir="auto"><code>call</code> - Вычитает из адреса стека 4, или 8 (в зависимости от разрядности приложения) и записывает по этому адресу адрес инструкции следующей за инструкцией <code>call</code>, после чего перемещает поток по адресу который был передан.</p>
<pre><code>call eax //Перемещает поток на адрес находящийся в eax
</code></pre>
<p dir="auto"><code>ret</code> - Берёт значение адреса (или любое) находящееся по адресу стека и перемещает на него поток, после чего добавляет к адресу стека 4, или 8.<br />
Если у инструкции есть аргумент в виде числа, тогда дополнительно сдвигает стек после переноса потока по адресу.<br />
Например, по стандарту ret должен был сдвинуть 4 байта, но это была инструкция <code>ret 8</code> и в итоге ret сдвинет стек (добавит к адресу стека в esp) на 12 байт.</p>
<pre><code>ret //Простой
ret 8 //С дополнительным сдвигом
</code></pre>
<p dir="auto">Пример функции "fo" без аргументов которая всегда возвращает значение 16:</p>
<pre><code>fo:
 mov eax,5
 mov ecx,#11
 add ecx,eax
 mov eax,ecx
 ret
</code></pre>
<p dir="auto">Пример "fo2" функции с аргументами, которая принимает через стек 2 аргумента и складывает их, после чего возвращает значение результата через регистр eax и убирает из стека помещённые значения:</p>
<pre><code>//После вызова с помощью call в [esp] находится адрес куда вернуться потоку, в [esp+4] и [esp+8] находятся аргументы.
fo2: 
 mov eax,[esp+4] 
 add eax,[esp+8]
 ret 8
</code></pre>
<p dir="auto">Пример вызова функции "fo2" с аргументами:</p>
<pre><code>push 9 //Загрузка первого аргумента
push 7 //Загрузка второго аргумента
call fo2
// Теперь в eax находится число 16
</code></pre>
<p dir="auto">Подробнее про вызов функций рассказано в следующих статьях</p>
]]></description><link>https://gamehacklab.ru/bb/topic/33/функции</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/33/функции</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Стек]]></title><description><![CDATA[<h3>В этой теме рассказано о том что такое стек потока</h3>
<hr />
<p dir="auto">Стек потока представляет собой временное хранилище данных для работы с ними. Данные могут быть помещены в стек и достаны из него с помощью разных инструкций ассемблера. Стек на самом деле является просто <a href="https://gamehacklab.ru/bb/topic/24">выделенной памятью</a>.<br />
Поток получает странницу памяти представляющую стек при создании и хранит текущее смещение (адрес) стека в <a href="https://gamehacklab.ru/bb/topic/18">регистре</a> esp.<br />
Изначально стек пустой, то есть имеет нулевые значения. Для взаимодействия со стеком есть специальные инструкции:</p>
<p dir="auto"><code>push</code> - Сдвинуть адрес стека (вычесть из esp) и записать в него значение. В 64 битных процессах сдвигает стек на 8 байт, в 32 битных процессах на 4 байта.</p>
<pre><code>push 5 //Сдвигает стек (значение адреса в esp) и записывает по адресу стека число 5 
push [адрес] //Тоже самое, но загружает значение из адреса
push eax //Тоже самое, но загружает значение регистра
</code></pre>
<p dir="auto"><code>pop</code> - Прочитать из стека и сдвинуть адрес стека (добавить к esp) и записать в него значение. Правила такие же как у push по разрядности процессов.</p>
<pre><code>push 5 
pop eax //Выгружает из стека число 5 в регистр eax, теперь в нём число 5 
push 6
pop [адрес] //Выгружает из стека число 6 по адресу
</code></pre>
<p dir="auto">Использование обычных команд для работы со стеком</p>
<pre><code>//Аналог 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
</code></pre>
<p dir="auto">В Cheat Engine стек можно увидеть при выполнении отладки процесса, о которой рассказано в следующих статьях.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/32/стек</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/32/стек</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Потоки]]></title><description><![CDATA[<h3>В этой теме описывается что такое потоки в общих чертах</h3>
<hr />
<p dir="auto">Потоками называются сущности исполняющие машинный код в участках памяти приложения, одно приложение может иметь множество одновременно работающих потоков, исполняющих код в разных местах.<br />
У каждого потока есть стек и собственные значения в регистрах. Стек и регистры служат для временного хранения данных для удобной их обработки. Стек находится в выделенной памяти приложения и у каждого потока он свой.</p>
<p dir="auto">Потоки виртуальны, то есть они не привязаны и не ограничены количеством ядер процессора и прочим, может существовать сколько угодно потоков, пока они влезают в ограничения по памяти выделяемой для приложения.</p>
<p dir="auto">В Cheat Engine посмотреть список работающих потоков можно в окне отладчика через меню <strong>View</strong>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676968339947-ac6ca786-1192-449e-91f0-dbcef87c9bc3-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="ac6ca786-1192-449e-91f0-dbcef87c9bc3-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого появится окно отображающие потоки, у каждого потока можно развернуть выпадающий список и посмотреть на контекст этого потока, контекстом называются его регистры и флаги:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676968410584-112db97a-9d6f-4cbd-925e-fafcf6d09951-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="112db97a-9d6f-4cbd-925e-fafcf6d09951-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Потоки имеют числовой идентификатор по которому они могут быть найдены, закрыты, заморожены, и тому подобное.</p>
<p dir="auto">С помощью Cheat Engine вы можете создать новый поток для выполнения своего кода. <a href="https://gamehacklab.ru/bb/topic/24">Выделим память</a> и напишем там простую функцию, о функциях подробнее будет рассказано в следующих статьях:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676968673297-244b0ee6-e269-4fcd-990d-145cf1b9014a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="244b0ee6-e269-4fcd-990d-145cf1b9014a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Код задан, этот код берёт число 5, добавляет его к самому себе, увеличивает на 1 и вычитает из результата 4, результат записывается по адресу <code>08600000</code>. В нижнем окне показано текущее значение адреса, оно является нулевым. Что бы код выполнился нужно вызвать поток на него. Так как это функция, она имеет команду <code>ret</code> что бы поток вернулся после выполнения.<br />
Для создания потока, выделите первую команду функции и в меню инструментов выберите создание потока:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676968861874-1236e201-4bbd-4a34-afd7-fee191565688-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="1236e201-4bbd-4a34-afd7-fee191565688-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Вас спросят на каком адресе создать поток, если вы выделили определённую инструкцию, адрес автоматически подставится в это окно:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676968917883-e8aa664b-89c3-4764-92ea-bd2336f55a50-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e8aa664b-89c3-4764-92ea-bd2336f55a50-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого появится окно с вопросом какой параметр задать потоку перед запуском, который попадёт в регистры. Оставьте его 0, в данном коде не нужно задавать предварительные значения регистрам:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676969010410-c1b9647c-968e-4f8e-9be0-79e1d886be5f-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c1b9647c-968e-4f8e-9be0-79e1d886be5f-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После того как вы подтвердите создание потока, он выполнит функцию и вернётся, значение в адресе изменится:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676969055891-0ed5ea7a-6357-458b-bded-f5eb00a6adf9-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="0ed5ea7a-6357-458b-bded-f5eb00a6adf9-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Так как значение находится рядом с инструкциями, верхнее окно попыталось распознять в нём инструкции и создало непонятную мешанину. Для того что бы исправить отображение просто перейдите на адрес начала функции используя стрелочки на клавиатуре для точной корректировки позиции, или укажите адрес самостоятельно нажав <code>Ctrl+G</code>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676969156561-79a6c20a-cc9f-48ef-a190-d66024fbc6b3-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="79a6c20a-cc9f-48ef-a190-d66024fbc6b3-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Создание потоков может быть автоматизировано с помощью команд скриптинга, которые рассмотрены в следующих статьях.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/28/потоки</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/28/потоки</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Память процесса]]></title><description><![CDATA[<h3>В этой статье описывается общее устройство того как процесс использует память</h3>
<hr />
<p dir="auto">Весь код процесса выполняется в его памяти, память процесса это выделенная область в оперативной памяти компьютера, которая может изменять свой размер динамически и начинается с загрузки .exe файла процесса при его запуске.<br />
Память выделяется страницами, обычно минимальный размер страницы на windows это <code>4096 байт</code>, то есть меньше этого значения быть не может при выделении. Когда выделяется память, просто говоря - для процесса резервируется больший участок в оперативной памяти.<br />
У памяти бывают разные типы защиты, этим определяются типы памяти, которые могут быть использованы для сужения региона поиска в Cheat Engine, настройки предоставлены здесь:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676797417217-a9a009f1-6354-4807-9f50-d114f3e81acb-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a9a009f1-6354-4807-9f50-d114f3e81acb-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В полях сверху можно указать начальный адрес поиска и конечный, между которыми будет осуществляться поиск, а ниже можно указать типы памяти среди которых будет вестись поиск. Галочка означает что поиск будет вестись только по этому типу, отсутствие галочки - только без этого типа, а с квадратиком - и в том типе и в этом. Все регионы памяти могут иметь несколько типов защиты одновременно, основные типы защиты памяти:</p>
<p dir="auto"><strong>Writable</strong> память - записываемая, та, которая позволяет записывать в себя новую информацию заменяя старую, обычно в этой памяти хранятся изменяемые значения.</p>
<p dir="auto"><strong>Executable</strong> память - исполняемая, та, которая исполняется потоками проходящими по ней, в которой хранятся машинные коды, которые отображаются как ассемблерные инструкции, обычно она не Writable, но если приложение генерирует исполняемые инструкции на лету, как например Java приложения, тогда она будет Writable.</p>
<p dir="auto"><strong>Readable</strong> память - читаемая, та, которая может быть прочитана. Этот флаг есть почти у всех регионов памяти.</p>
<p dir="auto">Подробнее про <strong>CopyOnWrite</strong> можно прочитать <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8" target="_blank" rel="noopener noreferrer nofollow ugc">здесь</a>.</p>
<p dir="auto">Если поток попытается сделать операцию с памятью которая не позволяет этого из за своего типа защиты, приложение будет закрыто с ошибкой. Помните об этом в дальнейшем. Посмотреть тип текущей страницы памяти с которой вы работаете можно через Cheat Engine, в нижней части окна отладчика:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676798032769-e99bdcf5-e2a4-43b3-8468-579fd0e240b4-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e99bdcf5-e2a4-43b3-8468-579fd0e240b4-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Положение верхнего и нижнего окна (отслеживаемый адрес) не связаны, поэтому не забывайте перейти по адресу в нижнем окне на адрес верхнего, если вам нужно и не запутайтесь в них. Нижнее окно показывает значения, тип значений может быть изменён через контекстное меню:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676798135181-ab83bc9f-bfdf-4d58-bca5-1b3c43b190d0-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="ab83bc9f-bfdf-4d58-bca5-1b3c43b190d0-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Верхнее показывает машинные коды преобразованные в ассемблерные инструкции.</p>
<p dir="auto">Вы можете выделить новую страницу в памяти процесса для своих нужд, сделать это можно через меню инструментов:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676798244157-8a7aea6f-8869-4e96-92be-7a9edd176bdc-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8a7aea6f-8869-4e96-92be-7a9edd176bdc-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После выделения памяти через Cheat Engine, она будет иметь разрешения и на запись, и на чтение, и на исполнение, вы можете делать что угодно в этой памяти:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676798362786-05e61fd5-be11-42d0-b977-44a3de6a561f-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="05e61fd5-be11-42d0-b977-44a3de6a561f-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><strong>Size</strong> на изображении указан 1000, это 4096 в шестнадцатеричной системе счисления, потому что для примера я выделила одну страницу памяти.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/24/память-процесса</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/24/память-процесса</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Изменение инструкций ассемблера]]></title><description><![CDATA[<h3>В этой статье описывается процесс изменения инструкций автоассемблера на другие</h3>
<hr />
<p dir="auto">В статье использованы инструкции найденные в <a href="https://gamehacklab.ru/bb/topic/19">предыдущей статье</a>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676716469369-407abc0f-7b3a-492b-b6aa-0c8440fad377-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="407abc0f-7b3a-492b-b6aa-0c8440fad377-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Загрузите сохранённую таблицу Cheat Engine и подключите его к игре. Если инструкции в вашей игре статичные и не изменились, то вам не нужно искать их снова. Откройте code list и проверьте инструкции, заменив их нопами и восстановив.<br />
Для того что бы изменять инструкции, нужно открыть их в окне отладчика, сделать это можно через контекстное меню, или дважды кликнув по ним:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676716611539-4b0282f6-574f-43a6-b00c-6fe4860c9da1-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4b0282f6-574f-43a6-b00c-6fe4860c9da1-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого появится окно отладчика с подробностями:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676716995928-eda1c388-c11c-444a-9c47-9145d74e3000-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="eda1c388-c11c-444a-9c47-9145d74e3000-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Вы можете заметить что сверху и слева в этой игре Cheat Engine распознал адрес функции и смещение до текущей инструкции от начала функции. Если вы хотите сохранить этот адрес для дальнейшего использования, нажмите на нужную инструкцию второй кнопкой мыши для вызова контекстного меню и выберите там:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676717174581-9ef25661-9a63-48fc-88be-44984144c53c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="9ef25661-9a63-48fc-88be-44984144c53c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого в буфере обмена окажется <code>Terraria.Player::Hurt+1201</code>, вы можете записать это в удобное место и в дальнейшем перейти на этот адрес в окне отладчика нажав <code>Ctrl+G</code>, или через контекстное меню.</p>
<p dir="auto">Для изменения инструкции дважды кликните на неё, откроется окно редактирования:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676717276029-fdb72a7d-4f40-4a0e-9003-b9a107a73814-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="fdb72a7d-4f40-4a0e-9003-b9a107a73814-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если вы читали <a href="https://gamehacklab.ru/bb/topic/18">статью о командах ассемблера</a>, то скорее всего понимаете что делает эта инструкция, она вычитает из значения здоровья персонажа число находящееся в регистре eax, то есть в eax находится урон нанесённый персонажу.<br />
Если вы измените sub на add, тогда персонаж будет лечиться вместо получения урона, для наглядности попробуйте изменить её на mov, тогда персонаж будет получать здоровье равное значению полученного урона:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676717450920-949fb5f8-fb01-44f4-8b37-d5e9ee2b8f30-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="949fb5f8-fb01-44f4-8b37-d5e9ee2b8f30-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в игру и посмотрите на результат:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676717478086-c54c0bcf-500b-48ad-a2f1-0ff1cc5e73c1-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c54c0bcf-500b-48ad-a2f1-0ff1cc5e73c1-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Получив 1 урона, персонаж получил 1 здоровье:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676717521492-b4781112-c588-4434-b263-4def47e68a4c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b4781112-c588-4434-b263-4def47e68a4c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Восстановите оригинальную инструкцию заменив mov на sub.<br />
Таким образом вы можете изменять одну линию в коде, если создаваемый вами код больше чем оригинальная инструкция, он займёт место следующей и Cheat Engine спросит, заменить ли оставшуюся часть от инструкции nop, если вы не замените, то скорее всего получите ошибку игры, из за неправильных инструкций. Если ваш код меньше - тогда выбирайте замену нопами, если вы восстанавливаете оригинальную инструкцию из меньшей и дальше уже есть нопы, отказывайтесь от замены нопами, что бы код восстановился полностью.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/22/изменение-инструкций-ассемблера</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/22/изменение-инструкций-ассемблера</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Поиск инструкций работающих с адресом]]></title><description><![CDATA[<h3>В теме описанао как найти инструкции работающие с адресом, а так же использование nop для отключения инструкций</h3>
<hr />
<p dir="auto">Для начала вам понадобится значение, для которого вы хотите выполнить поиск инструкций, возьмём значение здоровья персонажа найденное в <a href="https://gamehacklab.ru/bb/topic/13">статье по поиску значения</a>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676547293087-af897ad5-b132-4158-8611-c14ae32e0b17-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="af897ad5-b132-4158-8611-c14ae32e0b17-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Cheat Engine предоставляет два вида обнаружения инструкций, по обращению и по записи. По записи - это те инструкции которые записывают в адрес значение, например уменьшают здоровье персонажа при получении урона. По обращению - это все инструкции, и те что записывают и те что читают, например инструкция считывающая значение что бы нарисовать его на экране в виде сердечек.<br />
Для поиска на запись, вызовите контекстное меню, кликнув на значение в таблице второй кнопкой мыши и выберите этот пункт, или нажмите F6 выделив элемент в таблице:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676547499868-b1f1c6b9-cfc6-4825-b171-00dc6bb7890b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b1f1c6b9-cfc6-4825-b171-00dc6bb7890b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Когда вы нажмёте на этот пункт, если отладчик не подключен то программа спросит вас, подключить ли отладчик к игре, подтверждайте и увидите вот такое окно:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676547650446-e7ebd4a0-92bb-4036-ac3a-410c9453710a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e7ebd4a0-92bb-4036-ac3a-410c9453710a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Это окно будет ожидать записи по адресу и показывать что записало в него. Для того что бы там появились новые инструкции, перейдите в игру и измените значение здоровья персонажа, полуичв урон, или вылечившись:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676547759859-985f4548-30ad-482b-bca5-5fb4d6c58cde-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="985f4548-30ad-482b-bca5-5fb4d6c58cde-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого перейдите в Cheat Engine и посмотрите на инструкции в окне:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676547797523-8bf4af4e-22d0-4bf1-957f-ad0c7f58af58-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8bf4af4e-22d0-4bf1-957f-ad0c7f58af58-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Появилось две интструкции, описанные в <a href="https://gamehacklab.ru/bb/topic/18">предыдущей статье</a>, первая вычитает из адреса здоровья число находящееся в регистре eax, а вторая увеличивает здоровье на 1.<br />
Значит, первая инструкция это урон при касании врага, а вторая это инструкция отвечающая за постоянную регенерацию персонажа.<br />
Что бы прекратить отслеживание новых инструкций нажмите кнопку <strong>Stop</strong>, после чего добавьте найденные инструкции в лист сохранённых инструкций, что бы в дальнейшем использовать их, для этого выделите обе инструкции таким же способом как выделяете записи в таблице и нажмите кнопку <strong>Add to the codelist</strong>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548054497-f1019584-b529-45c5-823c-713887bedbb8-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="f1019584-b529-45c5-823c-713887bedbb8-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После нажатия инструкции появятся в новом окне:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548142047-713f2464-8a5f-4c4f-bd50-99b83b6e8575-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="713f2464-8a5f-4c4f-bd50-99b83b6e8575-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Закройте окно поиска инструкций нажав клавишу <strong>Close</strong>, или крестик:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548237456-a088885b-b35b-4c1c-9bf8-11ef774d11c8-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a088885b-b35b-4c1c-9bf8-11ef774d11c8-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь вы можете <strong>сохранить таблицу</strong> в любое удобное для себя место с помощью этой кнопки:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548305044-8b8d2ce9-0a72-4261-b035-7981a6c70b33-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8b8d2ce9-0a72-4261-b035-7981a6c70b33-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если вы закроете окно с сохранёнными инструкциями Code List, вы можете снова открыть его, нажав на надпись <strong>Advanced options</strong> в левом нижнем углу главного окна Cheat Engine:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548388348-36373510-f3ba-4b2d-9a3d-677822d7cc04-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="36373510-f3ba-4b2d-9a3d-677822d7cc04-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В большинстве игр инструкции находятся на статических адресах и после перезапуска игры сохраняются, таким образом вам не придётся заново искать значения что бы найти их.</p>
<p dir="auto">Перейдите в окно Code List и выберите инструкцию вычитающую здоровье персонажа:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548523143-c0b35f60-03dc-452c-be8a-8e526a6cb5b5-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c0b35f60-03dc-452c-be8a-8e526a6cb5b5-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Вызовите контекстное меню для неё и выберите "Заменить ничего не делающим кодом" (нопами nop):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548565742-e4232132-067a-49d1-8038-7e70ce31971e-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e4232132-067a-49d1-8038-7e70ce31971e-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в игру и проверьте, уменьшается ли здоровье персонажа при уроне от тех же источников. Если нет, значит вы всё сделали правильно. В отличии от заморозки, замена нопами полностью отключает действие инструкции, таким образом здоровье персонажа больше не будет уменьшаться при получении урона от врагов.</p>
<p dir="auto">Что бы восстановить инструкцию, снова нажмите на неё вызвав контекстное меню и выберите "Восстановить оригинальный код":</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676548792674-15cb0564-260a-4908-b86c-9a66bc32133f-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="15cb0564-260a-4908-b86c-9a66bc32133f-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Таким образом вы можете предотвратить изменение значений и вам не нужно каждый раз заново искать значение. О более продвинутых операциях с инструкциями описано в следующих статьях.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/19/поиск-инструкций-работающих-с-адресом</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/19/поиск-инструкций-работающих-с-адресом</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Инструкции ассемблера и регистры процессора]]></title><description><![CDATA[<h3>В теме рассматриваются простые команды ассемблера, принцип работы и основные регистры процессора</h3>
<hr />
<p dir="auto">Как написано в статье про <a href="https://gamehacklab.ru/bb/topic/11">типы данных</a>, для компьютера всё состоит из едениц и нулей в выделенных областях памяти, исполняемый код не исключение, он состоит из байтов и может называться байткодом.<br />
Компьютер выполняет вычисления указанные в байтовом коде и любая запущенная программа состоит из него. Написанная на любом языке программа в итоге конвертируется в байткод перед выполнением.</p>
<p dir="auto">Человеко-читаемое отображение байткода - ассемблер. Отладчик может прочитать байткод и показать его в виде ассемблерных инструкций, понятных человеку, а так же может давать возможность изменять этот код прямо в работающей программе, что бы корректировать указания даваемые компьютеру.<br />
Cheat Engine обладает этими функциями и прежде чем они будут разобраны, изучите основные команды, регистры и структуру автоассемблера используемого Cheat Engine.</p>
<p dir="auto"><strong>Регистры:</strong><br />
Регистры процессора представляют собой временное хранилище данных для быстрой обработки и вычислений, вычисления большинства команд могут производиться только с регистрами, то есть выражение должно включать в себя регистр. Регистры состоят из частей, например регистр eax вмещает в себя 4 байта, 32 бита и состоит из нескольких частей:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676529450479-eb6efdde-8fd7-49ce-bbf0-4ef1392f82bd-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="eb6efdde-8fd7-49ce-bbf0-4ef1392f82bd-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Как показано на этой картинке, регистр <code>eax</code> состоит из первой части, где 16 бит не обозначены отдельным подрегистром, и регистра <code>AX</code>, размером 16 бит, как вы помните (2 байта), который в свою очередь состоит из двух частей по 8 бит (1 байт) <code>AH</code> и <code>Al</code>.<br />
Данная информация нужна для понимания если вам нужно работать с разноразмерными значениями, но в основном вам будут встречаться значения размером 4 и 8 байт, <code>rax</code> это 64 битная версия регистра <code>eax</code> которая вмещает 8 байт и бывает в 64 битных приложениях.</p>
<p dir="auto">Основные регистры следующие, с указанием размера в байтах:</p>
<pre><code>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
</code></pre>
<p dir="auto">В дальнейшем использовать для временного хранения данных вам следует все кроме ebp и esp, так как эти регистры могут использоваться для взаимодействия со стеком, о котором будет рассказано позже.<br />
Помните что использовать 8 байтовые регистры можно только в приложениях 64 бит. Регистры имеют осмысленные названия, например ESP - Extended Stack Pointer (Расширенный указатель на стек). Расширенный он, грубо описывая, потому что архитектура эволюционировала постепенно, было 16 бит, существовал только SP, разработали 32 бит, добавили ещё 2 байта вперёд и так далее.<br />
Подробнее про эти регистры можно почитать на английском <a href="https://www.tutorialspoint.com/assembly_programming/assembly_registers.htm" target="_blank" rel="noopener noreferrer nofollow ugc">тут</a>.</p>
<p dir="auto"><strong>Команды ассемблера:</strong><br />
Команды ассемблера используются для операций со значениями расположенными в регистрах и памяти приложения.<br />
Основные команды с синтаксисом Cheat Engine autoassembler которые пригодятся для понимания следующих статей, с примерами:</p>
<p dir="auto"><code>mov</code> - переместить (скопировать) данные</p>
<pre><code class="language-css">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 [адрес], [адрес] //Не правильно и работать НЕ БУДЕТ, все двойные операции только с регистрами.
</code></pre>
<p dir="auto"><code>add</code> - добавить</p>
<pre><code>mov eax, 5
mov ecx, 4
add eax, ecx //Добавить ecx к eax, после этого eax = 9
add [адрес], eax //Добавить к значению по адресу eax 4 байта
</code></pre>
<p dir="auto"><code>sub</code> - вычесть</p>
<pre><code>mov eax, 5
mov ecx, 4
sub eax, ecx //Вычесть из eax ecx, после этого eax = 1
sub [адрес], eax //Вычесть из значения по адресу eax 4 байта
</code></pre>
<p dir="auto"><code>inc</code> - увеличить на 1<br />
<code>dec</code> - уменьшить на 1</p>
<pre><code>inc [адрес] //Увеличить значение по адресу на 1
dec eax //Уменьшить eax на 1
</code></pre>
<p dir="auto"><code>mul</code> - умножить, использует регистры и операнд. Регистр eax умножается на операнд и результат помещается в eax, остаток помещается в edx</p>
<pre><code>mov eax, 5
mov ecx, 4
mul ecx //Результат, eax = 20, edx = 0
</code></pre>
<p dir="auto"><code>div</code> - разделить, использует регистры и операнд. Значение из двух частей в eax:edx (записывайте edx 0 если хотите делить значение в рамках размерности 4 байт) делится на операнд и результат помещается в eax, остаток помещается в edx</p>
<pre><code>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
</code></pre>
<p dir="auto"><code>xor</code> - побитовое <a href="https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%8E%D1%89%D0%B5%D0%B5_%C2%AB%D0%B8%D0%BB%D0%B8%C2%BB" target="_blank" rel="noopener noreferrer nofollow ugc">исключающее ИЛИ</a>, но для начала достаточно знать что это команда часто используется для обнуления регистров компиляторами, сравнивая их самих с собой, так как она обычно занимает меньше байткода чем например <code>mov eax, 0</code></p>
<pre><code>mov eax, 5
xor eax, eax //eax = 0

mov rax, 8
xor rax, rax //rax = 0
</code></pre>
<p dir="auto"><code>lea</code> - получить адрес значения, вместо него самого, может использоваться во многих ситуациях и вычислениях с регистрами, некоторые будут рассмотрены в следующих статьях.</p>
<pre><code>//Допустим адрес = A040D8, значение по адресу 5
mov eax, [адрес] //eax = 5
lea eax, [адрес] //eax = A040D8
</code></pre>
<p dir="auto"><code>nop</code> - ничего не делающая инструкция, занимает место 1 байт, или столько, сколько указано, эта инструкция может быть использована для замены на неё других инструкций, что бы отключить их выполнение, в следующих статьях есть примеры.</p>
<pre><code>nop //Ничего не произошло, занимает 1 байт
nop 5 //Ничего не произошло, занимает 5 байт
</code></pre>
<p dir="auto"><a href="https://wiki.cheatengine.org/index.php?title=Assembler:Commands" target="_blank" rel="noopener noreferrer nofollow ugc">Справочник со всеми командами на английском</a></p>
<p dir="auto"><strong>Структура выполнения кода:</strong><br />
Байткод выполняется последовательно, ассемблерные инструкции тоже. Поток проходит по порядку с инструкции на инструкцию и выполняет их. Его положение может быть изменено с помощью некоторых команд, специальный регистр <code>EIP</code> отображает положение потока, текущий адрес на котором он находится:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676534808909-aa3b6288-bc38-4b8c-ab6c-cff0d9e0c83e-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="aa3b6288-bc38-4b8c-ab6c-cff0d9e0c83e-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Скриншот из отладчика Cheat Engine. В этом примере можно заметить, слева адрес инструкции, дальше байты инструкции (байткод), а справа интерпретация в виде ассемблерного кода который можно прочитать.<br />
Инструкция <code>jmp</code> позволяет перемещать поток на определённое количество байт вперёд, или назад. Cheat Engine сам посчитает байты, вам нужно только указать адрес:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676535035621-2f6a2069-bde2-424f-b8fc-d600b0c820af-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="2f6a2069-bde2-424f-b8fc-d600b0c820af-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В этом примере инструкция <code>add eax, ecx</code> выполняться не будет, вместо этого сразу будет выполняться <code>sub eax, ecx</code>.</p>
<p dir="auto">Другой пример:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676535304032-06ef3446-86fe-46a6-a5aa-8f8c07cce0ec-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="06ef3446-86fe-46a6-a5aa-8f8c07cce0ec-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В этом примере поток останется в бесконечном цикле и программа зависнет. Для того что бы безопасно управлять положением потока используются условные переходы, рассмотренные в следующей статье.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/18/инструкции-ассемблера-и-регистры-процессора</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/18/инструкции-ассемблера-и-регистры-процессора</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Хоткеи для значений]]></title><description><![CDATA[<h3>В статье описано как пользоваться хоткеями для записей в таблице</h3>
<h4>Описание установки хоткеев и упрвление таблицой, создание заголовков, активация нескольких значений.</h4>
<hr />
<p dir="auto">Для каждой записи в таблице, адреса, скрипта, группы и прочего - могут быть утсановлены хоткеи, хоткеи это горячие клавиши, при нажатии которых значение каким либо образом изменяется.<br />
Для примера возьмём координаты в игре Terraria найденные в <a href="https://gamehacklab.ru/bb/topic/15">предыдущей статье</a>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676447645940-3877f83a-68a2-4dbf-b681-4ddcd58af13b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3877f83a-68a2-4dbf-b681-4ddcd58af13b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для установки хоткея на значение, нажмите на него второй кнопкой мыши что бы вызвать контекстное меню:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676447746207-eff73366-733f-4b2b-9ad7-12d831b7339d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="eff73366-733f-4b2b-9ad7-12d831b7339d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Выберите <strong>Set Hotkeys</strong>, должно появиться окно установки хоткеев, так же можно это сделать не вызывая контекстное меню, выделив значение и нажав <code>Ctrl+H</code>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676447860281-3fb95df2-5460-4d79-a4cb-a969fb87ef44-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3fb95df2-5460-4d79-a4cb-a969fb87ef44-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Что бы создать новый хоткей нажмите кнопку <strong>Create hotkey</strong>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676447913277-4808d67a-30f0-4bcf-9582-71b1df202191-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4808d67a-30f0-4bcf-9582-71b1df202191-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого у вас появится возможность выбрать клавиши на которые будет производиться действие, нажмите мышкой в поле слева от кнопки <strong>Clear</strong> и нажмите на клавиатуре поочерёдно желаемые клавиши, или одну клавишу для хоткея. После того как вы выбрали клавиши, нажмите на любой интерактивный элемент в окне, например на поле над кнопкой <strong>Apply</strong>, что бы снять выделение с поля выбора клавиш.<br />
Если вас не устраивает сочетание которое вы выбрали, можно нажать кнопку <strong>Clear</strong> и повторить процесс:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448209746-b68b9a75-8842-472e-90a3-2a3b2d67b25b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b68b9a75-8842-472e-90a3-2a3b2d67b25b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">теперь вы можете выбрать действие, которое будет производиться при нажатии выбранного сочетания клавиш:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448256880-a20bb464-fe81-4c7e-b1f2-d1c1ac4626ea-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a20bb464-fe81-4c7e-b1f2-d1c1ac4626ea-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Здесь вы можете выбрать заморозку значения, разморозку значения, изменение его на какое либо определённое, уменьшение, увеличение, заморозка с параметрами. Выберем увеличение значения на 60 (4 блока):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448354396-3ce1a761-3ed5-47ce-a34d-00a5d968834d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3ce1a761-3ed5-47ce-a34d-00a5d968834d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для применения изменений нажмите кнопку <strong>Apply</strong>, вы увидите свой хоткейи добавленным:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448401545-a9ecbb18-7ef3-4874-ab38-eec3c68a3775-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a9ecbb18-7ef3-4874-ab38-eec3c68a3775-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Вы можете добавить ещё хоткеев, или изменить этот, выделив его и нажав кнопку <strong>Edit Hotkey</strong>, удалить запись с хоткеем можно через контекстное меню:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448488421-250938ff-24fb-4242-8555-e03e41e73874-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="250938ff-24fb-4242-8555-e03e41e73874-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Закройте окно с хоткеями нажав <strong>OK</strong> и перейдите в игру, для проверки хоткея. Нажмите назначенное сочетание клавиш:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448603359-0b9848c1-504a-470c-8992-9bbca0015249-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="0b9848c1-504a-470c-8992-9bbca0015249-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448615424-8b7fbf6c-c1cd-4e08-af14-a968ff40c29e-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8b7fbf6c-c1cd-4e08-af14-a968ff40c29e-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448628441-b4eed936-c687-4125-840f-a8d72d2ee239-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b4eed936-c687-4125-840f-a8d72d2ee239-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">При каждом нажатии персонаж перемещается на 4 блока вправо, значит всё работает правильно.</p>
<p dir="auto">Назначив хоткеи на оба адреса и X и Y, можно перемещать персонажа по карте в любую сторону.<br />
Если адресов много, и нужно сразу все их разморозить, или заморозить на один хоткей, неудобно было бы назначать хоткей отдельно каждому адресу, для этого существуют группы. Группой может являться любая запись в таблице, а так же можно создать заголовок группы отдельно, через контекстное меню, нажав на пустом месте таблицы:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676448873918-3256293c-06d6-4260-93c4-bfe0cafcd9b4-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3256293c-06d6-4260-93c4-bfe0cafcd9b4-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Выберите пункт <strong>Create Header</strong> в контекстном меню, должно появиться окно, спрашивающее, как назвать заголовок, выберите желаемое название и нажмите OK, дальше появится окно, которое спросит, хотите ли вы, что бы ваш заголовок поддерживал адрес, выберите нет, если вам не нужно задавать ему адрес:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449003529-509e3b66-238a-4985-8a44-fbbd34efda48-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="509e3b66-238a-4985-8a44-fbbd34efda48-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого заголовок должен появиться в таблице:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449041112-4e0a3940-dde9-4c5d-bc77-10d255c40f2a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4e0a3940-dde9-4c5d-bc77-10d255c40f2a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь нужно перенести в него записи X и Y. Для этого выделите обе записи X и Y и перетащите мышкой ровно на заголовок, для того что бы не промахнуться, перетащите их мышкой ровно на середину квадратика активации заголовка, если вы всё сделали правильно, значения спустятся под заголовок:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449180682-425fa03c-4f14-46e0-b8d8-67dca8d41bf6-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="425fa03c-4f14-46e0-b8d8-67dca8d41bf6-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь можно настроить как заголовок будет влиять на вложенные значения, для этого зайдите в контекстное меню заголовка и наведите указатель на <strong>Group config</strong>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449259284-3fc53769-688f-4b38-8907-3e260ca64403-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3fc53769-688f-4b38-8907-3e260ca64403-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Тут вы можете настроить параметры заголовка, отметьте галочками второй и третий пункт, которые гласят "Активация этой записи активирует дочерние записи" и "Деактивация этой записи деактивирует дочерние записи", таким образом, когда вы заморозите заголовок, заморозятся и адреса координат X, Y:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449401103-b7bab22c-4d5f-4973-828a-aa9ce3aa95d6-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b7bab22c-4d5f-4973-828a-aa9ce3aa95d6-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для проверки заморозьте/разморозьте группу и посмотрите, повторяют ли вложенные значения за ней:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449448049-a7368aee-4533-4945-841b-b0efdc5f585a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a7368aee-4533-4945-841b-b0efdc5f585a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Назначьте заголовку хоткей для заморозки и разморозки на разные клавиши, или на одну, (для одной выберите <strong>Toggle freeze</strong>) :</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449545782-88c417b8-604d-4a70-b6fd-9f9951b9c668-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="88c417b8-604d-4a70-b6fd-9f9951b9c668-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в игру и попробуйте нажимать клавишу и наблюдайте что происходит, с помощью этого хоткея можно заставить персонажа зависнуть в воздухе на одном месте, или стоять не отскакивая среди толпы врагов:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449649781-c0162f52-f6e2-4478-9071-f66b1b8e825a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c0162f52-f6e2-4478-9071-f66b1b8e825a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если вам кажется что хоткей, или заморозка работает слишком медленно, вы можете зайти в настройки программы и изменить интервал заморозки и хоткеев:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449722685-f7504db5-496f-413b-a694-0a8d76200c59-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="f7504db5-496f-413b-a694-0a8d76200c59-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449740255-c2348423-50f6-4ab6-b500-8aa167ad981c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c2348423-50f6-4ab6-b500-8aa167ad981c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Чем меньше число, тем быстрее будет восстанавливаться значение к замороженному.</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449798437-d7e41fe7-a6b2-4eeb-981e-f07ae864cfef-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="d7e41fe7-a6b2-4eeb-981e-f07ae864cfef-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Чем меньше задержка, тем чаще будет срабатывать хоткей пока зажата клавиша.<br />
Так же в этом меню настроек вы можете задать разные глобальные хоткеи для самой программы, например хоткей для заморозки и разморозки процесса, что позволит вам ставить игры на паузу, которые не имеют такой возможности и может быть полезным при поиске изменяющихся значений:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676449960725-2fb45bda-788f-4fba-9417-18389d4d69bf-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="2fb45bda-788f-4fba-9417-18389d4d69bf-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Там есть и множество других полезных функций, облегчающих поиск и многое другое, вы можете сами изучить этот список.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/16/хоткеи-для-значений</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/16/хоткеи-для-значений</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Поиск неизвестного значения]]></title><description><![CDATA[<h3>В теме показано как искать неизвестное значение</h3>
<h4>Рассмотрены некоторые особенности поиска неизвестных значений и координат</h4>
<hr />
<p dir="auto">Поиск неизвестного значения применяется, если вы не знаете точно, каким является значение, например, если оно отображено просто заполняющейся полоской, или в странном формате (например как формат времени).</p>
<p dir="auto">В этой статье показано как найти координаты персонажа на примере игры Terraria.<br />
Сначала откройте игру и подключитесь к процессу с помощью Cheat Engine, как показано в <a href="https://gamehacklab.ru/bb/topic/13">предыдущей статье</a>:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359189763-4975dd11-be82-4456-8276-b9e9d2f40c49-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4975dd11-be82-4456-8276-b9e9d2f40c49-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь перейдите в игру, так как неизвестно, какие у персонажа координаты, и когда они увеличиваются, а когда уменьшаются, предположим что увеличиваются они если персонаж перемещается вправо, а уменьшаются влево. Для удобства поставьте в игре ограничительные блоки:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359400238-d4f5f57d-dfa9-4816-a085-15ebed67ed4c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="d4f5f57d-dfa9-4816-a085-15ebed67ed4c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Установите персонажа впритык к самому левому:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359435153-6c771dee-0420-4141-a3c8-b15145105bfe-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="6c771dee-0420-4141-a3c8-b15145105bfe-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Поставьте игру на паузу и перейдите в Cheat Engine, там выберете поиск неизвестного значения из списка:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359518240-7745a1ec-1fcb-4ae3-a221-85bd2327a282-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="7745a1ec-1fcb-4ae3-a221-85bd2327a282-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Нажмите First Scan, не появится никаких значений слева, но должно показать общее их количество:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359587033-488862fa-387e-492c-ad68-d64b84e5ef7b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="488862fa-387e-492c-ad68-d64b84e5ef7b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь перейдите в игру и передвиньте персонажа вплотную к следующей отметке:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359637182-e0d36d6f-085d-4b2f-8110-37c0ea2ef462-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e0d36d6f-085d-4b2f-8110-37c0ea2ef462-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в Cheat Engine и выберите Scan Type как <strong>Increased value</strong> (увеличенное значение):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359682312-c3a92b4e-2caa-436e-bccb-663109d4a91c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c3a92b4e-2caa-436e-bccb-663109d4a91c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого нажмите Next Scan, если вы всё сделали верно и поиск успешен то сверху появятся значения и их общее количество (около Found) уменьшится:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359761539-f7f4f417-207d-4600-ae41-0f83553f2cca-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="f7f4f417-207d-4600-ae41-0f83553f2cca-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Значений слишком много и нужно провести отсеивание, для этого передвигайте персонажа и выбирайте тип следующего поиска в соответствии с этим, переместите персонажа снова впритык к левому ограничителю:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676359960741-12bfadbc-0296-4a99-a428-18b0f6884556-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="12bfadbc-0296-4a99-a428-18b0f6884556-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В Cheat Engine выберите тип поиска <strong>Decreased value</strong> (уменьшенное значение):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360003828-2a6f9d2d-d88d-45e2-a21f-cae0ab9cc43a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="2a6f9d2d-d88d-45e2-a21f-cae0ab9cc43a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого нажмите Next Scan:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360041573-7d4536b7-1a4b-434d-a823-72b43217754a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="7d4536b7-1a4b-434d-a823-72b43217754a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если вы всё сделали верно то количество значений должно уменьшиться. Продолжайте перемещать персонажа вправо и влево производя соответствующий отсев, выбирая "Увеличилось" если персонаж стоит правее чем при прошлом поиске, и "Уменьшилось" если левее. Если вы совершили ошибку, например перепутали стороны поиска и поняли это, не обязательно начинать новый поиск, вы можете вернуться к результатам предыдущего отсева нажав Undo Scan.</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360241245-1bc077cc-1a06-410d-bd0f-568fc4dfb5ca-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="1bc077cc-1a06-410d-bd0f-568fc4dfb5ca-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Когда значений останется меньше и вы заметите что их количество от поиска к поиску уменьшается слабо, стоит использовать отсев с указанием "Не изменилось", для этого сдвиньте персонажа в определённую сторону, выберите соответствующий поиск (уменьшилось/увеличилось) и проведите его, после этого вернитесь в игру и не перемещайте персонажа с позиции последнего поиска.<br />
Позвольте ему немного постоять на месте и перейдите назад в программу, выберите тип поиска <strong>Unchanged value</strong>, это значит что вы хотите что бы Cheat Engine убрал все значения из списка которые изменились с прошлого поиска и оставил лишь те которые не изменились, если персонаж не двигался с прошлого поиска то его значение должно попадать в диапазон:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360444749-33d9c5a7-3814-4c93-a664-c59e5454cb91-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="33d9c5a7-3814-4c93-a664-c59e5454cb91-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Произведите поиск:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360544287-682c8e14-bc65-4224-8bf6-e4c8417cfb98-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="682c8e14-bc65-4224-8bf6-e4c8417cfb98-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Количество значений довольно заметно сократилось. Теперь, не перемещая персонажа продолжайте возвращаться в игру, а потом в Cheat Engine и нажимать Next Scan с выбранным <strong>Unchanged value</strong>, пока количество значений ещё сильнее не уменьшится:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360761623-ad7dbba5-3461-4003-aa4c-2c3e0ac54c39-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="ad7dbba5-3461-4003-aa4c-2c3e0ac54c39-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Значений всё равно много, что бы их уменьшить стоит прибегнуть к сравнению с первым поиском, именно для этого персонажа устанавливали вплотную к ограничителю из блоков. Поставьте персонажа в точно такое же положение как при первом поиске:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360829406-e985d9b4-00e3-4312-b08d-2b77f16407a5-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e985d9b4-00e3-4312-b08d-2b77f16407a5-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в Cheat Engine и поставьте галочку на <strong>Compare to first scan</strong>, тогда при следующем нажатии Next Scan программа будет сравнивать значения не с результатом прошлого поиска, а с результатом самого первого:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360915367-681e5958-7dd8-4706-98db-d2edf157989b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="681e5958-7dd8-4706-98db-d2edf157989b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Выберите тип <strong>Unchanged value</strong>, потому что персонаж стоит в той же позиции что и при первом поиске и произведите отсев:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676360997780-d80bc1b4-edf0-4ba1-a5f3-3c81c1085065-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="d80bc1b4-edf0-4ba1-a5f3-3c81c1085065-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Значений стало меньше, но всё равно ещё слишком много. Не забудьте снять галочку с <strong>Compare to first scan</strong> когда сдвините персонажа с позиции. Что бы ещё уменьшить их количество, попробуйте сделать что то необычное. Поиск производился для координаты X персонажа, то есть для горизонтального положения, поэтому попробуйте уменьшить другую координату, опустите, или поднимите его:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361229441-74a758f8-439a-4cce-9303-f68e09192dca-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="74a758f8-439a-4cce-9303-f68e09192dca-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После этого произведите отсев с параметром "не изменившееся":</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361290236-a38f3efb-4604-49e6-b4ea-be4fd2b41b05-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a38f3efb-4604-49e6-b4ea-be4fd2b41b05-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Значений стало намного меньше, но всё равно ещё слишком много. Что бы ещё уменьшить их количество, попробуйте увести персонажа далеко вправо от позиции начального поиска:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361358299-44919afa-f3c1-443f-81a5-9fe0c022c487-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="44919afa-f3c1-443f-81a5-9fe0c022c487-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">И проведите отсев увеличившегося значения:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361415366-ac1fae1e-3748-4773-91e9-a2b7e7e9c56c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="ac1fae1e-3748-4773-91e9-a2b7e7e9c56c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Значений стало ещё меньше, вернитесь в изначальную позицию и произведите отсев уменьшившегося значения:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361497182-b2c4a246-2846-49d2-a556-9ad63f5c9cd2-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b2c4a246-2846-49d2-a556-9ad63f5c9cd2-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361516928-db8d5876-0280-4d6a-9ff2-7ce14bd28176-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="db8d5876-0280-4d6a-9ff2-7ce14bd28176-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Количество значений не изменяется, это значит что дальше отсеять уже нельзя. Все эти значения относятся к разным объектам на экране, позиция персонажа, позиция камеры, позиция шляпы персонажа и прочего, поэтому их так много. Такая ситуация возникает довольно часто и что бы найти нужное значение координаты X персонажа - нужно проверять их.</p>
<p dir="auto">Выберите все значения и добавьте их в таблицу, для этого нажмите на любое значение в окне поиска и нажмите <code>Ctrl+A</code> на клавиатуре что бы выделить все значения, после чего нажмите на красную стрелочку, все значения переместятся в таблицу:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361752258-35c64520-60d8-440e-af0f-098590c74957-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="35c64520-60d8-440e-af0f-098590c74957-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для нахождения нужного значения, выделяйте и замораживайте группы значений, что бы они не могли изменяться и пробуйте перемещать персонажа в игре. Для заморозки значений выделите несколько из них мышкой, для этого нажмите на первое, потом зажмите клавишу шифт и нажмите на следующее, выделятся все значения между ними включая их самих:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361899401-6a60ac86-3605-4606-b00c-d1764111336e-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="6a60ac86-3605-4606-b00c-d1764111336e-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для того что бы быстро заморозить, или разморозить значения, нажмите пробел находясь в активном окне Cheat Engine:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361944494-661098b0-3ec9-4cfb-a3f8-1761c48c7d1f-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="661098b0-3ec9-4cfb-a3f8-1761c48c7d1f-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в игру и попробуйте переместить персонажа вправо, или влево:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676361989636-77382ef4-d68c-4b18-ac6b-849fa86f6045-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="77382ef4-d68c-4b18-ac6b-849fa86f6045-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Персонаж перемещается, но дёргается небо и облака, значит это не нужные значения. Удалите выделенные значения нажав клавишу <code>Del</code> на клавиатуре, если они вам не нужны, или просто снимите с них заморозку нажав пробел. Выделите следующую группу значений и повторите процедуру.<br />
Для удобства и быстроты поиска, самый эффективный способ это выделять и замораживать сразу половину от всех значений в таблице, проверять в игре, может ли персонаж перемещаться по X, если искомое значение будет среди них и он не сможет, вы сможете сразу удалить другую половину значений в таблице и повторить процедуру с половиной оставшихся значений:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362169682-a2df2f37-1c98-4709-84ec-0cedb1700f3f-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a2df2f37-1c98-4709-84ec-0cedb1700f3f-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После нескольких повторений осталось лишь несколько значений:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362363259-01c69901-0d96-41cf-91b6-c8ef69a5090d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="01c69901-0d96-41cf-91b6-c8ef69a5090d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Так как персонаж может перемещаться, значит верхние значения не нужные, удалите их:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362404524-09ded069-939a-414e-9023-ba9b5e6563d0-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="09ded069-939a-414e-9023-ba9b5e6563d0-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь можно поочерёдно замораживая значения и проверяя игру, найти нужное:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362460094-12e02fb5-7135-4b24-8709-5dde714618e9-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="12e02fb5-7135-4b24-8709-5dde714618e9-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Остальные значения можно удалить:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362489256-19220571-bc6c-4bae-9c02-f6d1e30b5264-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="19220571-bc6c-4bae-9c02-f6d1e30b5264-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Сравним значение в позиции около первого ограничителя и около второго:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362559410-74ae16ea-6bdd-48a5-8c5a-abecb439caa9-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="74ae16ea-6bdd-48a5-8c5a-abecb439caa9-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362573064-4f34e159-6329-4d81-a50e-60ea7e213f06-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4f34e159-6329-4d81-a50e-60ea7e213f06-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">И у второго:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362603438-2fdef773-6e1e-4636-8d8d-3c8aa1733518-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="2fdef773-6e1e-4636-8d8d-3c8aa1733518-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Вы можете записать эти числа и в дальнейшем, после перезапуска игры без труда найти нужное значение с помощью поиска точного значения из предыдущей статьи. Как сделать что бы значение не нужно было каждый раз искать рассказано в следующих статьях.</p>
<p dir="auto">Теперь вы можете заметить, что значение координат выглядит странным слишком большим. Можно проверить свои подозрения, попробовав изменить его <a href="https://gamehacklab.ru/bb/topic/11">тип</a>, как программа читает его из памяти, для этого два раза кликните на "4 Bytes" в строке Type, появится окно выбора типа:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362871697-fb67b12e-94ef-451a-bfe1-afdd5cc5f6b5-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="fb67b12e-94ef-451a-bfe1-afdd5cc5f6b5-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Выберите тип float и посмотрите как изменится внешний вид значения:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362903933-bf97e21b-e3ac-41ec-89b4-d7ba9f7e8890-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="bf97e21b-e3ac-41ec-89b4-d7ba9f7e8890-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Посмотрите как оно выглядит в первой и второй позициях:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362936316-4b61e376-1f0b-4577-98f2-80b54c64ab28-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4b61e376-1f0b-4577-98f2-80b54c64ab28-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676362951931-4a046b9d-c6bb-49be-b793-a8c560904d0d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="4a046b9d-c6bb-49be-b793-a8c560904d0d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь оно приняло читаемый вид и можно попробовать вычислить расстояние, которое занимает один блок в игре, посчитав блоки между столбиками и разделив разницу между вторым и первым значением на это количество, получится <code>(51340 - 51280) / 4 (блоков 5, но персонаж занимает 2 блока, потому -1 блок будет 4) = 15</code><br />
Для проверки попробуем вычесть из значения около правого столба 30 и записать его, посмотрев, на сколько блоков переместится персонаж, производить арифметические операции можно прямо в строке изменения значения:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676363359687-f5eb92f8-2cc6-44f7-a672-696f492a0bf0-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="f5eb92f8-2cc6-44f7-a672-696f492a0bf0-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676363390265-b887140a-6c8a-47ba-887f-fde497a25ff7-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b887140a-6c8a-47ba-887f-fde497a25ff7-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Персонаж переместился ровно на 2 блока влево, значит всё посчитано верно.<br />
Это было математическое отступление, а теперь нужно найти вторую координату, что бы перемещать персонажа не только вправо и влево, но и вверх и вниз.<br />
Можно начать новый поиск, но сначала попробуйте добавить значение по адресу расположенное прямо следующим за этим, так как координаты обычно располагаются рядом. Есть разные виды расположения координат, <code>x y</code>, <code>x y z</code>, <code>x z y</code>, и прочие, это двухмерная игра, поэтому стоит попробовать проверить первый тип, для этого продублируйте значение в таблице, выделив его, нажав <code>Ctrl+C</code> и затем <code>Ctrl+V</code>, после того как вы сделаете это, появится окно спрашивающее, как добавить значение:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676363682423-00722555-d979-4bbd-aff6-f1ee4b98166a-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="00722555-d979-4bbd-aff6-f1ee4b98166a-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">В нём можно указать на сколько сместить адрес, чем заменить и прочее, сейчас просто нажмите кнопку Paste ничего не меняя, значение появится в таблице:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676363737145-3a0eb440-7acf-43ac-bbdc-24b31ae07009-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3a0eb440-7acf-43ac-bbdc-24b31ae07009-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для удобства назовите первое значение "X", для этого кликните дважды на No description и введите свой текст.</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676363797634-d23655c7-f67e-480e-a16b-786635bc0eaa-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="d23655c7-f67e-480e-a16b-786635bc0eaa-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Что бы проверить, находится ли координата Y поблизости, нужно изменить адрес только что добавленной записи. Для этого нажмите на адрес в графе Address второго значения и добавьте к адресу 4, так как <a href="https://gamehacklab.ru/bb/topic/11">тип</a> float занимает 4 байта, а получить нужно значение идущее следующим:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676363957288-6c6ef57e-0f90-4185-b715-318a49bbdbbe-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="6c6ef57e-0f90-4185-b715-318a49bbdbbe-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Как только вы введёте + 4, вам станет видно какое значение располагается по этому адресу, если оно выглядит адекватным, тогда можно нажать OK и адрес в таблице изменится. Если бы поиск начинался с Y, тогда для получения X нужно было бы вычитать 4, а не добавлять. Помните что адрес считается в байтах в <a href="https://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D1%81%D1%82%D0%BD%D0%B0%D0%B4%D1%86%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" target="_blank" rel="noopener noreferrer nofollow ugc">шестнадцатеричной системе счисления</a>.</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676364083183-2316201e-df27-4484-8817-e2031411334c-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="2316201e-df27-4484-8817-e2031411334c-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для проверки попробуйте изменить значение, например добавив к нему 60 (4 блока):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676364166764-eac7cb4c-efb9-4a9c-8495-242b4d6f2011-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="eac7cb4c-efb9-4a9c-8495-242b4d6f2011-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Персонаж переместился вниз, значит координата Y тем больше, чем ниже персонаж в этой игре (обычно наоборот).<br />
С этими значениями вы можете перемещать персонажа по всей карте в любое место. Как это делать удобнее можно узнать из следующих статей.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/15/поиск-неизвестного-значения</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/15/поиск-неизвестного-значения</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Поиск значения]]></title><description><![CDATA[<h3>Статья демонстрирует как можно найти и изменить значение в памяти процесса с помощью Cheat Engine</h3>
<hr />
<p dir="auto">Для начала работы вам понадобится Cheat Engine.<br />
Если вы прошли встроенный в него туториал то уже знаете как искать значения. В этой статье рассмотрен пример на игре Terraria.</p>
<p dir="auto">Заходим в игру, и выясняем сколько здоровья у персонажа:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676304939278-a9524c26-992e-44c4-b415-d0ccb7136985-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="a9524c26-992e-44c4-b415-d0ccb7136985-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">500 здоровья. Что бы найти это значение в Cheat Engine, сначала нужно подключиться к процессу игры. Для этого нажимаем переливающуюся разными цветами кнопку со значком монитора и лупы:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305049351-e021f5a6-88d6-4445-b91b-f768ef66b749-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="e021f5a6-88d6-4445-b91b-f768ef66b749-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">После нажатия появится окошечко выбора процесса, найдите в нём процесс игры, обычно, имеет название как .exe файл игры:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305143794-9808f018-4982-47cd-97cd-57a5f8473b03-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="9808f018-4982-47cd-97cd-57a5f8473b03-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Или перейдите на вкладку Applications сверху и выбере там, по названию окна, после чего нажимайте кнопку Open, если вы планируете проводить отладку процесса, можете вместо этого нажать кнопку Attach debugger to process, это можно сделать и позже.</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305251259-db78472c-756c-4ac9-8fac-b89793e7f88d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="db78472c-756c-4ac9-8fac-b89793e7f88d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если процесс успешно открылся, вы увидите его название над строкой поиска:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305287628-121374dd-feb8-462e-985b-107a00a0e272-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="121374dd-feb8-462e-985b-107a00a0e272-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь можно начинать поиск значения. Нужно найти значение 500, как указано в игре, столько здоровья у персонажа, но изначально неизвестно, какой тип у значения. Если в игре значение показывается как целое, или с плавающей запятой, оно не обязательно является таким, поэтому начните с простого и попробуйте искать в вероятном типе и размере.</p>
<p dir="auto">В этой игре значение здоровья персонажа бывает больше чем 255, значит оно точно больше чем байт, двухбайтовые значения разработчики игр используют редко, поэтому начинайте поиск с 4 байт:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305513647-790de82a-2270-4cfd-bdc1-ff2071567cf6-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="790de82a-2270-4cfd-bdc1-ff2071567cf6-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Впишите значение в строку поиска, расположенной под словом Value и нажмите кнопку First scan:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305588721-b9ace2a2-a77b-4628-8bbd-8c704a071eda-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="b9ace2a2-a77b-4628-8bbd-8c704a071eda-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если поиск прошёл удачно, слева будет показан список найденных значений такого типа и размера:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305630820-80e10b27-1d0e-4678-86c3-776d25d49497-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="80e10b27-1d0e-4678-86c3-776d25d49497-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Что бы найти среди них конкретное значение, нужно уменьшить количество совпадений, для этого измените значение в игре, например позволив монстру стукнуть вашего персонажа:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305789572-c1485687-7f82-4980-8697-2b26e70789b5-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="c1485687-7f82-4980-8697-2b26e70789b5-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Следите что бы значение не изменялось когда вы его ищите, поставьте игру на паузу.<br />
Теперь введите отображаемое значение вместо первых 500 и нажмите кнопку Next Scan:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305861661-8f613232-f85c-4b4d-8499-6b9ddb436720-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="8f613232-f85c-4b4d-8499-6b9ddb436720-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">При успешном поиске список значений изменится, в этой игре значение осталось всего одно сразу, но обычно требуется повторить процедуру изменения значения и отсеивания (Next Scan) несколько раз:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676305936411-915767cd-5d35-49be-a989-f3f8f376975d-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="915767cd-5d35-49be-a989-f3f8f376975d-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Для того что бы проверить, нужное ли это значение, добавьте его в таблицу, сделать это можно выделив значение нажав на него и нажав на кнопку со стрелочкой, или через контекстное меню которое появляется нажатием другой кнопки мыши на значение, (в нём же можно и изменить значение не добавляя в таблицу):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306029285-904be9db-b033-4b7c-af0c-644b0b892d17-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="904be9db-b033-4b7c-af0c-644b0b892d17-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306047291-f780291d-ccaa-4686-a2df-e001c94cd7d9-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="f780291d-ccaa-4686-a2df-e001c94cd7d9-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если всё сделано правильно, значение появится в таблице:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306105569-7debee00-4604-4167-82e7-fceef50ca467-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="7debee00-4604-4167-82e7-fceef50ca467-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь попробуйте изменить значение, дважды кликнув на цифру 417 в графе Value, появится окно изменения значения (так же можно изменить значение не вызывая окна, просто выделив его и нажав ентер, набирать цифрами, для применения нажать ентер):</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306176661-675c2779-d679-4b76-99e2-f7bae3e0a35b-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="675c2779-d679-4b76-99e2-f7bae3e0a35b-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Введите желаемое значение и нажмите OK, значение должно измениться:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306311435-91e3b266-6ecf-4f65-855a-f855d1f6c2e0-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="91e3b266-6ecf-4f65-855a-f855d1f6c2e0-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Перейдите в игру и посмотрите, изменилось ли значение в ней:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306355511-549ee355-600f-4091-96d5-6071b209ecf9-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="549ee355-600f-4091-96d5-6071b209ecf9-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Если вы нашли верное значение, вы увидете изменения в игре, если значение не изменилось, стоит начать поиск заново, изменив тип значения на другой. Стоит попробовать типы 4 байта, float, double. Для начала нового поиска нажмите кнопку New Scan.</p>
<p dir="auto">Вы можете управлять значением из таблицы, например запретить ему изменяться. Оно будет изменяться, но Cheat Engine будет возвращать его к выбранному вами. Для заморозки значения нажмите на квадратик в графе Active:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306565122-88971073-9318-484d-92c6-d808faf28184-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="88971073-9318-484d-92c6-d808faf28184-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Теперь перейдите в игру и посмотрите на результат, значение должно возвращаться к выбранному после любых изменений, например нанесения урона персонажу.</p>
<p dir="auto">Так же можно нажать справа от крестика и указать тип заморозки, стрелка вверх значит что значению можно увеличиваться, но нельзя уменьшаться, стрелка вниз - наоборот:</p>
<p dir="auto"><img src="/bb/assets/uploads/files/1676306741421-7f3a3b9b-dd50-4905-b5de-9c4556165086-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="7f3a3b9b-dd50-4905-b5de-9c4556165086-изображение.png" class=" img-fluid img-markdown" /><br />
<img src="/bb/assets/uploads/files/1676306763748-3ceec365-6b66-4a80-8e20-42eeb4450cf5-%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png" alt="3ceec365-6b66-4a80-8e20-42eeb4450cf5-изображение.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">Вы можете изменять несколько значений выделив их и выбрав пункт в контекстном меню, или два раза кликнув на него.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/13/поиск-значения</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/13/поиск-значения</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Типы данных]]></title><description><![CDATA[<h3>В статье описаны типы данных и что это такое</h3>
<hr />
<p dir="auto">Компьютер работает со значениями, а значения могут иметь разный размер и тип, или могут иметь одинаковый размер, но разный тип.<br />
Все значения записываются в памяти с помощью едениц и нулей, то есть - в двоичной системе исчисления, эти еденицы называются <strong>битами (бит)</strong>. В одном <strong>байте (байт)</strong> 8 бит, с помощью восьми бит, по разному их комбинируя, можно записать 256 разных разных состояний, поэтому у одного байта максимальное значение которое он может содержать это 255 (<strong>считается с нуля</strong>, вместе получается 256 состояний).</p>
<p dir="auto">Значения могут быть <strong>signed</strong> (может быть отрицательным) и <strong>unsigned</strong> (не может быть отрицательным), в зависимости от того что нужно программе. Их размерность от этого не меняется, лишь добавляется возможность отрицательных значений. Например у signed байта минимальное значение которое он может содержать -127, а максимальное 127.<br />
Что бы записать значения больше чем 255, используются несколько байт. Максимальное unsigned значение из двух байт (16 бит) составляет 65535.<br />
Чем больше бит использовано, тем больше можно записать, 8 байт позволяют записывать огромные объёмы данных.</p>
<p dir="auto">Для чисел с плавающей запятой используется похожая система, но из за того что количество состояний ограничено, появляется погрешность, эта погрешность существенна только для типа float, double использует 8 байт и его погрешность незначительна. Все типы с плавающей запятой по умолчанию signed.</p>
<p dir="auto">Пример погрешности float:<br />
При попытке записать <code>5.04</code> во float 4 байта, в итоге получим <code>5.039999962</code>.</p>
<p dir="auto">Помните что тип определяет лишь то как будет считано, или записано значение. Для компьютера типа не существует и существуют лишь гигантские массивы двоичных данных. Можно указать компьютеру прочитать значение с середины нужного, захватив кусок от другого, и получить полную ерунду, поэтому, при отладке нужно помнить о том что определение типа это задача самого пользователя.</p>
<p dir="auto">При переполнении значения, например если попытаться добавить к байту в котором уже значение 255 ещё 1, происходит возвращение значения к его противоположному концу, в данном случае получится 0, если добавить 2 то получится 1 и тому подобное.</p>
<p dir="auto">В Cheat Engine разные типы именуются в следующем порядке:</p>
<ol>
<li>byte - 1 байт, 8 бит</li>
<li>word - 2 байта, 16 бит</li>
<li>dword - 4 байта, 32 бит</li>
<li>qword - 8 байт, 64 бит</li>
</ol>
<p dir="auto">С плавающей запятой:</p>
<ol>
<li>float - 4 байта, 32 бит</li>
<li>double - 8 байт, 64 бит</li>
</ol>
<p dir="auto">С помощью значений можно описать любую информацию. Если вы открывали Cheat Engine то уже могли заметить что там есть тип String, это строковый тип, который читает значения из памяти и переводит их в текст. Существует множество различных кодировок текста, для кодировки букве присваивается номер, а потом этот номер записывается как значение. При чтении строки из памяти всё происходит наоборот, читается номер и ковертируется в понятный человеку символ.<br />
Например слово "hello" это набор байт со значениями 104 101 108 108 111 в кодировке <a href="https://ru.wikipedia.org/wiki/ASCII" target="_blank" rel="noopener noreferrer nofollow ugc">ASCII</a>.<br />
В Cheat Engine значения могут быть отображены в десятичной, или в шестнадцатиричной <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" target="_blank" rel="noopener noreferrer nofollow ugc">системе счисления</a>. <a href="https://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D1%81%D1%82%D0%BD%D0%B0%D0%B4%D1%86%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" target="_blank" rel="noopener noreferrer nofollow ugc">Шестнадцатиричная система счисления</a> имеет максимальное значение 15 (F), вместо 9, для простоты понимания, когда мы начинаем добавлять, или менять цифру в десятичной системе - начинается новый десяток, в шестнадцатиричной так-же, сначала идут значения <code>0 1 2 3 4 5 6 7 8 9 A B C D E F</code>, а потом добавляется <code>10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C...</code>, так же как <a href="https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F" target="_blank" rel="noopener noreferrer nofollow ugc">двоичная система</a> имеет лишь 0 и 1, и 10 начинается уже после 1. <code>0, 1, 10, 11...</code></p>
<p dir="auto">Адреса памяти процесса обычно записываются в шестнадцатиричной системе, вам не нужно учиться считать в этих системах что бы работать с ними, главное это понимать принцип.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/11/типы-данных</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/11/типы-данных</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item><item><title><![CDATA[Process Monitor]]></title><description><![CDATA[<h3>Process Monitor универсальный шпион за программами</h3>
<h4>В статье описаны возможности программы</h4>
<hr />
<p dir="auto">Программа позволяет следить за всеми остальными работающими в данный момент на компьютере, или за какой-то конкретной. Она отслеживает и показывает все действия совершаемые процессом в системе, что он читает из реестра, что он записывает, какие он создаёт и удаляет файлы. Всё это удобно сохраняется и просматривается.<br />
Программа может иметь самые разные использования, из простейших - посмотреть, в какое место нужная программа, или игра сохраняет файл настроек.<br />
Подробности использования и ссылка на скачивание находятся в <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/procmon" target="_blank" rel="noopener noreferrer nofollow ugc">официальной статье</a> на страничке mdsn.<br />
Эта программа не обязательна для выполнения примеров из следующих статей.</p>
]]></description><link>https://gamehacklab.ru/bb/topic/10/process-monitor</link><guid isPermaLink="true">https://gamehacklab.ru/bb/topic/10/process-monitor</guid><dc:creator><![CDATA[Promising]]></dc:creator><pubDate>Wed, 01 Mar 2023 21:00:00 GMT</pubDate></item></channel></rss>