Читая форумы по программированию, иногда натыкаешься на вопрос типа: "У меня
есть откомпилированная программа на Delphi. Как мне получить её исходный код?".
Обычно такой вопрос возникает, когда программист потерял файлы проекта и у него
остался только .exe. Как правило полностью восстановить исходный код на языке
высокого уровня невозможно. Значит ли это, что другие тоже не смогут
восстановить исходный код Вашей программы ? Хм ... и да и нет ...
Для начала сразу скажу, что восстановить исходный код в точности каким он был
однозначно невозможно, так как не существует в мире такого декомпилятора,
который бы смог сотворить такое.
После компиляции и линковки проекта и получения исполняемого файла все имена,
используемые в программе конвертируются в адреса. Потеря имён означет, что
декомпилятор создаст уникальное имя для каждой константы, переменной, функции и
процедуры. Даже если мы и достигнем какого-то успеха в декомпиляции исполняемого
файла, то получим уже другой синтаксис программы. Данная проблема связана с тем,
что при компиляции практически идентичные куски кода могут быть скомпилированы в
разные последовательности машинных команд (ASM), которые присутствуют в .exe
файле. Естевственно декомпилятор не обладает такой степенью интеллектуальности,
чтобы решить - какова же была последовательность инструкций языка высокого
уровня в исходном проекте.
Когда же применяется декомпиляция ? Для этого существует довольно много
причин. Вот некторые из них:
- Восстановление исходного кода;
- Перенос приложения на другую платформу;
- Определение наличия вирусов в коде программы или
вредоносного кода;
- Исправление ошибок в программе, в случае, если создатель
приложения не собирается этого делать :)
Легально ли всё это? Хотя декомпиляция и не является взломом, но
утвердительно ответить на этот вопрос довольно сложно. Обычно программы защищены
законом об авторских правах, однако в большинстве стран на декомпиляцию делается
исключение. В часности, когда необходимо изменить интерфейс программы для
конкретной страны, а сервис приложения не позволяет этого сделать.
На данный момент Borland не предоставляет никаких программных продуктов,
способных декомпилировать исполняемые файлы (.exe) либо откомпилированные
Delphi-модули (.dcu) в исходный код (.pas).
Если же Вы всё-таки решились попробовать декомпилировать исполняемый файл, то
необходимо знать следующие вещи. Исходные коды на Delphi обычно хранятся в
файлах двух типов: сам исходник в ASCII кодировке (.pas, .dpr) и файлы ресурсов
(.res, .rc, .dfm, .dcr). Dfm файлы хранят в себе свойства объектов, содержащихся
в форме. При создании конечного .exe, Delphi копирует в него информацию из .dfm
файлов. Каждый раз, когда мы изменяем координаты формы, описания кнопок или
связанные с ними события, то Delphi записывает эти изменения в .dfm (за
исключением кода процедур. Он сохраняется в файлах pas/dcu ). И наконец, чтобы
получить при декомпиляции файл .dfm, нужно знать - какие типы ресурсов хранятся
внутри Win32 исполняемого модуля.
Все программы, скомпилированные в Delphi имеют следующие секции: CODE, DATA,
BSS, .idata, tls, .rdata, .rsrc. Самые важные для декомпиляции секции CODE и .rsrc.
В статье "Adding functionality to a Delphi program" приведены некоторые
интересные факты о исполняемых форматах Delphi, а так же информация о классах и
DFM ресурсах. В этой статье есть один интересный момент под заголовком: "Как
добавить свой обработчик события в уже откомпилированный файл, например, чтобы
изменять тект на кнопке".
Среди многих типов ресурсов, которые сохранены в .exe файле, интерес
представляет RT_RCDATA, который хранит информацию, которая были в DFM файле
перед трансляцией. Чтобы извлеч DFM данные из .exe файла, мы можем вызываться
API функцией EnumResourceNames.
Исскуство декомпилирования традиционно было уделом мастеров, знакомых с
ассемблером и отладчиками. Некоторые Delphi декомпиляторы создают впечатление,
что любой, даже с ограниченными техническими знаниями, может изменить по своему
желанию большинство исполняемых файлов Delphi.
И в заключение, если Вы заинтересовались декомпилованием, то предлагаю Вам
несколько Delphi декомпиляторов:
- DeDe
- DeDe довольно шустрая программка, позволяющая анализировать
экзешники, скомпилированные в Delphi. После декомпиляции DeDe
даёт Вам следующее:
- Все dfm файлы. Вы сможете открывать их и
редактировать в Delphi
- Все объявленные методы с хорошо
комментированным кодом на ассемблере с ссылками
на строки, импортированных функций, методов и
компонент в юните, блоки Try-Except и
Try-Finally.
- Большое количество дополнительной
информации.
- Вы можете создать папку Delphi проекта со
всеми файлами dfm, pas, dpr. Не забудьте, что
pas файлы содержат ассемблерный код.
- Revendepro
- Revendepro находит почти все структуры (классы, типы,
процедуры, и т.д.) в программе, и генерирует их паскальное
представление, процедуры естевственно будут представлены на
языке ассемблера. К сожалению, полученный ассемблерный код не
может быть заново откомпилирован. Так же доступен исходник этого
декомпилятора. К сожалению, этот декомпилятор не совсем рабочий
- генерирует ошибку при декомпиляции.
- MRIP
- Позволяет извлекать из Delphi приложения любые ресурсы:
курсоры, иконки, dfm файлы, pas файлы и т.д. Но главная его
особенность - это способность извлекать файлы, хранящиеся в
других файлах. Поддерживается более 100 форматов файлов. MRip
работает под DOS.
- Exe2Dpr
- Эта программа может восстановить частично потерянные
исходники проекта. Не имеет интерфейса и работает с командной
строки, например: 'exe2dpr [-o] exeFile' ( исходники проекта
будут созданы в текущей директории).
|