# Cheat Engine {{#include ../../banners/hacktricks-training.md}} [**Cheat Engine**](https://www.cheatengine.org/downloads.php) - це корисна програма для знаходження місць, де важливі значення зберігаються в пам'яті запущеної гри, та їх зміни.\ Коли ви завантажите та запустите її, вам буде **представлено** **посібник** з використання цього інструменту. Якщо ви хочете навчитися користуватися інструментом, настійно рекомендується його завершити. ## Що ви шукаєте? ![](<../../images/image (762).png>) Цей інструмент дуже корисний для знаходження **місця, де деяке значення** (зазвичай число) **зберігається в пам'яті** програми.\ **Зазвичай числа** зберігаються у **4байтовій** формі, але ви також можете знайти їх у **подвійних** або **плаваючих** форматах, або ви можете шукати щось **інше, ніж число**. З цієї причини вам потрібно бути впевненим, що ви **вибрали** те, що хочете **шукати**: ![](<../../images/image (324).png>) Також ви можете вказати **різні** типи **пошуків**: ![](<../../images/image (311).png>) Ви також можете відзначити поле, щоб **зупинити гру під час сканування пам'яті**: ![](<../../images/image (1052).png>) ### Гарячі клавіші У _**Edit --> Settings --> Hotkeys**_ ви можете встановити різні **гарячі клавіші** для різних цілей, таких як **зупинка** **гри** (що досить корисно, якщо в якийсь момент ви хочете просканувати пам'ять). Інші опції також доступні: ![](<../../images/image (864).png>) ## Модифікація значення Якщо ви **знайшли**, де знаходиться **значення**, яке ви **шукаєте** (більше про це в наступних кроках), ви можете **змінити його**, двічі клацнувши на ньому, а потім двічі клацнувши на його значенні: ![](<../../images/image (563).png>) І нарешті **позначивши галочку**, щоб внести зміни в пам'ять: ![](<../../images/image (385).png>) **Зміна** в **пам'яті** буде негайно **застосована** (зверніть увагу, що поки гра не використовує це значення знову, значення **не буде оновлено в грі**). ## Пошук значення Отже, ми будемо припускати, що є важливе значення (наприклад, життя вашого користувача), яке ви хочете покращити, і ви шукаєте це значення в пам'яті) ### Через відоме зміна Припустимо, ви шукаєте значення 100, ви **виконуєте сканування**, шукаючи це значення, і знаходите багато збігів: ![](<../../images/image (108).png>) Потім ви робите щось, щоб **значення змінилося**, і ви **зупиняєте** гру та **виконуєте** **наступне сканування**: ![](<../../images/image (684).png>) Cheat Engine буде шукати **значення**, які **змінилися з 100 на нове значення**. Вітаємо, ви **знайшли** **адресу** значення, яке шукали, тепер ви можете його змінити.\ _Якщо у вас все ще є кілька значень, зробіть щось, щоб знову змінити це значення, і виконайте ще одне "наступне сканування", щоб відфільтрувати адреси._ ### Невідоме значення, відоме зміна У сценарії, коли ви **не знаєте значення**, але знаєте, **як його змінити** (і навіть значення зміни), ви можете шукати своє число. Отже, почніть з виконання сканування типу "**Невідоме початкове значення**": ![](<../../images/image (890).png>) Потім змініть значення, вкажіть, **як** **значення** **змінилося** (в моєму випадку воно зменшилося на 1) і виконайте **наступне сканування**: ![](<../../images/image (371).png>) Вам буде представлено **всі значення, які були змінені обраним способом**: ![](<../../images/image (569).png>) Коли ви знайдете своє значення, ви можете його змінити. Зверніть увагу, що є **багато можливих змін**, і ви можете виконувати ці **кроки стільки, скільки хочете**, щоб відфільтрувати результати: ![](<../../images/image (574).png>) ### Випадкова адреса пам'яті - Знаходження коду До цього моменту ми навчилися знаходити адресу, що зберігає значення, але ймовірно, що в **різних виконаннях гри ця адреса знаходиться в різних місцях пам'яті**. Тож давайте дізнаємося, як завжди знаходити цю адресу. Використовуючи деякі з згаданих трюків, знайдіть адресу, де ваша поточна гра зберігає важливе значення. Потім (зупинивши гру, якщо хочете) клацніть правою кнопкою миші на знайденій **адресі** та виберіть "**Дізнатися, що отримує доступ до цієї адреси**" або "**Дізнатися, що записує в цю адресу**": ![](<../../images/image (1067).png>) **Перша опція** корисна для того, щоб дізнатися, які **частини** **коду** **використовують** цю **адресу** (що корисно для інших речей, таких як **знати, де ви можете змінити код** гри).\ **Друга опція** є більш **специфічною** і буде більш корисною в цьому випадку, оскільки нас цікавить, **звідки це значення записується**. Після того, як ви вибрали одну з цих опцій, **дебагер** буде **підключений** до програми, і з'явиться нове **порожнє вікно**. Тепер **грай** у **гру** та **змінюй** це **значення** (без перезапуску гри). **Вікно** повинно бути **заповнене** **адресами**, які **змінюють** **значення**: ![](<../../images/image (91).png>) Тепер, коли ви знайшли адресу, яка змінює значення, ви можете **змінити код на свій розсуд** (Cheat Engine дозволяє вам швидко змінювати його на NOP): ![](<../../images/image (1057).png>) Отже, ви можете тепер змінити його так, щоб код не впливав на ваше число або завжди впливав позитивно. ### Випадкова адреса пам'яті - Знаходження вказівника Продовжуючи попередні кроки, знайдіть, де знаходиться значення, яке вас цікавить. Потім, використовуючи "**Дізнатися, що записує в цю адресу**", дізнайтеся, яка адреса записує це значення, і двічі клацніть на ньому, щоб отримати вигляд дизасемблера: ![](<../../images/image (1039).png>) Потім виконайте нове сканування, **шукаючи шістнадцяткове значення між "\[]"** (значення $edx у цьому випадку): ![](<../../images/image (994).png>) (_Якщо з'явиться кілька, зазвичай вам потрібна найменша адреса_)\ Тепер ми **знайшли вказівник, який буде змінювати значення, яке нас цікавить**. Клацніть на "**Додати адресу вручну**": ![](<../../images/image (990).png>) Тепер клацніть на поле "Вказівник" і додайте знайдену адресу в текстове поле (в цьому сценарії знайдена адреса на попередньому зображенні була "Tutorial-i386.exe"+2426B0): ![](<../../images/image (392).png>) (Зверніть увагу, як перша "Адреса" автоматично заповнюється з адреси вказівника, яку ви вводите) Клацніть OK, і буде створено новий вказівник: ![](<../../images/image (308).png>) Тепер, щоразу, коли ви змінюєте це значення, ви **змінюєте важливе значення, навіть якщо адреса пам'яті, де знаходиться значення, інша.** ### Ін'єкція коду Ін'єкція коду - це техніка, коли ви вставляєте шматок коду в цільовий процес, а потім перенаправляєте виконання коду, щоб пройти через ваш власний написаний код (наприклад, надаючи вам бали замість їх зменшення). Отже, уявіть, що ви знайшли адресу, яка віднімає 1 від життя вашого гравця: ![](<../../images/image (203).png>) Клацніть на Показати дизасемблер, щоб отримати **дизасембльований код**.\ Потім натисніть **CTRL+a**, щоб викликати вікно Авто складання та виберіть _**Шаблон --> Ін'єкція коду**_ ![](<../../images/image (902).png>) Заповніть **адресу інструкції, яку ви хочете змінити** (це зазвичай заповнюється автоматично): ![](<../../images/image (744).png>) Шаблон буде згенеровано: ![](<../../images/image (944).png>) Отже, вставте свій новий асемблерний код у секцію "**newmem**" і видаліть оригінальний код з секції "**originalcode**", якщо не хочете, щоб він виконувався. У цьому прикладі ін'єкований код додасть 2 бали замість того, щоб віднімати 1: ![](<../../images/image (521).png>) **Натисніть виконати, і ваш код повинен бути ін'єктований у програму, змінюючи поведінку функціональності!** ## **Посилання** - **Посібник Cheat Engine, заверште його, щоб дізнатися, як почати працювати з Cheat Engine** {{#include ../../banners/hacktricks-training.md}}