Читая форумы по программированию, иногда натыкаешься на вопрос типа: «У меня есть откомпилированная программа на Delphi. Как мне получить её исходный код?». Обычно такой вопрос возникает, когда программист потерял файлы проекта и у него остался только .exe. Как правило полностью восстановить исходный код на языке высокого уровня невозможно. Значит ли это, что другие тоже не смогут восстановить исходный код Вашей программы ? Хм . и да и нет .
Для начала сразу скажу, что восстановить исходный код в точности каким он был однозначно невозможно, так как не существует в мире такого декомпилятора, который бы смог сотворить такое.
После компиляции и линковки проекта и получения исполняемого файла все имена, используемые в программе конвертируются в адреса. Потеря имён означет, что декомпилятор создаст уникальное имя для каждой константы, переменной, функции и процедуры. Даже если мы и достигнем какого-то успеха в декомпиляции исполняемого файла, то получим уже другой синтаксис программы. Данная проблема связана с тем, что при компиляции практически идентичные куски кода могут быть скомпилированы в разные последовательности машинных команд (ASM), которые присутствуют в .exe файле. Естевственно декомпилятор не обладает такой степенью интеллектуальности, чтобы решить — какова же была последовательность инструкций языка высокого уровня в исходном проекте.
Программирование в Delphi / Урок 1. Знакомство со средой разработки. Приложение «Привет, мир!»
Когда же применяется декомпиляция ? Для этого существует довольно много причин. Вот некторые из них:
— Восстановление исходного кода;
— Перенос приложения на другую платформу;
— Определение наличия вирусов в коде программы или вредоносного кода;
— Исправление ошибок в программе, в случае, если создатель приложения не собирается этого делать 🙂
Легально ли всё это ? Хотя декомпиляция и не является взломом, но утвердительно ответить на этот вопрос довольно сложно. Обычно программы защищены законом об авторских правах, однако в большинстве стран на декомпиляцию делается исключение. В часности, когда необходимо изменить интерфейс программы для конкретной страны, а сервис приложения не позволяет этого сделать.
На данный момент 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’ ( исходники проекта будут созданы в текущей директории).
Источник: sources.ru
Язык программирования Delphi: Комментарии и переменные (Урок №3)
Язык программирования Delphi довольно прост в изучении, но при этом, он достаточно мощный. На этом языке программирования написано очень много действительно крутых программ, таких как: Open Server, Total Commander, Skype (до того, как это приложение выкупила компания Microsoft), Light Alloy, The KMPlayer, AIMP, FastStone Image Viewer, Guitar Pro (до версии 6.0), FL Studio, Sublimetext и много других.
В прошлых уроках, мы ознакомились с оболочкой Delphi (интегрированной средой разработки программ). А начиная с этого урока — мы уже начнем изучать сам язык программирования Delphi.
И первое с чего предлагаю начать наше обучение — это комментарии в Delphi.
Что такое комментарии в программировании?
Комментарии — это любой текст, который никак не влияет на код программы. Комментарии никогда не компилируются и не добавляются в исполняемый файл. Они используются разработчиками, для того чтобы пояснить тот, или иной участок кода.
В Delphi комментарии можно оформить двумя способами:
- Используя двойной слеш. Все что находится после двойного слеша в Delphi — это комментарий. Но так можно закомментировать только одну строку.
- Используя фигурные скобки. Все что заключено в фигурные скобки — это тоже комментарий. Этим способом можно закомментировать несколько строк.
Вот небольшой пример:
// Это комментарий А это уже не комментарий Это не комментарий // А вот это уже комментарий
Когда я буду показывать вам примеры программ на Delphi, я постоянно буду использовать комментарии, чтобы вам было понятно, для чего я пишу тот, или иной код.
Давайте создадим новый проект в Delphi, или откроем тот проект, который мы создавали на прошлом уроке, и подробно рассмотрим каждую строчку его кода.
Если кто забыл, то напомню — чтобы переключаться между визуальной формой и редактором кода нужно использовать клавишу . Нажимаем F12 и таким образом переходим в редактор кода.
Я понимаю, что пока для вас все это «темный лес», но в процессе создания реальных программ, всё начнет проясняться. Запомнить всё сразу невозможно, да и не нужно. Главное сейчас понять смысл написанной программы.
unit Unit1; // Имя модуля // начало объявления интерфейсов interface uses // после этого слова идет перечисление подключенных модулей Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type // после этого слова идет объявление типов TForm1 = class(TForm) // Начало описания нового объекта TForm1 // Здесь описываются компоненты и события private // После этого слова можно описывать закрытые данные объекта < Private declarations >// это подсказка, которую сгенерировал сам Delphi public // После этого слова можно описывать открытые данные объекта < Public declarations >// это подсказка, которую сгенерировал сам Delphi end; var // Объявление глобальных переменных Form1: TForm1; // Это описана переменная Form1 типа объекта TForm1 // начало реализации implementation // подключение .dfm файла. Это файл с данными о визуальных объектах end. // конец модуля (слово end с точкой)
А вот то, что я обязательно рекомендовал бы запомнить вам прямо сейчас.
Точка с запятой «;» в Delphi обозначает конец оператора.
Как видите, в приведенном выше примере кода, в конце нескольких строк проставлен именно этот знак.
Знак «;» ставится только после оператора! И этот знак никогда не ставится после ключевых слов. Если смотреть на наш код, то после uses, type, begin, implementation, private, public точка с запетой не ставится.
Большинство ключевых слов выделяются жирным шрифтом.
Структура кода в Delphi
В самом начале нашего кода стоит имя модуля. Это имя такое же, как и имя файла модуля, но без расширения. Вручную менять это имя не желательно. Оно формируется тогда, когда вы сохраняете свой проект (или модуль) выбрав меню File | Save As.
После имени модуля идет раздел interface. В нём описываются интерфейсы модуля, которые мы будем реализовывать. Концом данного раздела является ключевое слово implementation (реализация).
После implementation начинается ещё один раздел и заканчивается он словом end с точкой.
Весь код, который мы напишем в разделе interface будет доступен другим модулям, которые подключат данный модуль. Таким образом, все переменные, которые мы объявим здесь, будут доступны и в других модулях.
В разделе interface также могут быть и подразделы: uses, type, var и const.
В uses происходит подключение глобальных модулей. То есть, если нам нужно получить доступ к переменным, функциям, константам и процедурам, которые описаны в каком-то другом модуле, то его нужно подключить к текущему модулю. И делается это именно здесь — в uses.
Например, мы хотим, чтобы при нажатии на кнопку осуществлялся запуск браузера, и в нём открывалась какая-нибудь ссылка. Для этого уже есть готовая функция ShellExecute. И все, что нам нужно — это указать компилятору путь, где описана эта функция, понятным компилятору языком. Поэтому в uses мы прописываем ShellApi. Теперь для реализации нашей задумки достаточно написать всего лишь одну строчку кода и все заработает без каких-либо проблем.
ShellExecute(Handle, ‘open’, ‘https://d-nik.pro’, nil, nil, SW_SHOWNORMAL) ;
Любой программный код в Delphi заключается между begin и end (операторные скобки).
Например, если мы создаем процедуру, то сначала пишем её имя, а потом весь код этой процедуры помещаем между операторными скобками begin и end.
Объявление переменных в Delphi осуществляется с помощью ключевого слова var. В нашем коде уже объявлена одна переменная — Form1. И поскольку эта переменная описана после объявления объекта и его составляющих, то эта переменная глобальная.
Глобальная переменная — это такая переменная, областью видимости которой является вся программа (если только эта переменная не перекрыта). Глобальные переменные создаются при запуске программы и уничтожаются при выходе из программы. Простыми словами — это такая переменная, которая доступна всегда и везде, пока программа работает.
Чтобы понять разницу между глобальной и локальной переменной, и лучше разобраться как устроен язык программирования Delphi, давайте выполним небольшое практическое задание.
Язык программирования Delphi. Практическое задание.
- Создайте новый проект в Delphi (File — New — VCL Forms Application – Delphi).
- Поместите на форму два компонента TEdit и одну кнопку TButton.
- Сохраните этот проект (Save All).
- Перейдите в редактор кода (F12) и объявите глобальную переменную YourName типа String в разделе interface. Эта переменная будет видна везде и всегда, при работе программы.
- Теперь в Объектном инспекторе выберите компонент TButton (Button1) и на вкладке Events, создайте для него обработчик события OnClick.
- Перед begin, созданной процедуры объявите локальную переменную Age типа String. Эта переменная будет видна только в данном модуле. В других модулях программы мы не сможем ее использовать.
- Между begin и end созданной процедуры, напишите код:
YourName := Edit1.Text; // присваиваем переменной YourName значение Edit1 Age := Edit2.Text; // присваиваем переменной Age значение Edit2
- Теперь создайте ещё одну форму File — VCL Form – Delphi.
- Поместите на эту форму компонент TLabel.
- Для того, чтобы мы могли взаимодействовать с главной формой программы, необходимо подключить модуль Unit1. Для этого в меню File выбираем UseUnit.
- Создайте обработчик события для этой формы OnShow. В объектном инспекторе выберите Form2 TFotm и на вкладке Events кликните рядом с OnShow.
- Напишите код для созданной процедуры:
Label1.Caption := YourName; // присваиваем строке заголовок равный глобальной переменной YourName
- Перейдите на вкладку Unit1 и подключите к нашей главной форме модуль Unit2 (File — UseUnit).
- Добавьте в процедуру TForm1.Button1Click еще одну строку кода:
Form2.Show; // отобразить форму 2
- Сохраните и запустите весь проект.
При нажатии на кнопку у вас должна появиться вторая форма и на ней должен быть выведен тот же текст, что и в Edit1.
А вот если мы попытаемся получить данные переменной Age во второй форме, то у нас ничего не получится.
Label1.Caption := Age;
Компилятор выдаст ошибку:
Undeclared identifier: ‘Age’
Что означает «Необъявленный идентификатор». То есть компилятор не понимает, где находится переменная Age и какие нужно взять данные, чтобы присвоить их заголовку компонента Label1.
Ведь локальная переменная — это переменная, объявленная внутри блока кода. Область видимости такой переменной начинается в точке её объявления и заканчивается в конце этого блока.
Таким образом, переменная Age видна только в пределах процедуры TForm1.Button1Click модуля 1 (Unit1).
Источник: d-nik.pro
Документирование кода в Delphi XE2.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Релиз RD Studio XE2 принес нам довольно много новинок на рассмотрение и проверку работоспособности/важности/необходимости которых у нас, видимо, уйдет весь промежуток времени до релиза XE3. Нововведения типа платформы Firemonkey или механизма LiveBindings сейчас на слуху у многих. Но не стоит забывать и про такие, пусть и не сильно заметные, но тем не менее полезные нововведения как, например, инструмент Documentation Insight. Про нечто подобное этому инструменту я говорил не далее как 27 апреля 2010 года в статье для конкурса на DelphiFeeds.ru, тема которого тогда была «Чего не хватает в Delphi?» И вот моя «хотелка» сбылась — в Delphi XE2 появился довольно удобный инструмент для создания и просмотра документации исходного кода.
Вначале небольшое введение в документирование кода в Delphi.
Содержание скрыть
Документирование кода в Delphi.
Если не рассматривать всякого рода сторонние инструменты для создания документации к вашим исходникам, например, Doc-O-Matic, PasDoc и т.д., то «из коробки» нам остается создание документации на основе XML. Смысл такого документирования заключается в следующем: над элементом код, которые необходимо отразить в документации (класс, метод, переменная и т.д.) помещается специальный блок, каждая строка которого начинается с тройного слэша (///). В этом блоке располагаются XML-теги, содержащие какую-либо информацию по элементу (описание, значения переменных, ссылки на другие разделы документации и т.д.). Например, так можно сделать небольшой описание для класса формы:
На текущий момент, в Delphi XE2 используются следующие XML-теги для формирования документации:
- summary — краткое описание функции или класса
- para — тег, используемый для задания нового параграфа
- c — используется для задания создания моноширинного текста
- code — преформатированный текст, например, исходный код
- remarks — замечания к функции или классу
- param name=»ParameterName» — описание параметра с названием ParameterName
- see — дополнительные источники информации по элементу кода
- returns — описание возвращаемых значений
- exception cref=»EExceptionTypeName» — исключения, которые могут быть сгенерированы в результате работы метода
- permission cref=»PermissionType» — разрешения метода
Используя приведенные выше XML-теги, можно создать, к примеру, такое описание для функции:
Что мы получаем в итоге от использования такого вида документирования? Во-первых в Delphi (по-моему с 2010 версии или с XE) есть такой полезный инструмент как Help Insight, который парсит всю XML-документацию в коде и формирует на основе неё вот такие удобные подсказки:
Собственно, использование для Help Insight XML-документации исходного кода должно вполне хватить для нормальной работы с проектом, если, конечно, версия Delphi хватает. Ну, а если не хватит Help Insight, то, тогда во-вторых — на основе XML-документации можно генерировать HTML-справку по коду о чем я расскажу чуть ниже. А пока перейдем к рассмотрению нового инструмента — Documentation Insight.
Documentation Insight в Delphi XE2
Ранее в Delphi были такие такие инструменты как Code Insight, Help Insight, а теперь ещё появился и Documentation Insight. Этот инструмент разработан в DevJET Software и предназначен для удобного просмотра и создания документации исходного кода. Для вызова Documentation Insght достаточно выбрать в главном меню «Tools -> Documentation Insight Express -> Show Documentation» или же воспользоваться дефолтными горячими клавишами Ctrl+Shift+D. Для документации, представленной выше окно Documentation Insight будет выглядеть следующим образом:
Можете «прилепить» это окно, например, снизу в RAD Studio и иметь всегда под рукой удобный справочник по исходнику. Documentation Insight показывает информацию по коду сразу же как вы вызываете метод или создаете класс.
Чтобы создать документацию с помощью Documentation Insight достаточно установить курсор на необходимый элемент кода и в окне инструмента выбрать вкладку Design:
В Express-версии Documentation Insight мы имеем не такой большой размах по части возможных элементов справки. Всё, что мы можем сделать в редакторе по дефолту — это заполнить для описания класса теги summary и remarks, а для методов Documentation Insight добавит нам возможность заполнения тегов params, т.е. окно дизайнера будет выглядеть так:
Но и этого, думаю, вполне достаточно для небольших проектов, чтобы создать необходимую документацию для исходника. Ограничения редактора Documentation Insight никак не отражаются на работе вьювера. То есть, если я ручками добавлю в справку, например, вот такие теги:
то в итоге при просмотре документации я увижу вот такое описание метода:
Для оформления вашей документации можно также использовать различные дополнительные теги, например seealso для вставки ссылок на сторонние ресурсы или другие разделы документации. Более подробно об XML-тегах для оформления документации Вы можете почитать в справке к Documentation Insight.
Платная версия Documentation Insight стоит 99$ и, как раз-таки, дает в редакторе использовать все возможные теги для оформления документации.
В заключение этой части статьи, предлагаю Вам посмотреть небольшой шестиминутный ролик из серии «31 Days of RAD Studio XE2«, посвященный инструменту Documentation Insight:
[youtube_sc url=»zw8SAX2ZrNA» title=»Documentation%20Insight%20Delphi%20XE2″ color=»white» theme=»light» modestbranding=»1″ fs=»1″]
Создание HTML-документации проекта
Как я говорил выше, на основе нашей XML-разметки для документации исходника можно также генерировать и HTML-справку. Сделать это довольно просто, используя инструмент Model View.
Алгоритм создания HTML-документации в этом случае может быть таким:
1. Создаем необходимые описания классов и методов в исходнике
2. В Project Manager переключаемся на вкладку Model View и соглашаемся включить поддержку моделирования.
3. В открывшемся окне выбираем наш проект и жмем Ok:
Теперь вкладка Model View будет выглядеть так:
4. Жмем в окне Model View правую кнопку мыши и в меню выбираем Generate Documentation:
5. В новом окне выбираем путь к документации, необходимые опции и жмем Ok:
В результате в выбраной директории будут сформированы необходимые файлы HTML-документации, которую можно будет просмотреть в браузере. Выглядеть справка по умолчанию будет так:
Конечно, использовать инструмент моделирования исключительно для того, чтобы сгенерировать HTML-справку — это крайне нерационально, т.к. этот инструмент имеет на порядок больше полезных функций и заслуживает отдельного внимания, но приведенный выше способ создания документации наиболее простой.
Что же касается самой HTML-справки, которую генерирует инструмент Delphi, то тут я, прямо скажу, не в восторге. По сравнению с тем же Doc-O-Matic документация содержит много лишнего, да и графика страдает. Поэтому этим способом создания HTML-документации я в принципе не пользуюсь. А вот Modeling периодически использую, особенно, когда в руки попадает чужой код, но это уже совсем другая история…
В заключение скажу, что новый инструмент Documentation Insight мне понравился даже включая во внимания его урезанную версию. Вполне работоспособный и удобный инструмент для документирования кода. Если разживусь на лишний рубль (а точнее 3к рублей) может даже и платную версию как-нибудь приобрету, если возникнет острая необходимость получить дополнительные «плюшки» для работы, но это всё мечты.
Как Вам новый инструмент? Планируете использовать его в дальнейшей работе?
Книжная полка
Автор: Дмитрий Осипов
Название: Delphi. Программирование для Windows, OS X, iOS и Android
Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
Название: Разработка клиент-серверных приложений в Delphi
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
Название: Delphi. Профессиональное программирование
Описание: Книга рассчитана на подготовленного пользователя ПК, желающего самостоятельно научиться программировать и разрабатывать приложения и базы данных в среде Delphi. Опытные программисты смогут использовать издание как справочник. В тексте подробно описаны более 80 компонентов VCL, функции Object Pascal и Win32 API.
Название: Разработка приложений Microsoft Office 2007 в Delphi
Описание: Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Источник: webdelphi.ru