Декомпиляция и чтение псевдо-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 — это гипотеза, очень полезная, но требующая проверки по ассемблеру в спорных местах.
Рабочий процесс
- Открыть функцию в декомпиляторе, прочитать логику.
- Переименовать переменные/функции по смыслу — псевдо-C сразу станет яснее.
- В сомнительных местах свериться с ассемблером.
- Добавить комментарии.
Как работает под капотом
Декомпилятор анализирует поток данных и управления: восстанавливает выражения из последовательностей инструкций, опознаёт циклы по графу, выводит типы по тому, как используются значения. Это эвристика, поэтому результат приблизителен, но обычно очень полезен.
Частые ошибки
- Слепо доверять псевдо-C на оптимизированном коде.
- Не переименовывать — тогда псевдо-C из
iVar1иuVar2читается плохо. - Игнорировать предупреждения декомпилятора о неоднозначностях.
Итог
- Декомпилятор (Ghidra) даёт псевдо-C — читать на порядок быстрее ассемблера.
- Имена и комментарии не восстанавливаются; результат приблизителен.
- Псевдо-C — гипотеза: в спорных местах сверяйтесь с ассемблером.