Профессиональные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: Чубченко Сергей Георгиевич. Дата публикации: 02.11.2026

DE Decompiler 26.7: восстановление логики программ и анализ форм VCL

Вышел DE Decompiler 26.7. Главное направление этого выпуска — более точное восстановление логики программы из машинного кода с сохранением связей между значениями, ветвлениями и вызовами. Улучшены обработка условий, восстановление строковых результатов, унаследованных свойств и аргументов функций. Повышены точность распознавания библиотек и стабильность анализа.


DE Decompiler предназначен для антивирусных аналитиков, экспертов по компьютерной криминалистике, сотрудников отделов безопасности и разработчиков программного обеспечения. Он помогает исследовать VCL-приложения Win32 и Win64, написанные на Delphi или созданные в C++Builder: изучать их логику, искать скрытую или потенциально нежелательную функциональность, сопоставлять интерфейс с реализацией. Восстановленные формы, модули, классы и функции связаны с Delphi-подобным Pascal-кодом, дизассемблированными инструкциями и байтами файла. Ниже рассмотрены ключевые изменения версии 26.7 и возможности исследования программ, появившиеся в последних выпусках.


Условия, ветвления и возвращаемые значения функций


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


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


Порядок вызовов особенно важен, если вычисление выражения изменяет состояние программы. Если функция была вызвана один раз, а её результат используется повторно, листинг должен сохранять эту последовательность. В версии 26.7 улучшена обработка таких результатов: один вызов не превращается в несколько, в том числе при выборе значений и в условиях циклов. Проверки типа объекта и приведения с проверкой типа во время выполнения в большем числе случаев представляются операторами is и as, с сохранением необходимых проверок и исключений.


Восстановленный код обработчика события: строки, условия, свойства элементов управления и вызов метода VCL.
Восстановленный код обработчика события: строки, условия, свойства элементов управления и вызов метода VCL.

Строковые результаты, свойства и библиотечные вызовы


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


Отдельное внимание уделено унаследованным свойствам VCL. Больше вызовов методов записи свойств восстанавливается в виде присваиваний, например свойствам Text и Caption. При чтении свойства сохраняется уже полученный строковый результат вместо повторного обращения к нему. Если подпрограмму нельзя достоверно распознать как метод доступа к свойству, в листинге остаётся вызов с его аргументами и возвращаемым значением.


Точнее различаются одноимённые классы из разных библиотек, быстрее распознаются унаследованные библиотечные методы, уменьшается число неоднозначных совпадений. Ускорена загрузка баз знаний о библиотеках и повышена стабильность чтения небольших баз.


Разрядность значений, преобразования и стабильность анализа


Улучшено определение размеров локальных переменных и счётчиков, точнее сохраняются особенности 8- и 16-битной арифметики. Корректнее обрабатываются знаковые и беззнаковые целочисленные преобразования, в том числе для 64-битных значений. При преобразованиях логических значений сохраняются исходная разрядность и нестандартные представления True. Повторное использование локальных переменных реже приводит к ошибочным подстановкам или повторным чтениям памяти.


Круглые числовые константы выводятся в десятичной записи там, где это уместно. Распознанные адреса и битовые маски остаются шестнадцатеричными. Так обычные числовые значения легче читать, а представление адресов и масок сохраняет связь с машинным кодом.


Устранены сбои при анализе процедур со встроенными данными или необычными инструкциями возврата. Улучшена работа со стеком при нестандартных соглашениях о вызовах и исправлены ошибки переполнения во время анализа машинного кода. Некорректные описания API-вызовов больше не приводят к чрезмерному выделению памяти; нераспознанные аргументы сохраняются в результате декомпиляции.


От восстановленной формы VCL к обработчикам событий


В предыдущих выпусках существенно расширены возможности визуального анализа. DE Decompiler читает текстовые и двоичные ресурсы DFM и восстанавливает визуальное представление поддерживаемых форм VCL. Меню, вкладки, панели инструментов, списки и другие поддерживаемые элементы отображаются с текстом, свойствами и расположением, сохранёнными в ресурсах. Для этого не требуется запускать исследуемую программу или загружать классы её компонентов.


Можно выбрать элемент управления, изучить его восстановленные свойства и перейти к обработчику события. Представление DFM в текстовом виде поддерживает подсветку синтаксиса, сворачивание блоков, поиск и историю переходов. Поддержка ряда компонентов AlphaSkins и TMS позволяет исследовать интерфейсы большего числа приложений. Плагин FRX Image Viewer извлекает графику форм и отдельные значки из распознанных списков ImageList.


Восстановленная форма в режиме просмотра, дерево проекта и свойства выбранного элемента управления.
Восстановленная форма в режиме просмотра, дерево проекта и свойства выбранного элемента управления.

Исследование логики приложения и кода работы с базой данных


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


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


Результат можно сохранить в виде модулей Pascal, файлов DFM, проекта Delphi или единого листинга Pascal. Базы анализа VDD позволяют сохранить восстановленную структуру и переименованные символы, чтобы продолжить исследование позднее. Общий SDK плагинов позволяет создавать собственные инструменты, в том числе с переходами по виртуальным адресам и пометками функций.


Код приложения со свойствами подключения, текстом SQL и условием по количеству записей результата запроса.
Код приложения со свойствами подключения, текстом SQL и условием по количеству записей результата запроса.

Программы, написанные на Delphi или созданные в C++Builder


DE Decompiler поддерживает VCL-приложения для Win32 и Win64, написанные на Delphi 3–13. Для VCL-приложений, созданных в C++Builder, также доступны восстановление и визуализация форм, разбор модулей, классов и функций, переходы к обработчикам событий и остальные средства анализа на тех же лицензионных условиях. Для обеих групп программ код представляется на Delphi-подобном Pascal и экспортируется в PAS/DFM.


Для программ, написанных на Delphi, объём распознаваемой библиотечной информации шире. Базы знаний RTTI для специфичных библиотек C++Builder пока не подготовлены, поэтому вызовы, свойства и методы за пределами распознанных возможностей VCL могут получать сгенерированные имена. Это влияет на качество восстановления кода, а не на доступность остальных средств анализа приложений, созданных в C++Builder.


Полнота восстановления определяется инструкциями и метаданными, сохранившимися в исполняемом файле. Исходные имена локальных переменных не восстанавливаются. Типы и структуры данных определяются по доступным метаданным и эвристически — по размерам и обращениям в машинном коде. Нераспознанные вызовы получают сгенерированные имена. В восстановленном коде могут оставаться неточности; перед использованием результата в IDE необходимы ручной анализ и исправления.


Попробуйте DE Decompiler 26.7


Бесплатная Lite позволяет изучать формы VCL, дизассемблированный машинный код и ссылки на строки. Коммерческая лицензия добавляет высокоуровневую декомпиляцию в Pascal и остальные лицензируемые инструменты. Скачайте актуальную версию и оцените работу с вашими файлами. Подробности использования и полный список изменений приведены в справке и новостях.



© Чубченко Сергей Георгиевич, разработчик DE Decompiler