Описание тега decompiling

Декомпиляторы анализируют двоичный код, выводя исходный код на языке более высокого уровня, таком как C. Вывод, как правило, не легче анализировать, чем исходный ассемблер, из-за потери информации во время компиляции.

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

  • Разложение ассемблера на базовый блок.
  • Потеря информации при компиляции.

Разложение базовых блоков

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

Потеря информации

Комментарии и имена переменных, очевидно, теряют информацию в процессе декомпиляции. Кроме того, компиляторы агрессивно оптимизируют код; Ключевой частью является сохранение переменных высокого уровня в регистрах. Из-за этого регистр может повторно использоваться для многих различных переменных высокого уровня. Это может привести к тому, что декомпилированный код будет иметь другое количество переменных и структуру управления, чем исходный код. Кроме того, разные компиляторы (или даже разные уровни оптимизации) генерируют разный код для одного и того же исходного кода. Т.е. сопоставление источника с машиной зависит от компилятора. Без подсказок для декомпилятора он не может повторно сгенерировать тот же источник. Часто декомпилированный код будет напоминать обфусцированный код.

В исследовательской статье Кристины Сифуэнтес из Квинслендского технологического университета дается более подробная техническая информация о декомпиляторе. Проект Boomerang - это пример декомпилятора с открытым исходным кодом.

Некоторые общие способы использования декомпилятора:

  • Перенацеливание кода на другой набор инструкций.
  • Анализ двоичного файла на предмет безопасности.
  • Код исправления для обновления операционной системы.

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

См. Также: дизассемблирование реверс-инжиниринга