Современные решения

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

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

Обзор декомпиляторов


Предисловие

Статья первоначально писалась для спец выпуска журнала Xakep. И вышла в апрельском номере 2005 года. На сегодняшний день многие данные актуальны. Большинство описываемых продуктов с тех пор не обновлялись, а доступных альтернатив у них так и не появилось. Но есть и существенные изменения. К примеру P32Dasm на данный момент уже довольно стабилен, а VB Decompiler настолько расширил свой функционал, что сравнивать версию 2005 года и текущую равнозначно сравнению DOS и Windows 11. Сегодня VB Decompiler является самым продвинутым средством для декомпиляции программ, написанных на Visual Basic. Теперь декомпилятор отлично работает с Native Code, умеет выдавать аналитические отчеты, поддерживает трассировку и дизассемблирует 32х и 64х битные .NET сборки.

Методика восстановления исходного кода

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

Введение

С чего же начала свою жизнь идея декомпиляции уже готовых программ обратно в исходник? Как ни странно - с наличия в этих самых экзешниках избыточной информации и однотипности своеобразных структур и операторов, используемых в языках высокого уровня! Это позволило из машинных кодов откомпилированного файла выделить эти структуры и попытаться восстановить (хотя бы частично) исходный код. Как известно - лучше всего декомпилируются программы, которые выполняются не процессором, а виртуальной машиной. Можно привести множество примеров. Это и Java, и .NET, и Visual Basic, и FoxPro. Список можно продолжать еще долго, я лишь назвал самые яркие и всем известные примеры. Причина упрощения написания декомпилятора в том, что инструкции виртуальных машин как правило высокоуровневые и объединяют сразу несколько машинных команд. Иными словами это те же операторы и ключевые слова языка программирования, только записанные немного иначе и с некоторой оптимизацией инструкций языка разработки. Вторыми по простоте декомпиляции идут программы, написанные на таких языках программирования как Delphi и C++ Builder. Несмотря на то, что данные языки не имеют дело с виртуальными машинами, а компилируют программы в нормальный native код - они позволяют себе использовать собственные стандартные библиотеки типа VCL и оставляют в EXE файлах много избыточной информации, используя которую можно также написать практически полный декомпилятор этих языков. Что же касается новомодной среды разработки .NET, то благодаря огромному количеству избыточной информации, хранящейся в EXE файлах компилируемых программ, можно чуть ли не 100% восстановить исходный код написанный автором. Разработчики сего проекта вовремя опомнились и начали писать так называемые обфускаторы кода, способные вычищать избыточную информацию из EXE файлов программ, но мало кто об этом пока знает, а вот сама среда разработки уже вовсю используется. К чему это ведет - все прекрасно знают. Ладно, с причиной возможностей декомпиляции вроде разобрались, теперь давайте посмотрим, какие же декомпиляторы уже написаны, как их использовать и насколько же высоки их возможности по восстановлению исходных кодов.

Dede by DaFixer

Dede by DaFixer

Самый знаменитый декомпилятор программ, написанных на Delphi, причем всех версий вплоть до Delphi 7! Восьмая версия естественно не поддерживается, так как там .NET, но для него свои декомпиляторы, так как там уже не native код. Написан он парнем с ником DaFixer. Этот парень поистине молодец. Мало того, что он написал такой классный инструмент, но и не пожалел для народа исходник одной из старых версий этого декомпилятора. В общем, если продукт нужен - ссылку на скачивание найти не проблема. Что же умеет программа? А умеет она очень многое. Для начала предоставляет все формы в первоначальном виде и дает возможность полазить про процедурам и функциям, имеющимся в программе. Помимо дизассемблерного листинга этих функций программа пытается распознать стандартные операторы и типы Delphi и добавляет их в коментарии к ассемблерному коду. Особенно радует распознавание конструкций типа:

try .. except .. end;

Если Вы используете Win32dasm в качестве ддизассемблера (о ужас) - программа может экспортировать данные в понятный ему формат. Вообще весьма позитивный продукт. Плюс ко всему программа может сгенерировать исходник, который можно открыть в Delphi. Главный минус - DeDe не может выдергивать из EXE компоненты используемые в программе, потому в исходнике будет множество нераспознанных типов данных.

SourceRescuer

SourceRescuer

Еще один декомпилятор Delphi, но попроще. Может восстанавливать только формы и генерировать заголовок pas файлов. Главное отличие от DeDe - работает мгновенно и имеет более эргономичный интерфейс. Чтож, одной программе дано иметь крутой интерфейс, другой - большие возможности. тут ничего не поделаешь. Из главных особенностей программы можно выделить то, что она генерирует шаблон исходника не только в формате Delphi, но и в формате C++ Builder. Думаю эта фишка не лишняя, так как после компиляции билдерские программы от дельфевых мало чем отличаются, а вот декомпилировать их только как Delphi код - не всегда разумно. Программа эта распространяется в друх видах: GUI и консольном и требует покупки лицензии.

Взять данный декомпилятор можно отсюда: www.ems-hitech.com

REC by Giampiero Caprino

