Реверс-інжиніринг і чіти

Основи: пам'ять, процеси та інструменти

Що таке реверс-інжиніринг, правові межі, адресний простір процесу, доступ до чужої пам'яті та інструменти для Windows, Linux і macOS.

Основи: пам'ять, процеси та інструменти

🎯 Мета розділу

  • Зрозуміти, що таке реверс-інжиніринг (reverse engineering) і де його застосовують.
  • Знати правові та етичні межі: на чому тренуватися можна, а на чому ні.
  • Побачити план курсу: від пошуку значення в пам'яті до власного чіта для AssaultCube.
  • Зрозуміти, чому адреса у двох процесів може збігатися, а дані різні.
  • Знати, які області пам'яті є в процесі: код, дані, купа, стек.
  • Дізнатися, який системний виклик читає пам'ять іншого процесу на кожній ОС.
  • Встановити сканер пам'яті, налагоджувач і компілятор на своїй ОС.
  • Зібрати та запустити гру-мішень і тренер з репозиторію.
  • Розуміти, який інструмент у якому уроці знадобиться.

🔑 Ключові терміни

  • Реверс-інжиніринг: вивчення готової програми без вихідного коду, щоб зрозуміти, як вона працює.
  • Чіт (cheat): програма, що змінює поведінку гри на користь гравця.
  • Тренер (trainer): окремий процес, який читає і змінює пам'ять гри.
  • Інжектор (injector): код, який завантажується всередину процесу гри.
  • Адресний простір: набір віртуальних адрес, які бачить один процес.
  • Сторінка (page): блок пам'яті, зазвичай 4 КБ (на Apple Silicon 16 КБ), з однаковими правами доступу.
  • Купа (heap): область, звідки береться пам'ять для new і malloc.
  • PID: числовий ідентифікатор процесу.
  • Сканер пам'яті: програма, що шукає у процесі всі місця із заданим значенням.
  • Налагоджувач (debugger): зупиняє процес, показує регістри, пам'ять та інструкції.
  • Дизасемблер: перетворює машинний код в асемблер.

Що таке реверс-інжиніринг і з чого починається практика

Програма, яку ви запускаєте, — це машинний код і дані в пам'яті. Вихідного коду в користувача немає, але гра зберігає здоров'я, набої та координати в оперативній пам'яті, а процесор виконує зрозумілі команди. Реверс-інжиніринг навчає знаходити ці дані й команди та розуміти, що вони означають.

Де це застосовують

  • Аналіз шкідливого коду. Аналітик розбирає вірус, щоб написати для нього захист.
  • Безпека. Пошук вразливостей у програмах, для яких нема коду.
  • Сумісність. Підтримка старого ПЗ і драйверів, документація яких загубилася.
  • Моддинг і навчання. Розширення ігор, дослідження того, як працюють їхні механіки.
  • Розробка антічітів. Щоб захистити гру, треба знати, як її ламають.

Ігри обирають для навчання, бо результат видно одразу: змінили число в пам'яті, і здоров'я на екрані змінилося.

Правові та етичні межі

Чіти в онлайн-іграх з антічітом (Valorant, CS2 на VAC-серверах, Fortnite та інші) порушують умови використання, ведуть до бану акаунта, а іноді й до відповідальності за порушення прав розробника. Сторонні «безкоштовні чіти» часто самі є шкідливим ПЗ.

Правило курсу: усі експерименти виконуються лише над програмами, які ви запускаєте локально й дозволяєте досліджувати:

  1. Власна гра-мішень з цього курсу, її код ми пишемо самі.
  2. AssaultCube — вільна гра з відкритим кодом, створена для спільного тренування. Запускаємо її тільки в одиночному режимі або на власному сервері.

Те, що ви навчитеся робити, застосовується однаково, але проти чужих серверів курс це не використовує.

Огляд курсу

Пам'ять і процеси

Як програма зберігає дані, чому один процес не бачить пам'ять іншого і як ОС дозволяє це обійти для налагодження.

Інструменти

Cheat Engine, x64dbg, GDB, LLDB, власний сканер на C++.

Структури, зміщення, ланцюжки вказівників

Як із випадкової адреси перейти до стабільного способу знайти потрібне значення після перезапуску.

Асемблер і налагоджувач

Хто саме змінює здоров'я: знаходимо інструкцію, читаємо її, змінюємо.

Тренер і internal-чіт

Зовнішня програма, яка пише в пам'ять гри, і бібліотека, що завантажується всередину процесу (DLL, LD_PRELOAD, dylib).

AssaultCube

Усе вивчене застосовуємо до реальної гри на Windows, Linux і macOS.

