Карта сайта Хакер в RSS Энциклопедия Хакера PDA версия сайта Почтовые рассылки Хакера    Хакер в Twitter Хакер в ВКонтакте Приложение Хакер для Facebook Хакер на Formspring.me
Журнал Новости Форум Видео Life Xakep Live (блоги)
Bugtrack Статьи Блог Поиск English  
История лайфлоггинга История лайфлоггинга
«Кто мне это сказал?», «Это было в понедельник или во вторник?» Такие вопросы то и дело возникают у нас в головах, и, чтобы ответить на них, приходится напрягать память, пытаться восстановить хронологию событий. Не лучше ли просто отмотать память назад и пересмотреть нужный момент заново?...
Хакер ищет продавцов рекламы Хакер ищет продавцов рекламы
Xakep.ru приглашает стажеров на должность менеджера по работе с клиентами. Резюме присылать по адресу hr@glc.ru....

Декомпиляторы

GPcH (admin@dotfix.net)

Спецвыпуск: Хакер, номер #057, стр. 057-016-1


Обзор средств для восстановления исходного кода программ

Сложность кода, генерируемого компиляторами языков высокого уровня, использование виртуальных машин, новые хитрые форматы хранения данных - VCL, Visual Basic, Java, FoxPro, .NET, наконец – все это ведет к тому, что обычных дизассемблеров native-кода перестало хватать для того, чтобы хоть как-то разобраться в работе программы. Реверсеру потребовались новые инструменты, которые смогли бы раскопать в миллионах байт исследуемой программы до боли знакомые ему строки языка, на котором она была написана. Вдруг выясняется, что стали необходимы декомпиляторы, и в этом обзоре пойдет речь именно о них.

Восстановление исходного кода программы во многом стало возможным из-за массы лишней информации об оригинальном коде в откомпилированном файле, а также из-за однотипности структур и операторов, используемых в языках высокого уровня. Декомпиляторы анализируют избыточную информацию, и, зная, как компилер того или иного языка любит представлять некоторые структуры, пытаются создать на базе сырого кода программы некоторое подобие исходника. У некоторых это даже неплохо получается. Лучше всего декомпилируются программы, которые выполняются не напрямую процессором, а виртуальной машиной (написанные на Java, Visual Basic, FoxPro, .NET и т.п.). Причина этого кроется в том, что инструкции виртуальных машин, как правило, высокоуровневые и объединяют сразу несколько машинных команд. Иными словами, это те же операторы и ключевые слова языка программирования, только записанные немного иначе, с некоторой оптимизацией инструкций языка разработки.

Вторыми по простоте декомпиляции идут программы, написанные на таких языках программирования, как Delphi и C++ Builder. Несмотря на то, что данные языки не имеют дела с виртуальными машинами (кроме разве что платформы .NET), а компилируют программы в нормальный native-код, они любят использовать собственные стандартные библиотеки вроде VCL и оставляют в EXE-файлах много лишней информации, используя которую можно также вполне успешно восстановить исходный код.

Что же касается новомодной среды разработки .NET, то благодаря действительно невероятному количеству избыточной информации, хранящейся в exe-файлах компилируемых программ, можно чуть ли не с 100% точностью восстановить исходный код, написанный кодером. Разработчики сего проекта вовремя опомнились и начали выдавать так называемые обфускаторы кода, способные вычищать лишнюю информацию из программ, чтобы хоть как-то препятствовать декомпиляции, однако об этом пока мало кто знает, а вот сама среда разработки используется уже вовсю. К чему это ведет? К росту количества кейгенов, конечно :).

Что ж, давай посмотрим, какие декомпилеры уже успели появиться на свет.

Dede by DaFixer

Самый знаменитый декомпилятор Delphi. Работает с программами, скомпилированным любыми версиями Delphi, кроме восьмой (так как она создает .NET-код). Парень с ником DaFixer, написавший его, действительно молодец. Мало того, что он создал такой полезный инструмент, он еще и не пожалел для народа исходного кода одной из его старых версий! Подобный сорец может очень пригодиться тому, кто изучает код, генерируемый борландовскими монстрами.

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

ЛИСТИНГ

try

..

except

..

end;

Кроме того, эта программа умеет создавать исходник, который можно открыть в Delphi. А если ты используешь в качестве дизассемблера WDasm (о ужас!), то тебе точно будет полезна возможность Dede экспортировать данные в понятный ему формат. В общем, весьма позитивный декомпилер. Главный минус Dede в том, что он не умеет выдергивать из exe'шника компоненты, используемые в программе. Из-за этого в сгенерированном исходнике присутствует множество нераспознанных типов данных. Но это не большая беда, так как заставить полученный код работать все равно не удастся, как ни крути. А исследовать его – пожалуйста.

  • Программу вместе с сорцами бери на www.wasm.ru.

SourceRescuer

Еще один декомпилер Delphi, но попроще. Умеет восстанавливать формы и генерировать заголовки pas-файлов. Главное отличие от Dede – мгновенная работа и более эргономичный интерфейс. Что ж, одной программе дано иметь крутой интерфейс, другой - крутые возможности, тут ничего не поделаешь. Из главных особенностей декомпилятора можно выделить то, что он может создавать шаблон исходника не только в формате Delphi, но и в формате Builder'а. Фишка простая (после компиляции программы из Delphi и C++ Builder мало чем отличаются), но полезная. Распространяется в двух видах: GUI и консольном. Насколько я понял, требует регистрации.

REC by Giampiero Caprino

Полное название - the Reverse Engineering Compiler. Программа, которая с успехом преобразует в исходный код на С любой попавшийся ей на глаза исполняемый файл. Конечно, сорец получается мало похожим на оригинал, но разобраться в нем будет несложно. REC определяет функции исследуемого файла, основные блоки и структуры языка, такие как if, for, switch, вызовы API, и делает вообще все возможное, чтобы код стал понятным С-программисту. Однако не удивляйся, если увидишь в исходнике что-нибудь вроде:

ЛИСТИНГ

eax++;

for(ecx=1000;ecx!=0;ecx--)

{

ebx = ebx&ecx;

}

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

ЛИСТИНГ

00400000: inc eax

00400001: mov eсx, 1000

00400006: and ebx, ecx

00400008: loop 00400006

Хотя на вкус и цвет... Некоторые знают ассемблер даже лучше, чем русский матерный. Из приятных мелочей: кроссплатформенность (кроме Windows, декомпилятор считает родными Linux, Mac OS X и Solaris); поддержка нескольких форматов исполняемых файлов (REC не ограничился одними PE и COFF, он умеет анализировать и ELF, и AOUT, и даже Playstation PS-X).

.NET Reflector by Lutz Roeder

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

DJ Java Decompiler

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

ReFox by Jan Brebera

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

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

Взлом приложений, созданных с помощью Visual Basic и скомпилированных в p-код, был мукой для взломщиков до тех пор, пока не стали появляться нормальные декомпиляторы этого языка. Сейчас их уже очень много, практически на любой вкус. Они делятся на три типа: декомпиляторы форм, редакторы форм и декомпиляторы p-кода. Также есть программы, сочетающие в себе сразу несколько возможностей, о них мы тоже не забудем.

VBRezQ

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

VB Editor by HEXMAN

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

VBReFormer by Sylvain Bruyere

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

  • Если программа тебе приглянулась, то trial-версию можешь взять здесь: www.decompiler-vb.tk. Думаю, ты сумеешь поладить с ней.

RaceEx6

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

exdec by josephco

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

  • Найти родной сайт программы поможет только Google. Сам дистрибутив же можешь взять с www.wasm.ru или нашего диска.

VBParser

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

  • Бери ее с диска - судя по всему, она не имеет родного сайта.

p32Dasm by DARKER

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

VBDE by iorior

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

  • Сайта у программы нет - бери ее с диска.

Semi VB Decompiler by vbgamer45

Довольно интересный проект. До недавнего времени распространялся в исходниках на VB, а теперь стал коммерческим. Несмотря на некоторую глючность, бесплатная версия умеет довольно многое. Декомпилятся формы, содержащаяся в них графика и названия процедур. Также определяются используемые в программе API-функции. Помимо этого, предоставляется информация из заголовков PE. Есть даже попытки декомпилировать p-код. В общем, создается довольно приятное впечатление. Огромный респект автору за сорцы. Думаю, многим будет полезно заглянуть в них, чтобы понять, как происходит анализ кода VB. Честности ради скажу, что исходники написаны жутко, и порой, когда смотришь на некоторые участки кода, хочется плакать, хотя код этот и выполняет заложенные в него функции. Но, как говорится, дареному коню в зубы не смотрят. Поэтому быстрее беги на http://pscode.com/vb/scripts/ShowCode.asp?txtCodeId=55935&lngWId=1, пока сорцы еще там, а если хочешь, купи у автора новую версию - поддержи парня.

VB Decompiler by GPcH

А вот мы и дошли до моего собственного декомпилера VB. Я пытался внести в него как можно больше возможностей, при этом не загромождая интерфейс тем, что никогда не пригодится. В итоге имеем: декомпилятор форм с поддержкой ActiveX'ов, лежащих на них (при этом декомпилятся только общие для всех ActiveX'ов свойства), декомпилятор p-кода (причем, если в бесплатной Lite-версии он напоминает p32Dasm'овский, то в Pro-версии программа пытается перевести p-код в исходникоподобный читабельный вид, что часто помогает быстрее восстановить нужные куски кода) и декомпилятор ссылок на API (при этом они записываются уже в объявленном виде со всем списком параметров). Подсветка синтаксиса тоже есть. Также для каждого модуля с кодом есть свой список встречающихся там символьных строк с возможностью мгновенно перейти на участок кода их использования. Присутствует также поиск, помогающий найти нужный код в активном окне. Результат работы можно сохранять, причем вместе с кодом и формами сохраняются и frx-файлы с графикой и корректно прописываются ссылки на эти графические объекты в формах. В общем, если тебе не нужен детальный декомпиль p-code'а, вполне можешь ограничиться бесплатной Lite-версией. Если все же нужна Pro, пиши мне на мыло - договоримся о цене. Кстати, программа еще не выросла до стадии разработки и имеет некоторые баги (все-таки, на момент написания статьи, версия 0.2). И еще: декомпилер предназначен только для восстановления твоих исходников, если вдруг ты их потерял и у тебя есть только EXE. Если же ты роешься в чужой программе, помни: вся ответственность за это лежит на тебе, поэтому не забывай читать лицензионное соглашение, прежде чем лезть в чужой код :).

Здесь же лежат примеры работы Pro-версии.

Заключение

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

Содержание  





Предыдущие номера


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

    Rambler's Top100