Original:http://www.backerstreet.com/decompiler/introduction.htm

Дизайн декомпилятора - Введение

Введение

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

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

Несколько попыток было выполнено при написании двоичных исполняемых декомпиляторов. На этой странице есть несколько примеров.

В управляемых средах есть еще больше декомпиляторов, которые используют байтовый код, например Java и C#. Широкий список доступен в вики преобразования программ .

На этих страницах мы сосредоточимся на декомпиляции бинарных исполняемых файлов или от машинного кода до исходного кода, поскольку это намного сложнее, чем декомпиляция байт-кода Java или C#.

Несколько языков и компиляторов могут создавать машинный код, включая некоторые компиляторы Java, C# и Visual Basic. Поэтому декомпилятор должен будет знать, какой язык был использован для компиляции программы, и ему придется поддерживать этот язык. Однако большинство трудных проблем при декомпиляции возникают при использовании менее ограниченных языков, а именно C, Pascal или C++.

Большинство алгоритмов можно использовать для всех языков, поэтому мы будем в основном использовать примеры, написанные на C. Когда мы показываем алгоритм, мы будем использовать C или C++, так как это самые доступные языки как в Linux, так и в Windows.

Независимо от целевого языка, декомпилятор в основном занимается 3-мя видами объектов:

  • Объекты кода (функции, операторы)
  • Объекты данных (глобальные и локальные переменные)
  • Типы (типы переменных, прототипы функций)

Постоянной проблемой декомпилятора является попытка вывести одно или несколько из трех объектов из последовательности байтов, найденных в двоичном файле. Для этого полезно знать, как инструменты разработки (которые мы называем «forward engineering'tools») используются при написании программы, так как это процесс, который мы пытаемся вернуть.


Далее: форвардные инженерные инструменты