Описание тега decompiling
Концепция декомпилятора большинству людей кажется простой. Скомпилированный двоичный файл был создан из исходного кода, поэтому кажется, что операция должна быть обратимой. Однако есть некоторые проблемы, с которыми сталкивается декомпилятор:
- Разложение ассемблера на базовый блок.
- Потеря информации при компиляции.
Разложение базовых блоков
Собранный вручную ассемблер может превратить анализ в базовый блок, что запретит создание графа потока управления. Например, созданный вручную ассемблер не обязан следовать прологу и эпилогу функции. Ассемблер может использовать инструкции, которые не соответствуют языку более высокого уровня. Он может использовать самомодифицирующийся код и несколько точек входа (даже в середине инструкции) в законных целях или для предотвращения обратного проектирования. В некоторых случаях агрессивная оптимизация компилятора может привести к аналогичным результатам.
Потеря информации
Комментарии и имена переменных, очевидно, теряют информацию в процессе декомпиляции. Кроме того, компиляторы агрессивно оптимизируют код; Ключевой частью является сохранение переменных высокого уровня в регистрах. Из-за этого регистр может повторно использоваться для многих различных переменных высокого уровня. Это может привести к тому, что декомпилированный код будет иметь другое количество переменных и структуру управления, чем исходный код. Кроме того, разные компиляторы (или даже разные уровни оптимизации) генерируют разный код для одного и того же исходного кода. Т.е. сопоставление источника с машиной зависит от компилятора. Без подсказок для декомпилятора он не может повторно сгенерировать тот же источник. Часто декомпилированный код будет напоминать обфусцированный код.
В исследовательской статье Кристины Сифуэнтес из Квинслендского технологического университета дается более подробная техническая информация о декомпиляторе. Проект Boomerang - это пример декомпилятора с открытым исходным кодом.
Некоторые общие способы использования декомпилятора:
- Перенацеливание кода на другой набор инструкций.
- Анализ двоичного файла на предмет безопасности.
- Код исправления для обновления операционной системы.
Из-за потери информации декомпилированный код может не помочь в понимании кода ассемблера. Он, конечно, не может производить оригинальный исходный код. Изучение декомпилированного кода может дать оценку правильного именования переменных.
См. Также: дизассемблирование реверс-инжиниринга