Полное название - the Reverse Engineering Compiler. Программа предназначена для декомпиляции файлов, написанных на языках использующих С++. Так как C++ очень мощный язык, который не приемлит виртуальных машин и огромных GUI библиотек, то можно сделать очень логичный вывод, что избыточной информации он в EXE практически не вставляет. Отсюда имейте ввиду, что данный декомпилятор всего лишь пытается распознать C++ код, а по большей части как бы конвертирует код с ассемблера на C++. Не удивляйтесь, если увидите в исходнике что нибудь типа:

eax++; for(eax=1000;eax=0;eax--) { ebx = ebx and eax; }

Это нормально. И поверте, лучше уж исследовать это, чем:

00400000: inc eax 00400001: mov eax, 1000 00400006: and ebx, eax 00400008: loop 00400006

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

.NET Reflector by Lutz Roeder

.NET Reflector

Динамично развивающийся бесплатный и мощный декомпилятор .NET сборок. Практически любой EXE файл, собранный на .NET технологии он может представить в виде полного исходника со всем деревом наследования классов. Подсветка синтаксиса, гиперссылки на объекты классов, удобный и приятный интерфейс. Все это говорит лишь об одном: в декомпилировании .NET сборок этой программе нет равных. Если Вы хотите взглянуть на свою разработку глазами исследователя - этот декомпилятор то что нужно! Must Have однозначно. Также у программы есть "младший брат" - тулза для выдирания ресурсов из .NET сборок. Эта примочка также бесплатна и лежит на то же сайте, что и Reflector.

За программой и ее обновлениями не забудьте зайти на сайт www.aisto.com/roeder/dotnet

DJ Java Decompiler

DJ Java Decompiler

А это уже декомпилятор Java классов. Довольно удобен и прост в использовании. открываешь в нем класс и уже созерцаешь исходник. Имеется довольно мощная подсветка синтаксиса, поиск и настройки. Также есть браузер классов и объектов. В общем довольно мощный и интересный декомпилятор. Жаль только EXE файлы написанные на Java не декомпилирует.

Программу можно скачать отсюда: members.fortunecity.com/neshkov/dj.html

ReFox by Jan Brebera

ReFox

Со слов людей, работающих на FoxPro - довольно мощный декомпилятор кода, напинанного на фоксе. Причем версия фоксы не критична - декомпилятор берет и Dos и Windows версии. Декомпилятор поддерживает не только стандартные, но и закриптованные фоксой модули. Даже если код был скомпилирован под Macintosh - декомпилятор возмется его декомпилировать и даже портирует выходной вариант под DOS/Windows. В общем, если Вы долго разрабатывали экономическую программу для своего отдела 20 лет назад и ненароком держали исходники на стареньком винте, который приказал долго жить - скачайте ReFox - он сочтет за честь восстановить Ваш код.

Декомпиляторы Visual Basic’а

Я не зря решил их все объединить под общим заголовком. Во первых их очень много, во вторых все декомпиляторы разделяются по возможностям на три типа: декомпиляторы форм, редакторы форм и декомпиляторы кода. Также есть декомпиляторы, сочетающие в себе несколько возможностей - о них мы поговорим в самом конце. А сейчас представлю тебе все три типа декомпиляторов.

VBRezQ

VBRezQ

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

Саму программу можно найти тут: www.vbrezq.com

VB Editor by HEXMAN

VB Editor

Абсолютно бесплатный редактор форм и лежащих на них объектах. Если Вы занимаетесь русификацией программ, но не можете ничего поделать с программами, написанными на VB (Restorator тут бессиллен) - смело используйте данную утилиту. Она просто рай для локализаторов интерфейса. Программа имеет двухязычный интесфейс (Французский и Английский), причем по дефолту почему-то грузится Французский. Причем поможет и сгенерировать форму, на основе сделанных изменений, так что вполне подойдет и как альтернатива уже упомянутого выше VBRezQ.

Саму программу можно найти тут: www.multimania.com/hexman

VBReFormer by Sylvain Bruyere

VBReFormer

Еще одна работа французских программистов. Эта программа несколько помощнее предыдущей. Помимо просмотра и изменения форм предоставляет также возможность извлечь из EXE всякие изображения, которые обычно лежат в frx файлах. Trial версия позволяет только просматривать результаты. При этом не только запрещается сохранять результат, но и вообще программа постоянно обнуляет буфер обмена дабы исключить и возможность копирования. Отсюда прежде чем запускать данную утилиту - убедитесь, что в буфере нет нужных и еще не сохраненных данных. Помимо всего прочего программа предоставляет для обзора некоторые данные из заголовка EXE файла, потому адрес точки входа в программу и Image Base можно узнать прямо не отходя от VBReFormer’а. Еще один плюс софтины - она умеет распознавать используемые в декомпилируемой программе ActiveX файлы и позволяет просмотреть некоторые их свойства и методы. Жаль только что не использует эту информацию при генерации форм - там все ActiveX’ы выглядят немного убого, без свойств и присвоенных им данных. При желании эта тулза может обыскать весь Ваш жесткий диск в поисках программ, написанных на VB. Зачем это нужно - не знаю, наверное для тестирования возможностей программы на разных EXE’шниках.

