Декомпіляція в Delphi
Читаючи форуми з програмування, іноді натикаєшся на запитання типу: "У мене є скомпільованій на Delphi. Як мені отримати її вихідний код?". Зазвичай таке питання виникає, коли програміст втратив файли проекту і у нього залишився тільки .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 декомпілятори:
Revendepro
Revendepro знаходить майже всі структури (класи, типи, процедури, і т.д.) в програмі, і генерує їх паскальное уявлення, процедури естевственно будуть представлені на мові асемблера. На жаль, отриманий асемблерний код не може бути заново откомпилирован. Так само доступний исходник цього декомпілятори. На жаль, цей декомпілятор не зовсім робочий - генерує помилку при декомпіляції.
MRIP
Дозволяє витягувати з Delphi додатки будь-які ресурси: курсори, іконки, dfm файли, pas файли і т.д. Але головна його особливість - це здатність витягувати файли, що зберігаються в інших файлах. Підтримується більше 100 форматів файлів. MRip працює під DOS.
Exe2Dpr
Ця програма може відновити частково втрачені вихідні проекту. Не має інтерфейсу і працює з командного рядка, наприклад: 'exe2dpr [-o] exeFile' (исходники проекту будуть створені в поточній директорії).