Декомпиляция и чтение псевдо-C

Самый удобный режим современного реверса — чтение псевдо-C вместо ассемблера.

Декомпилятор — инструмент, который восстанавливает по машинному коду приблизительный высокоуровневый код (псевдо-C).

Зачем декомпилятор

Читать ассемблер можно, но медленно. Декомпилятор (в Ghidra встроен бесплатно) превращает функцию в C-подобный код с переменными, циклами и условиями. Понять логику становится в разы быстрее.

Что вы увидите

Из ассемблера проверки crackme декомпилятор может восстановить что-то такое:

int check(char *input) {
    if (strlen(input) != 6)
        return 0;
    int total = 0;
    for (int i = 0; i < 6; i++)
        total += input[i];
    return total == 500;
}

Сравните с сырым ассемблером — читать несравнимо легче. Циклы и условия восстановлены.

Что декомпилятор НЕ восстанавливает

  • Оригинальные имена переменных (если нет символов) — будут iVar1, local_8.
  • Комментарии и точную структуру исходника.
  • Иногда ошибается на сложном/оптимизированном/обфусцированном коде.

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

Рабочий процесс

  1. Открыть функцию в декомпиляторе, прочитать логику.
  2. Переименовать переменные/функции по смыслу — псевдо-C сразу станет яснее.
  3. В сомнительных местах свериться с ассемблером.
  4. Добавить комментарии.

Как работает под капотом

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

Частые ошибки

  • Слепо доверять псевдо-C на оптимизированном коде.
  • Не переименовывать — тогда псевдо-C из iVar1 и uVar2 читается плохо.
  • Игнорировать предупреждения декомпилятора о неоднозначностях.

Итог

  • Декомпилятор (Ghidra) даёт псевдо-C — читать на порядок быстрее ассемблера.
  • Имена и комментарии не восстанавливаются; результат приблизителен.
  • Псевдо-C — гипотеза: в спорных местах сверяйтесь с ассемблером.
Проверьте себя
1. Что делает декомпилятор?
AТочно восстанавливает оригинальный исходник с именами и комментариями
BВосстанавливает приблизительный высокоуровневый псевдо-C по машинному коду
CЗапускает программу
DШифрует код
2. Почему к псевдо-C из декомпилятора стоит относиться как к гипотезе?
AОн всегда неверен
BЭто эвристика — на оптимизированном/обфусцированном коде возможны ошибки, спорное надо сверять с ассемблером
CОн не показывает циклы
DОн медленнее ассемблера