Если Программа приглянулась, то Trial версию можешь взять здесь: www.decompiler-vb.tk

RaceEx6

RaceEx6

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

Скачать можно с www.raceco.us

exdec by josephco

exdec

Наверное самый известный на момент написания статьи декомпилятор пикода. Как говорится старенький, но рабочий. Возможность у программы всего одна - декомпилить p-code в том виде в каком он есть. То есть того кода который писал программист на VB Вы не увидите, а вот то что сгенерил компилятор - да, причем в довольно читабельном для профессионала виде. В комплекте с программой идут примеры и небольшой туториал. Туториал поможет хотя бы немного понять, что значит вся эта декомпилированная гора псевдокода и как ее читать, потому если Вы разбираетесь с P-Code’ом впервые - очень советую обратить на этот туториал внимание.

VBParser

VBParser

Почти полный аналог exdec, только написанный китайскими разработчиками. Результат своей работы не только выводит на экран, но и сохраняет в файле ParseVB.txt. На случай падения программы (а такое частенько случается) - этот файл здоровски помогает.

p32Dasm by DARKER

p32Dasm

Лучшая альтернатива exdec’у и VBParser’у. Программа в отличии от двух предыдущих написана на VB (exdec и VBParser написаны на C++) и динамично развивается последнее время. Имеет подсветку синтаксиса, калькулятор адресов, умеет декомпилировать с определенного смещения в файле, а также подобно дизассемблерам способна представить все строки и функции используемые в программе удобным списком с возможностью мгновенно перейти на выбранную позицию. Главный недостаток - относительная нестабильность работы и медленная скорость, в остальном же программа стоит того, чтобы ее посмотреть. Распространяется бесплатно.

Скачать можно отсюда: progress-tools.x10.mx/p32dasm.html

VBDE by iorior

VBDE

Довольно неплохой декомпилятор, причем бесплатный. Декомпилит формы (правда без ActiveX’ов, если они присутствуют). Выдает адреса на все процедуры, а если это возможно, то выводит не только адрес процедуры, но и ее имя, что значительно упрощает анализ. Пытается декомпилировать Native Code, хотя в большинстве случаев кроме операторов сложения, вычитания и вывода MessageBox'а - ничего декомпилировать не может. Несмотря на это программа довольно удобная и стабильная, потому рекомендую всегда иметь под рукой.

Semi VB Decompiler by vbgamer45

Semi VB Decompiler

Довольно интересный проект. До недавнего времени распространялся в исходниках на VB, а теперь стал коммерческим. Несмотря на некоторые баги в работе, бесплатная версия может довольно многое. Декомпилируются формы, содержащаяся в них графика и названия процедур. Также определяются используемые в программе API функции. Помимо этого, предоставляется информация из EXE заголовков. Есть даже попытки декомпилировать P-Code. Так что продукт создает довольно приятное впечатление. Огромный респект автору за открытость исходного кода - думаю многим полезно будет в них заглянуть, чтобы понять, как декомпилируется VB код. Честности ради скажу - исходник этот жутко неоптимизированно написан, и порой смотря на некоторые участки кода хочется плакать, хотя этот код и выполняет свои функции. Но повторюсь - это бесплатно, а бесплатное не обсуждается.

Актуальная версия находится тут: github.com/VBGAMER45/Semi-VB-Decompiler

VB Decompiler by DotFix Software

VB Decompiler

Вот мы и дошли до моего декомпилятора Visual Basic. При его создании я пытался внести как можно больше возможностей, при этом не загромождая интерфейс тем, что никогда не пригодится. В итоге имеем декомпилятор форм, с поддержкой ActiveX’ов лежащих на них, декомпилятор P-Code’а (причем если в бесплатной Lite вресии он напоминает p32Dasm’овский, то в коммерческой версии программа восстанавливает более 85% исходного кода, что часто помогает востанновить нужные потерянные куски), декомпилятор Native Code (да да - полное дизассемблирование, а также восстановление до 60% исходных инструкций) и декомпилятор ссылок на API (при этом они записываются уже в объявленном виде со всем списком параметров). Ясное дело, что подсветка синтаксиса тоже есть и она имеет очень высокую скорость обработки текста. Для каждого модуля с кодом свой список встречающихся там строк с возможностью мгновненно перейти на участок кода, где используется выделенная строка. Присутствует также и поиск, помогающий найти нужный код в активном окне. Резульат своей работы программа может сохранить, причем вместе с кодом и формами сохраняются и frx файлы с графикой и корректно прописываются ссылки на эти графические объекты в формах. В общем, если Вам требуется наиболее современное и продвинутое средство для частичной, но максимально возможной декомпиляции Native Code и P-Code - предлагаю рассмотреть приобретение коммерческой лицензии на VB Decompiler Pro. Если же декомпиляция в понятный VB код не нужна, а достаточно дизассемблирования Native Code и P-Code - вполне можете ограничиться бесплатной Lite версией VB Decompiler.

Заключение

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

Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: