Что такое обратный инжиниринг?

Это процесс понимания того, как работает программа через анализ самого приложения. Цель — разобраться в компоненте настолько хорошо, чтобы его объяснить, изменить или пересоздать.

Рассмотрим простой вопрос: почему Windows Calculator при вводе 200 + 10% выдаёт 220?

Традиционный способ — разбираться самостоятельно

Оригинальный x64-код · выбранные инструкции
0x180124945: MOV EAX, dword ptr [R13 + 0x18]
0x180124949: CMP EAX, 0x5c
0x18012494c: JZ 0x180124aba
0x180124952: CMP EAX, 0x5b
0x180124955: JZ 0x180124aba
0x18012495b: MOV EDX, 0x64
0x180124960: LEA RCX, [RSP + 0x160]
0x180124968: CALL 0x180122650
0x18012496e: LEA RDX, [R13 + 0x160]
0x180124975: LEA RCX, [RSP + 0x78]
0x18012497a: CALL 0x180109720
0x18012497f: MOV RSI, RAX
0x180124982: MOV qword ptr [RSP + 0x28], RAX
0x180124987: LEA RDX, [RSP + 0x160]
0x18012498f: MOV RCX, RAX
0x180124992: CALL 0x180123190
; … пропущены инструкции копирования значений …
0x180124a14: MOV RDX, RDI
0x180124a17: LEA RCX, [RSP + 0xf8]
0x180124a1f: CALL 0x180109720
0x180124a24: LEA R8, [RSP + 0x30]
0x180124a29: MOV RDX, RAX
0x180124a2c: LEA RCX, [RSP + 0xb8]
0x180124a34: CALL 0x180123c10

Нужно декодировать инструкции, отследить вызовы и восстановить вычисление вручную.

С REA — просто спросите агента

Один запрос.

Просто опишите задачу на обычном английском.

Пример запроса · Калькулятор

›Use REA to inspect Windows Calculator. Why does 200 + 10% give 220?

Пример ответа · на основе найденного

После нажатия на +, кнопка % берёт процент от первого числа.

10% от 200 = 20↓200 + 20 = 220
REA предоставляет
Инструкции обработчика, декомпилированный код и вызовы функций.
Ваш агент объясняет
Какая ветвь срабатывает, что она вычисляет и как это пересоздать.
Выбранный код из установленного Calculator.dll. Рассуждение и ответ иллюстрируют найденное. Продолжить с примером Калькулятора ↓

Попробуем два примера

Попробуем два примера. Изменим скорость браузерной игры, потом вернёмся к Калькулятору и пересоздадим его кнопку процента.

Пример 01 · Динозавр в Chrome

Почему динозавр ускоряется?

Цель
Пересоздать игру с регулируемой скоростью.
Почему реверс-инжиниринг?
Чтобы воспроизвести ускорение, нужна логика работающей игры: с какой скоростью она начинается, на сколько растёт и когда останавливается.

REA вернул

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

Пример запроса · Динозавр

›Use REA to inspect this dinosaur game. Why does it get faster? Show the speed rule, then build a small version with an adjustable speed.

REA · загружен index.js · выбранные строки
if (this.currentSpeed < this.config.MAX_SPEED) {
  this.currentSpeed += this.config.ACCELERATION;
}

Начинает со скоростью 6. Прибавляет 0.001 на каждом обновлении без столкновений, пока скорость ниже 13.

Анализ проведён на браузерной версии игры на основе Chromium.

Что делает каждая часть

  1. 01 · REAЧитает скрипт запущенной игрыВозвращает реальный код и параметры агенту.
  2. 02 · Ваш агентПересоздаёт логику, добавляет управлениеИспользует восстановленное ускорение в маленькой игре с регулятором скорости.
  3. 03 · ВыМеняете скорость и играетеПробуете оригинальное ускорение, потом выбираете свой темп.
Посмотреть скрипт, проверки и как попробовать анализ

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

Выбранные параметры из проанализированного скрипта
ACCELERATION: 0.001,
MAX_SPEED: 13,
SPEED: 6

Вызвали функцию обновления оригинальной игры в контролируемой проверке браузера с отключёнными препятствиями и автоматическим расписанием. После 4000 обновлений скорость была 10.0; после 10000 — 13.0, округлено до одного знака.

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

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

Проанализированный код скорости · Авторы Chromium · лицензия BSD

Пример 02 · Windows Calculator

Пересоздаём кнопку % Калькулятора

Разобрались, почему 200 + 10% даёт 220. Теперь восстановим правила для + и ×, и проверим их.

Цель
Собрать маленький калькулятор, который правильно обрабатывает и + и ×.
Почему реверс-инжиниринг?
Одна кнопка использует разные правила после + и ×. Проанализируем установленное приложение, чтобы понять, к какому числу применяется процент.

REA вернул

Одна ветвь делит на 100. Другая тоже умножает на первое число. Агент использует обе, чтобы пересоздать кнопку %.

В этом примере previous = 200 и current = 10.

Пример запроса · Пересоздание кнопки %

›Use REA to inspect Windows Calculator's % button. Recover the rules after + and ×, then build a small calculator that uses both.

Читаемое описание обработчика %
if (operation == multiply || operation == divide) {
  percent = current / 100;
} else {
  percent = current * previous / 100;
}
После +
Берём 10% от первого числа.10% от 200 = 20 → 200 + 20 = 220
После ×
Превращаем 10% в 0.1.200 × 0.1 = 20