|
|||||||||||||||||||||||||||||||
Автор: GPcH. Дата публикации: 19.02.2006
|
Обзор декомпиляторовПредисловиеСтатья первоначально писалась для журнала СПЕЦ Xakep. И вышла в апрельском номере прошлого года, потому заранее извиняюсь за немного устаревшие данные. К примеру P32Dasm на данный момент уже довольно стабилен, а в VB Decompiler уже добавлено с того времени столько возможностей, что он уже по настоящему мощное средство для декомпилирования VB программ. Методика восстановления исходного кода Как часто у тебя бывало такое, когда теряешь исходники одной из своих разработок и не можешь их восстановить? Вот бы перевести EXE файл обратно в исходный код, да? Но знакомые либо не могут тебе ничем помочь, либо называют твои идеи бредом. Конечно, того что ТЫ написал в своей программе с точностью до байта уже не восстановить, но частично выдрать сорс из EXE все же можно. Об этом и пойдет речь в данной статье. Введение С чего же начала свою жизнь идея декомпиляции уже готовых программ обратно в исходник? Как ни странно - из-за наличия в этих самых экзешниках избыточной информации и однотипности своеобразных структур и операторов, используемых в языках высокого уровня, что позволило из машинных кодов откомпилированного файла выделить эти структуры и попытаться восстановить (хотя бы частично) исходный код. Как известно - лучше всего декомпилируются программы, которые выполняются не процессором, а виртуальной машиной. Можно привести множество примеров. Это и Java, и Visual Basic, и FoxPro. Список можно продолжать еще долго, я лишь назвал самые яркие и всем известные примеры. Причина упрощения написания декомпилятора в том, что инструкции виртуальных машин как правило высокоуровневые и объединяют сразу несколько машинных команд. Иными словами это те же операторы и ключевые слова языка программирования, только записанные немного иначе и с некоторой оптимизацией инструкций языка разработки. Вторыми по простоте декомпиляции идут программы, написанные на таких языках программирования как Delphi и C++ Builder. Несмотря на то, что данные языки не имеют дело с виртуальными машинами, а компилируют программы в нормальный native код - они позволяют себе использовать собственные стандартные библиотеки типа VCL и оставляют в EXE файлах много избыточной информации, используя которую можно также написать практически полный декомпилятор этих языков. Что же касается новомодной среды разработки .NET, то благодаря огромному количеству избыточной информации, хранящейся в EXE файлах компилируемых программ, можно чуть ли не 100% восстановить исходный код разработанный кодером. Разработчики сего проекта вовремя опомнились и начали писать так называемые обфускаторы кода, способные вычищать избыточную информацию из EXE файлов программ, но мало кто об этом пока знает, а вот сама среда разработки уже вовсю используется. К чему это ведет? К росту кейгенов конечно :) Ладно, с причиной возможностей декомпиляции вроде разобрались, теперь давай посмотрим, какие же декомпиляторы уже написаны, как их юзать и насколько высоки их возможности по восстановлению исходных кодов. Dede by DaFixer ![]() Самый знаменитый декомпилятор программ, написанных на Delphi, причем всех версий, кроме восьмой (для восьмой юзай декомпилеры .NET программ, так как там уже не native код). Написан он парнем с ником DaFixer. Этот парень поистине молодец. Мало того, что он написал такой классный инструмент, но и не пожалел для народа исходник одной из старых версий этого декомпилера. В общем, если сорс нужен - беги на wasm.ru. Что же умеет программа? А умеет она очень многое. Для начала предоставляет тебе все формы в первоначальном виде и дает возможность полазить про процедурам и функциям, имеющимся в программе. Помимо дизассемблерного листинга этих функций программа пытается распознать стандартные операторы и типы дельфей и добавляет их в коментарии к ассемблерному коду. Особенно радует распознавание функций типа:
Если ты ююзаешь Win32dasm в качестве ддизассемблера (о ужас!!!) - программа может экспортировать данные в понятный ему формат. Вобще весьма позитивный декомпилер. Плюс ко всему программа может сгенерить исходник, который можно открыть в Delphi. Главный минус - программа не может выдергивать из EXE компоненты используемые в программе, потому в исходнике будет множество нераспознанных типов данных. Но это не беда, так как рабочий код все равно не получить, а вот исследовать его - пожалуйста. Берегись конкуренты - теперь ты можешь (если тебе конечно плевать на законы, чего я тебе не советую) заглянуть в их код и позаимствовать их идеи. Прогу вместе с исходниками бери с www.wasm.ru SourceRescuer ![]() Еще один декомпилер дельфей, но попроще. Может восстанавливать только формы и генерить заголовок pas файлов. Главное отличие от dede - работает мгновенно и имеет более эргономичный интерфейс. Чтож, одной проге дано иметь крутой интерфейс, другой - большие возмоджности. тут ничего не поделаешь. Из главных особенностей проги можно выделить то, что она генерит шаблон исходника не только в формате дельфей, но и в формате билдера. Думаю эта фишка не лишняя, так как после компиляции билдерские проги от дельфевых мало чем отличаются, а вот декомпилять их только как Delphi код - не всегда разумно. Прога эта распространяется в друх видах: GUI и консольном. Насколько я понял требует регистрации. Взять данный декомпилятор можно отсюда: http://www.ems-hitech.com/ REC by Giampiero Caprino Полное название - the Reverse Engineering Compiler. Прога предназначена для декомпиляции программ, написанных на С++. Так как C++ очень мощный язык, который не приемлит виртуальных машин и огромных GUI библиотек, то можно сделать очень логичный вывод, что избыточной инфы он в EXE практически не пихает. Отсюда имей ввиду, что данный декомпилер всего лишь пытается распознать C++ код, а по большей части как бы конвертирует код с ассемблера на C++. Не удивляйся, если увидишь в исходнике что нибудь типа:
Это нормально. И поверь лучше уж исследовать это, чем:
Хотя кому как. Некоторые знают ассемблер даже лучше чем русский матерный :) Смею еще тебя предупредить, что программа пока работает не очень стабильно по крайней мере версия 1.4, которую я видел. Потому остается только пожелать проекту его дальнейшее развитие, так как прога нужная и думаю пригодится не только исследователям, но и разработчикам. Насколько я помню - прога лежит на www.wasm.ru .NET Reflector by Lutz Roeder ![]() Динамично развивающийся бесплатный и мощный декомпилятор .NET сборок. Практически любой EXE файл, собранный на .NET технологии он может представить в виде полного исходника со всем деревом наследования классов. Подсветка синтаксиса, гиперссылки на объекты классов, удобный и приятный интерфейс. Все это говорит лишь об одном: в декомпилировании .NET сборок этой проге нет равных. Если ты исследуешь .NET программы или просто хочешь взглянуть на свою разработку глазами исследователя - быстрее качай эту прогу. Must Have однозначно. Также у проги есть "младший брат" - тулза для выдирания ресурсов из .NET сборок. Эта примочка также бесплатна и лежит на то же сайте, что и Reflector. За прогой и ее обновлениями не забудь заходить на: http://www.aisto.com/roeder/dotnet DJ Java Decompiler ![]() А это уже декомпилер Java классов. Довольно удобен и прост в использовании. открываешь в нем класс и уже созерцаешь исходник. Имеется довольно мощная подсветка синтаксиса, поиск и настройки. Также есть браузер классов и объектов. В общем довольно мощный и интересный декомпилятор. Жаль что только EXE файлы написанные на Java не декомпилирует. Прогу можешь скачать отсюда; http://members.fortunecity.com/neshkov/dj.html ReFox by Jan Brebera ![]() Со слов людей, юзающих его - довольно мощный декомпилер прог, напинанных на фоксе. Причем версия фоксы не критична - декомпилер берет и Dos и Windows версии. Декомпилер берет не только стандартные, но и закриптованные фоксой модули. Даже если код был скомпилен под Macintosh - декомпилер возмется его декомпилировать и даже портирует выходной вариант по DOS/Windows. Короче, если ты долго разрабатывал экономическую прогу для своего отдела и ненароком держал сорцы на стареньком винте, который приказал долго жить - заюзай ReFox - он сочтет за честь восстановить для тебя сорцы. Декомпиляторы Visual Basic’а Я не зря решили их все объединить под общим заголовком. Во первых их очень много и постоянно появляются все новые и новые. Во вторых все декомпиляторы разделяются по возможностям на три типа: декомпиляторы форм, редакторы форм и декомпиляторы пикода. Также есть декомпиляторы, сочетающие в себе несколько возможностей - о них мы поговорим в самом конце. А сейчас представлю тебе все три типа декомпилеров. VBRezQ ![]() Один из самых стабильных декомпиляторов форм. Хотя, больше ничем и не примечателен. Объявления API функций делает без параметров, от чего пользы мало, код не декомпилирует вообще. Имеет довольно подробную документацию и просит за свое использование немало зеленых президентов. В общем, если тебе не жалко денег и нужно декомпилировать только элементы интерфейса - рекомендую :) Саму прогу можно найти тут: www.vbrezq.com VB Editor by HEXMAN ![]() Абсолютно бесплатный редактор форм и лежащих на них объектах. Если ты занимаешься русификацией программ, но не можешь ничего поделать с прогами, написанными на VB (Restorator тут бессиллен) - смело юзай данную прогу. Эта программа просто рай для локализаторов интерфейса. Программа имеет двухязычный интесфейс (Французский и Английский), причем по дефолту почему-то грузится Французский :) Поможет тебя данная тулза и сгенерить форму, на основе сделанных изменений, так что прога подойдет и как альтернатива уже упомянутого выше VBRezQ. Саму прогу можно найти тут: http://www.multimania.com/hexman VBReFormer by Sylvain Bruyere ![]() Еще одна работа французских программистов. Эта прога явно помощнее предыдущей. Помимо просмотра и изменения форм предоставляет также возможность выдрать из EXE всякие изображения, которые обычно лежат в frx файлах. Trial версия позволяет только просматривать результаты. При этом не только запрещается сохранять результат, но и вообще прога постоянно обнуляет буфер обмена дабы исключить и возможность копирования. Отсюда прежде чем запускать прогу - убедись, что в буфере нет нужных и еще не сохраненных данных. Помимо всего прочего прога предоставляет для обзора некоторые данные из заголовка EXE файла, потому адрес точки входа в программу и Image Base можно узнать прямо не отходя от VBReFormer’а. Еще один плюс софтины - она умеет распознавать используемые в декомпилируемой программе ActiveX файлы и позволяет просмотреть их все свойства и методы. Жаль только что не использует эту инфу при генерации форм - там все ActiveX’ы выглядят немного убого, без свойств и присвоенных им данных. При желании эта тулза может обыскать весь твой жесткий диск в поисках прог, написанных на VB. Зачем это нужно - не знаю, наверное для тестирования возможностей программы на разных EXE’шниках. Если прога приглянулась, то Trial версию можешь взять здесь: http://www.decompiler-vb.tk/ RaceEx6 ![]() Еще один декомпилер. Пытается декомпилить и формы и p-code, но представляет всю эту информацию в таком убогом виде на экран, что фиг поймешь, какие данные к чему относятся. Также как и предыдущая тулза - умеет дергать графику из прог, написанных на VB. Пытается декомпилировать p-code, правда пока декомпилит только методы, а с передаваемыми в них параметрами туго. В общем, если довести интерфейс до ума - вполне нормальная тулза бы получилась, но автору судя по всему лень этим заниматься. Брать тулзу можешь отсюда: http://www.raceco.us exdec by josephco ![]() Наверное самый известный в среде крэкеров декомпилятор пикода. Как говорится старенький, но рабочий. Возможность у проги всего одна - декомпилить p-code в том виде в каком он есть. То есть того кода который писал программист на VB ты не увидишь, а вот то что сгенерил компилятор - да, причем в довольно читабельном для профессионала виде. В комплекте с прогой идут примеры и небольшой туториал. Туториал поможет тебе хотя бы немного понять, что значит вся эта декомпиленная муть и как ее читать, потому если ты разбираешься с p-code’ом впервые - очень советую обратить на этот туториал внимание. Прогу ищи через поисковики или на www.wasm.ru - найдешь обязательно. VBParser ![]() Почти полный аналог exdec, только написанный китайскими разработчиками. Результат своей работы не только выводит на экран, но и сохраняет в файле ParseVB.txt. На случай падения проги (а такое частенько случается) - этот файл здоровски помогает. Тулзу также придется искать в поисковиках, сайта у нее своего насколько я знаю нет. p32Dasm by DARKER ![]() Лучшая альтернатива exdec’у и VBParser’у. Прога в отличии от двух предыдущих написана на VB (exdec и VBParser написаны на C++) и динамично развивается последнее время. Имеет подсветку синтаксиса, калькулятор адресов, умеет декомпилировать с определенного смещения в файле, а также подобно дизассемблерам способна представить все строки и функции, юзаемые в программе в удобном списке с возможностью мгновенно перейти на выбранную позицию. Главный недостаток проги - относительная нестабильность работы и медленная скорость, в остальном же прога стоит того, чтобы ее посмотреть и юзать. Распространяется бесплатно. Брать тулзу можешь отсюда: http://llamellik.webzdarma.cz/forumb/index.php VBDE by iorior ![]() Довольно неплохой декомпилятор, причем бесплатный. Декомпилит формы (правда без ActiveX’ов, если они присутствуют). Выдает адреса на все процедуры, а если это возможно, то выводит не только адрес процедуры, но и ее имя, что значительно упрощает анализ. Пытается декомпилировать Native Code, хотя в большинстве случаев кроме операторов сложения, вычитания и вывода MessageBox’а - ничего декомпильнуть не может. Несмотря на это прога довольно удобная и стабильная, потому рекомендую всегда иметь под рукой. Сайта у проги нет, потому ищи через поисковики - найдешь точно - много где лежит. Semi VB Decompiler by vbgamer45 ![]() Довольно интересный проект. До недавнего времени распространялся в исходниках на VB, а теперь стал коммерческим. Несмотря на свою глючноватость, бесплатная версия может довольно многое. Декомпилятся формы, содержащаяся в них графика и названия процедур. Также определяются используемые в проге API функции. Помимо этого, предоставляется информация из EXE заголовков. Есть даже попытки декомпилять p-code. Так что тулза создает довольно приятное впечатление. Огромный респект автору за сорцы - думаю многим полезно будет в них заглянуть, чтобы понять, как декомпилится VB код. Честности ради скажу - сорцы жутко неоптимизированно написаны, и порой смотря на некоторые участки кода хочется плакать, хотя этот код и выполняет свои функции. Но повторюсь - это бесплатно, а бесплатное не обсуждается :) Поэтому быстрее беги на: http://pscode.com/vb/scripts/ShowCode.asp?txtCodeId=55935&lngWId=1 пока сорцы еще там, а если хочешь - купи у автора новую версию проги - поддержи парня. VB Decompiler by GPcH ![]() Хе, хе, хе. Вот мы и дошли до моего декомпилера VB. При его создании я пытался внести в него как можно больше возможностей, при этом не загромождая интерфейс тем, что никогда не пригодится. В итоге имеем декомпилятор форм, с поддержкой ActiveX’ов лежащих на них (при этом декомпилятся только общие для все ActiveX’ов свойства), декомпилятор p-code’а (причем если в бесплатной Lite вресии он напоминает p32Dasm’овский, то в Pro версии прога пытается перевести p-code в исходникоподобный читабельный вид, что часто помогает быстрее востанновить нужные потерянные куски кода) и декомпилятор ссылок на API (при этом они записываются уже в объявленном виде со всем списком параметров). Ясен пень - подсветка синтаксиса тоже есть. Также есть для каждого модуля с кодом свой список встречающихся там строк с возможностью мгновненно перейти на участок кода, где юзается выделенная строка. Присутствует также и поиск, помогающий найти нужный код в активном окне. Резульат своей работы прога может сохранить, причем вместе с кодом и формами сохраняются и frx файлы с графикой и корректно прописываются ссылки на эти графические объекты в формах. В общем, если тебе не нужен детальный декомпиль p-code’а - вполне можешь ограничиться бесплатной Lite версией. Если все же нужна Pro - иди на www.vb-decompiler.org, там же можешь скачать Lite версию проги и посмотреть примеры работы Pro версии. Заключение Как видишь - декомпиляторов полно и их недостатка не наблюдается. При этом резко чувствуется грань между профессиональными и любительскими разработками. Причем эта грань очень велика и в качестве и в цене. Несмотря на это в большинстве случаев можно обойтись бесплатными разработками. Если ты прочитал эту статью чтобы научиться восстанавливать свои сорцы в случае падений жесткого диска - думаю ты уже нашел для себя нужные проги. Если же ты исследователь защит (я не люблю слово крэкер, мне больше нравится слово реверсер, так как оно более общее и правильное), то думаю для тебя не составит труда сделать даже коммерческие проги бесплатными для себя :) Главное не переусердствуй - помни, что закон существует и как ни странно он един для всех. Удачи!
|
|
| ||||||||||||||||||||||||||||