Підготовка

Потрібне знання C++ на рівні вказівників і структур. Достатньо тем курсу C++ про вказівники й структури. Код лабораторних лежить у репозиторії в labs/reverse-engineering/.

Для macOS потрібен Mac з Xcode Command Line Tools. Для Linux — gcc/clang, cmake, gdb. Для Windows — Visual Studio Build Tools або MinGW і Cheat Engine. Детальне встановлення описано в розділі «Інструменти» нижче.

Процеси, віртуальна пам'ять і доступ до чужого процесу

Коли гра виконує new Player, вона отримує адресу на кшталт 0x103231a70. Це віртуальна адреса: її бачить лише цей процес, а ядро ОС відображає її на реальну фізичну пам'ять. Інший процес із такою самою адресою звертається до власних даних.

Звідси два наслідки. Тренер не може просто прочитати вказівник гри. Йому потрібен дозвіл ядра: спеціальний виклик, який каже «прочитай N байтів за адресою A у процесі з PID X».

З чого складається процес

ОбластьЩо там лежитьПрава
Код (.text)машинні інструкціїчитання, виконання
Дані (.data, .bss)глобальні й статичні зміннічитання, запис
Купаоб'єкти з new/mallocчитання, запис
Стеклокальні змінні, адреси поверненнячитання, запис
Бібліотекикод і дані системних та сторонніх бібліотекзалежить від секції

Глобальні змінні гри мають стабільну адресу відносно початку програми. Об'єкти в купі (гравець, вороги) отримують нову адресу при кожному запуску. Різниця між цими двома випадками — основа розділу про ланцюжки вказівників.

Сучасні ОС вмикають ASLR (address space layout randomization): базова адреса програми й бібліотек випадково змінюється при кожному запуску. Тому адреса, знайдена вчора, сьогодні не працює. Рішення — запам'ятовувати зміщення від бази модуля, а не абсолютну адресу.

Як прочитати пам'ять іншого процесу

HANDLE h = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,
                       FALSE, pid);
int32_t hp;
ReadProcessMemory(h, (LPCVOID)addr, &hp, sizeof(hp), nullptr);

Схема однакова: отримати дозвіл на процес (дескриптор, pid, mach-порт), потім читати й писати байти за адресою. Різниця лише в умовах отримання дозволу.

Права доступу. На Windows OpenProcess працює для процесів того ж користувача, якщо їх не захищає антічіт. На Linux діє ptrace_scope: за значення 1 читати можна лише власних нащадків, тому або запускайте гру з тренера, або виконайте sudo sysctl kernel.yama.ptrace_scope=0 на навчальній машині. На macOS task_for_pid потребує sudo (root) або підписаного налагоджувача, а програми з hardened runtime та системні недоступні навіть root.

Ці обмеження існують навмисно: вони не дають довільній програмі лізти в чужі процеси. У нашому курсі гра й тренер збираються локально без hardened runtime, тому достатньо sudo.

Інструменти: що встановити на Windows, Linux і macOS

Набір інструментів

ЗадачаWindowsLinuxmacOS
Сканер пам'ятіCheat Enginescanmem / GameConquerorвласний сканер (trainer scan)
Налагоджувачx64dbgGDBLLDB
ДизасемблерGhidra, x64dbgGhidra, objdumpGhidra, objdump -d
КомпіляторMSVC / MinGWGCC / ClangApple Clang

Cheat Engine працює лише на Windows. На Linux і macOS ту саму ідею виконують scanmem та власний сканер, який є в репозиторії. Ghidra — безкоштовний дизасемблер, однаковий на всіх ОС.

  • Cheat Engine: під час встановлення відмовтеся від додаткових пропозицій.
  • x64dbg.
  • Visual Studio Build Tools або MinGW і cmake.

Збірка гри-мішені та тренера

cd labs/reverse-engineering/target-game
cmake -S . -B build && cmake --build build
./build/target_game

Гра виводить свій PID і команди керування. З параметром --show-addr вона додатково друкує адреси Game* та Player*. Це підказка для самоперевірки; у перших розділах параметр не вмикайте.

./build/target_game
PID: 66038
Команди: s = стрілити, d = отримати удар, h = лікування, m = рух, q = вихід
[Hero] HP=100 armor=50 ammo=30/30 score=0 pos=(10.0, 20.0)
>
На macOS тренеру для task_for_pid потрібен sudo. Запускайте з підвищеними правами лише збірки, які ви зробили самі.
Гра читає команди зі стандартного входу: введіть літеру й натисніть Enter. Тренер працює в іншому терміналі, поки гра чекає на команду.
Copyright © 2026