Как декомпилировать dll c

Обновлено: 07.07.2024

Предисловие

Статья первоначально писалась для журнала СПЕЦ Xakep. И вышла в апрельском номере прошлого года, потому заранее извиняюсь за немного устаревшие данные. К примеру P32Dasm на данный момент уже довольно стабилен, а в VB Decompiler уже добавлено с того времени столько возможностей, что он является самым продвинутым средством для декомпиляции программ, написанных на Visual Basic.

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

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

Dede by DaFixer

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

SourceRescuer

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

REC by Giampiero Caprino

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

CODE NOW! eax++; for(eax=1000;eax=0;eax--)

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

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

DJ Java Decompiler

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

ReFox by Jan Brebera

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

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

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

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

VB Editor by HEXMAN

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

VBReFormer by Sylvain Bruyere

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

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

exdec by josephco

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

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

p32Dasm by DARKER

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

VBDE by iorior

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

Semi VB Decompiler by vbgamer45

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

VB Decompiler by DotFix Software

Вот мы и дошли до моего декомпилятора 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.

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

Создание исходного кода

Символы не загружены

Снимок экрана: документ "Символы не загружены"

Исходный код не найден

Снимок экрана: документ "Исходный код не найден"

Создание и внедрение исходного кода для сборки

Снимок экрана: контекстное меню сборки в окне "Модули" с командой "Декомпилировать исходный код".

Извлечение и просмотр внедренного исходного кода

Исходные файлы, внедренные в файл символов, можно извлечь с помощью команды Извлечь исходный код в контекстном меню окна Модули.

Снимок экрана: контекстное меню сборки в окне "Модули" с командой "Извлечь исходный код".

Извлеченные исходные файлы добавляются в решение как прочие файлы. В Visual Studio функция "Прочие файлы" по умолчанию отключена. Чтобы включить эту функцию, установите флажок Инструменты > Параметры > Среда > Документы > Показывать прочие файлы в Обозревателе решений. Без включения этой функции вы не сможете открыть извлеченный исходный код.

Снимок экрана: страница параметров инструментов с установленным флажком для включения прочих файлов.

Извлеченные исходные файлы отображаются в разделе прочих файлов в Обозревателе решений.

Снимок экрана. Обозреватель решений с прочими файлами.

Известные ограничения

Требуется режим прерывания выполнения

значок "Прервать все"

Создание исходного кода с помощью декомпиляции возможно только в том случае, если отладчик находится в режиме прерывания выполнения и приложение приостановлено. Например, Visual Studio переходит в режим прерывания, попадая в точку останова или в исключение. Вы можете легко активировать прерывание выполнения Visual Studio при следующем запуске кода с помощью команды Прервать все ().

Ограничения декомпиляции

Отладка оптимизированных сборок или сборок выпуска

При отладке кода, декомпилированного из сборки, которая была скомпилирована с использованием оптимизаций компилятора, вы можете столкнуться со следующими проблемами:

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

Дополнительные сведения можно найти в описании проблемы GitHub Интеграция ICSharpCode.Decompiler с отладчиком VS.

Надежность декомпиляции

Относительно небольшой процент попыток декомпиляции может привести к сбою. Это происходит из-за ошибки пустой ссылки точки последовательности в ILSpy. Мы устранили этот сбой путем перехвата таких проблем и корректного завершения попытки декомпиляции.

Дополнительные сведения можно найти в описании проблемы GitHub Интеграция ICSharpCode.Decompiler с отладчиком VS.

Ограничения при работе с асинхронным кодом

Результаты декомпиляции модулей с шаблонами кода async/await могут быть неполными или неудачными в целом. Шаблоны кода async/await и машины состояния yield state-machine в ILSpy реализованы только частично.

Дополнительные сведения можно найти в описании проблемы GitHub Состояние генератора PDB.

Только мой код

Параметры режима Только мой код (JMC) позволяют Visual Studio выполнять шаг с обходом системы, платформы, библиотеки и других вызовов непользовательского кода. Во время сеанса отладки в окне Модули отображаются модули кода, которые отладчик воспринимает как "Мой код" (т. е. пользовательский код).

При декомпиляции оптимизированных модулей или модулей выпуска создается непользовательский код. Если отладчик прерывается в декомпилированном непользовательском коде, появляется окно Отсутствует источник. Чтобы отключить режим "Только мой код", перейдите в раздел Инструменты > Параметры (или Отладка > Параметры) > Отладка > Общие и снимите флажок Включить только мой код. .

Извлеченный исходный код

Исходный код, извлеченный из сборки, имеет следующие ограничения.

  • Имена и расположение созданных файлов нельзя настроить.
  • Файлы являются временными и будут удалены Visual Studio.
  • Файлы помещаются в одну папку без использования какой-либо иерархии, которая была в оригинальных исходных файлах.
  • Имя каждого файла содержит хэш контрольной суммы файла.

В этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.

Декомпиляторы, или Что делать, если нужно восстановить исходники из бинарников?

Задача для декомпилятора бинарников, собранных из С кода:

Классический случай: один деятель на факультете написал на правильном ANSI C (и используя библиотеки BLAS и LAPACK) нужные и хорошие алгоритмы, и скомпилировал их в виде MEX-файлов для использования (это С-шный код, который можно вызывать из МАТЛАБ).

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

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

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

Программы для декомпилирования (decompilers) для C/C++

Декомпиляторов для C/C++ немного, и ниже список из наиболее работоспособных. Здесь нет разделения на опенсорс или Linux-only - для такого дела, как вскрытие исходников, можно (и нужно) поступиться своими светлыми идеалами и наступить на горло собственной песне.

Сразу замечу: скорее всего, ни один декомпилятор не выдаст вам сразу компилируемый код. Придётся потратить порядком времени и сил, чтобы это месиво превратить в код, который можно читать (желательно, не только компилятору).

  • поддерживаемые бинарные форматы: ELF PE-COFF Mac-OS
  • платформы: Windows/Linux
  • поддерживаемые архитектуры: IA32 MIPS PPC
  • метод работы: поточный, есть жалкий графический интерфейс, лучше использовать CLI.
  • Структурирование: очень хорошее
  • Переменные: хорошее
  • Типы данных: очень хорошее
  • поддерживаемые бинарные форматы: ELF PE-COFF AOUT RAW PS-X
  • платформы: Windows/Linux/MacOS
  • поддерживаемые архитектуры: x86 (ia32) x86_64 Mips PowerPC mc68k
  • метод работы: поточный и интерактивный, есть графический интерфейс.
  • Структурирование: хорошее
  • Переменные: частично
  • Типы данных: частично или никак
  • поддерживаемые бинарные форматы: EXE/COM
  • платформы: Windows
  • поддерживаемые архитектуры: x86
  • метод работы: поточный.
  • Структурирование: хорошее
  • Переменные: частично
  • Типы данных: частично или никак

Hex Rays - plugin для IDA Pro
На самом деле Hex Rays не является отдельной программой - это плагин-декомпилятор для IDA Pro. Комбинация продвинутых возможностей IDA Pro (это дизассемблер) и Hex Rays в качестве декомпилятора очень впечатляет, как и аэрокосмическая цена.
По причине закрытости продукта (нет даже демо-версии) и нереальной цены в этом разделе про Hex Rays больше ничего написано не будет.


Ходовые испытания в реальных условиях
Для начала попробуем декомпилировать что-нибудь совсем простенькое и написанное на ANSI C и с использованем библиотеки BLAS для векторых и матричных операций. Бинарный файл можно скачать здесь.

1. Простенький C-шный бинарник + BLAS
Собственно, код на C для перемножения матрицы и вектора (используется CBLAS). Исходник:

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

Выхлоп Boomerang
У него много ключей и параметров, часть которых не знает даже официальная, скажем так, документация. Тем не менее, для ключа -Td (Use data-flow-based type analysis) мы имеем выхлоп в стиле дзен:


Скажем так, не слишком ободряюще. Ключ -Tc (Use old constraint-based type analysis) выдаёт больше информации к размышлению:

Подробностей тут больше, и тут выловлен самый главный ключик - cblas_dgemv();


Выхлоп RecStudio
Намного более обилен и представляет собой следующий поток сознания:




Структура программы (вначале) в общем несколько лучше, чем у Boomerang, и куда больше подробностей.

  • Вот оригинальный MEX-файл под Linux [скачать, 17kB]
  • это выхлоп Boomerang;
  • это выхлоп RecStudio.
  • спасибо комментатору Gregory, вот выдача IDA Pro.
что позволило автору предположить, что для lower/upper bounds использутеся Liner Programming. Не слишком много, но по крайней мере понятно, в какую сторону копать.

Если у кого-то вдруг проявится желание потыкать в оный бинарник палочкой, IDA Pro и ещё чем - не стесняйтесь отписываться в комментариях.
19 комментариев: |высказаться!| RSS-лента дискуссии.|

Отличный пост, спасибо. Для практического применения мне пока без надобности (куда уж нам, самоучкам-недопрограммерам), но всё может пригодиться.

Пост - как украсть чужой алгоритм. Уж да.

@redVi комментирует.
Отличный пост, спасибо.
Пожалуйста. Мне просто по нужде пришлось разбираться со всем этим. Я так понял, что пока никто не отважился декомпилировать приведённый в посте файл. Придётся его писать самому :-(

Для практического применения мне пока без надобности
И хорошо, если б не пригодилось. Выуживать из этого месива алгоритм - дело безблагодатное.

@Serge Ku комментирует.
Пост - как украсть чужой алгоритм.
Сергей, это не совсем так. В моём случае, по крайней мере. Проблема в том, что мы все на факультете используем эти алгоритмы для работы (мы - инженеры, а не математики). И этот мерзавец потратил 7 лет для их создания и отладки. А потом взял и свалил, не оставив никому исходников. Даже описания алгоритмов пришлось выуживать из его статей.

Как бы это помягче сказать, джентельмены так не делают. Зато у меня есть шанс отличиться и сделать алгоритм лучше. Что я сейчас и пытаюсь сделать. Так что если в скором времени тут начнут появляться посты по хардкорному Сишному программированию мозговыносящих алгоритмов - не стоит удивляться :-)

@redVi
куда уж нам, самоучкам-недопрограммерам
А что бывают другие? Покажи мне ВУЗ где обучают чему-то дельному в этой части, а не просто куски паттернов+Дельфи, в лучшем случае кусок C++. Единственным исключением из правил считаю Академический университет в Питере, там и правда учат дельному, но там магистратура. (правда КАКАЯ!)
@virens
Так что если в скором времени тут начнут появляться посты по хардкорному Сишному программированию мозговыносящих алгоритмов
. мы будем оченна рады.

@Iskander комментирует.
А что бывают другие? Покажи мне ВУЗ
Вообще-то это оффтопик, от которого стоит воздержаться всем участникам, но тем не менее.

Другие - бывают, но это не задача ВУЗа (университета) выпускать coding monkeys. В университете прививают и развивают абстрактное логическое мышление - в хороших университетах к этому идут прикладные курсы, показывающие, как всё это использовать. А не просто бубнят тервер Чистякова или линейную алгебру Кострикина-Манина родом из 50-х годов.

Coding monkeys готовят в ПТУ, или как тут их политкорректно называют, Institutes (TAFE in Australia). Типичные курсы программирования выглядят вот так. эээ. ну или вот так. Ну да, программирование apps для айфона, Джава (с аутентичным индийским раджой в качестве препода), и вёб-дизайн.

Есть отличие: обезьяны не придумают новый алгоритм или очередную инновацию - это просто исполнители.

мы будем оченна рады.
Мне тут просто пришлось разбираться с MEX-файлами в МАТЛАБ, и я с удивлением обнаружил, что документации по этому поводу с гулькин хвост. А там есть где наступить на грабли.

Есть отличие: обезьяны не придумают новый алгоритм или очередную инновацию - это просто исполнители.
Толи я чего не понимаю толи computer science как раз этому и учит Да и software engineering тут тоже не лыком шиты. Так что зря Вы так Михаил, ежели кому нужны "monkey" их нанимают в Индии и не заморачиваются.

Пост довольно полезный, но я так до конца и не понял, как сейчас обстоят дела с C++?

Пару лет назад вставала такая задача, но все попытки декомпилировать виндовый exe-шник ничем хорошим не увенчалась.

Вот как обстояли дела: я практиковался с C++ и написал в Visual Studio простенькое консольное приложение (тест по физике с выдачей оценки в конце). Так вот, ради интереса решил его декомпилировать. Все пробы выдавали ОГРОМНОЕ месиво, в котором совершенно не понятно, кто что делает. Хотя переменных было не много, пара формул, пара условий и один цикл.

А там есть где наступить на грабли.

Будем с нетерпением ждать продолжение!

Вообще-то это оффтопик, от которого стоит воздержаться всем участникам, но тем не менее

Здесь есть такие участники, которых очень трудно сдерживать :-)
И да, это ещё хорошо, что нет холивара Python vs C++, который присущ почти любому посту про программирование

где обучают чему-то дельному в этой части, а не просто куски паттернов+Дельфи, в лучшем случае кусок C++

Что-то дельное - это опыт, умение мыслить и создавать своё. Этому и учат в ВУЗах.

Начну издалека: в школе учат программированию на паскале. Пример цикла: "for i:=1 to n do". Для будущего программиста не важен вид этой строки для определённого языка программирования, а важно то, что с его помощью можно сделать. Если программист научится моделировать ситуацию в уме, то сможет описать её на любом языке программирования. Найдёт, что в C++ приведённый цикл выглядит следующим образом: "for (i=0; i<n; i++)".

Так что нужно выбирать самому, кем становиться: "творцом нового" или "наборщиком шаблонов"

@Iskander комментирует.
Толи я чего не понимаю толи computer science как раз этому и учит
Computer science учит придумывать новое и для этого люто пичкает теорией. В хороших университетах это добавляют практикой, но в век cost-cutting и прочих dirt-cheap практики становится больше, а теории - меньше. Это приводит к тому, что многие под computer science понимают кодинг. Это неправильно в корне, но как можно безграмотным Джонам До объяснить, что теория важна?

Да и software engineering тут тоже не лыком шиты.
Эти сползают в coding monkey ещё более стремительными темпами. Не говоря о том, что они забиты выпускниками индийских богаделен и прочими жрецами джавы.

кому нужны "monkey" их нанимают в Индии и не заморачиваются.
Искандер, ты просто никогда не видел результат их деятельности. Те, что приезжают сюда на postgraduate study и занимаются телекомом (а чем же ещё?!) - просто кошмарны. Никакой мысли outside the box, вообще. Плюс то, что они меня часто спрашивают по линейной алгебре и терверу. это леденящий душу невыразимый ужас. И они пишут научные статьи!

@Vlsu комментирует.
как сейчас обстоят дела с C++?
Я не знаю, и мне это мало интересно. Меня огорчают попытки воткнуть плюсы везде и всюду, даже где они не нужны совсем. Пример: один деятель написал quadprog++ (это Dual Active-set optimization, Goldfarb-Idnani algorithm).

Так вот, это всего лишь один алгоритм, и на Си это занимает 30-40 килобайт исходников (я пишу похожий, так что примерно так выходит). Вместо этого мы имеем 630 килобайт (!) всякого плюсатого говна с шаблонами, классами и прочими мигалками, которые только усложняют чтение и без того мозголомного кода.

У меня только один вопрос: зачем?!

я практиковался с C++ и написал в Visual Studio простенькое консольное приложение. решил его декомпилировать. Все пробы выдавали ОГРОМНОЕ месиво

Собственно, выше пример как раз из той же серии. Декомпиляторые не выдадут тебе обратно чистенький и незаплёванный код. Будет здорово, если ты вообще выудишь оттуда хотя бы структуру программы или какие-то намёки (как удалось это мне).

И да, это ещё хорошо, что нет холивара Python vs C++
А какой тут может быть холивар?

Какие холивары могут быть там, где никто не думает об обратной совместимости хотя бы нескольких последних версий?!

Что-то дельное - это опыт, умение мыслить и создавать своё. Этому и учат в ВУЗах.
Vlsu, ты отчасти прав: учат мыслить абстрактно и пытаться понять, как оно всё устроено.

Если программист научится моделировать ситуацию в уме
Собственно, это и есть образование: научить человека мыслить моделями. А не просто подставлять числа в формулы. Увы, но последнее появляется всё больше и больше, причём даже в университетах.

По теме поста: Vlsu и Iskander, как насчёт попробовать декомпилировать линуксовый экзешник в посте? Оно в общем представляет интерес.

По-моему проще асм читать, чем тот ужас, который выдает recstudio.

Уффф, ничего себе мне тут лекцию начитали!
Так попорядку:
@Vlsu
По-моему приведенный Вами кусок на Паскале не соответствует по смыслу куску на Сях. (В Паскале ведь, если мне память не изменят 0!=1)?
@virens
Computer science учит придумывать новое и для этого люто пичкает теорией.
И поэтому существование такого в родной стране меня дико удивило, там действительно люто, бешено пичкают теорией!
В хороших университетах это добавляют практикой
И этому я тоже удивился, ибо практики там тоже хватает.
всякого плюсатого говна с шаблонами, классами и прочими мигалками
Ну вот полегче, потоньше как-то надо.
учат мыслить абстрактно
Иногда уж слишком абстрактно.
научить человека мыслить моделями
Еслиб еще был предмет который учит не просто решать кучу интегралов, и абстрактных задач по терверу (о дааа задачи про кучу шаров или 100500 выстрелов наверное именно такая абстракция должна мне приходить в голову) или мат статистике (привет расчетная методичка состоящая целиком из цифр. )
Так я о чем собсна. А так вот еслиб в дополнение ПОДЧЕРКИВАЮ в ДОПОЛНЕНИЕ к теории давали еще и теорию составления мат моделей на примере. да хоть на каком-то более или менее реальном примере. ну жить бы стало лучше. жить бы стало веселее как говорил Иосиф Виссарионович.
декомпилировать линуксовый экзешник в посте
Разгребусь с сессией и попробую, большего сказать не могу (правда сомневаюсь что gcc-шный декомпилированый код будет по степени заговненности сильно лучше кода Visual Studio)
P.S. Автору поста хорошая новость под новый год E17. РЕЛИЗНУЛАСЬ! Ждем новогоднего поста от автора о впечатлениях!

По-моему проще асм читать, чем тот ужас, который выдает recstudio.

Асм читать как раз и не хочется, потому как хочется выудить структуру алгоритма. Он довольно сложный, то есть это не просто перемножение пары матриц.

Это оффтопик. Мой посыл был в том, что программирование и code monkeys != computer science. Об этом многие не знают и путают их. Отличие в том, что один из них умеет мыслить абстрактно, а другой - нет. И этому нельзя научить - это можно развить, до определённой степени.

всякого плюсатого говна с шаблонами, классами и прочими мигалками
Ну вот полегче, потоньше как-то надо.

Тоньше не получается: мне не хотелось тратить время на реализацию этого алгоритма - я знаю, как он работает, и мне хотелось взять готовый код и его кастомизировать. И я не понимаю, зачем разводить всю эту хреновину ради ОДНОГО алгоритма, который на Си занимает пару сотен строчек кода.

абстрактных задач по терверу
Стивен Кай спасёт отца русской демократии. Без шуток и иронии - это один из лучших учебников по прикладной теории вероятности. Я сам его почитываю время от времени.

P.S. Автору поста хорошая новость под новый год E17. РЕЛИЗНУЛАСЬ!
Да я уж видел. Конец света близок, как никогда - такие вещи просто так не релизят :-)

Ждем новогоднего поста от автора о впечатлениях!
Тут у нас жарко, лето и совсем ничего не хочется делать. Но я попробую :-)

Искандер, завязывай с оффтопом. Давай лучше письмом напиши.

Вообще, если нужны хорошие книжки по терверу и линейной алгебре - обращайся, но учти: мои книги - только на английском.

@Gregory комментирует.
Я правильно понимаю, что Вы воспользоваться пиратским IDA Pro не можете в данном случае?

Мне религия не позволяет :-)

А прислать декомпиленный с её помощью код можно?

У меня IDA Pro нет (и не предвидится), так что был бы очень рад посмотреть на его результаты.

Virens, отправил исходник Вам на почту

@Gregory комментирует.
Virens, отправил исходник Вам на почту
Да, спасибо, только что получил.

Результат в самом деле лучше того, что выдаёт бумеранг и RecStudio.

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

Огромное спасибо за исходник - у меня IDA Pro нет, а посмотреть на его работу очень хотелось. По всему видно, что народная молва про IDA Pro не врёт - результат в самом деле на голову выше конкурентов.

Подскажите, пожалуйста, где можно найти специалиста по декомпляции библиотек.
Надо разобрать структуру одной функции, но к сожалению ни код Асма ни запутанный сырой код на декомпильованом С не дает разобраться в работе библиотеки.
Где можно найти фрилансера, что подаст метод на блюдечке с синей каемочкой? Среди тегов на фриланс нету скила декомпиляция :)

Начинающие реверсеры, еще не познавшие все прелести чистого ассемблера, постоянно спрашивают на хакерских форумах, где бы им раздобыть
декомпилятор для Си или Паскаля. Декомпиляторов-то много, но вот результат. без дизассемблера все равно ну никак не обойтись. И вот, наконец, свершилось!
Ильфак (автор легендарного дизассемблера IDA Pro) выпустил декомпилятор нового поколения
HexRays, делающий то, что другим не под силу. Мир вздрогнул от восторга (реклама вообще обещала чудо), порождая сейсмические волны впечатлений: от оргазма до полного отвращения. Истина же, как водится, где-то посередине, и стоит обозначить эту середину, рассмотрев слабые и сильные стороны
декомпилятора, а также
области его применения.

Почему у Ильфака получилось то, что упорно не желало получаться у других? Начнем с того, что
HexRay представляет собой всего лишь плагин к IDA Pro — интерактивному дизассемблеру более чем с десятилетней историей, первая версия которой увидела свет 6 мая 1991 года. Спустя некоторое время к работе над ней подключился удивительный человек, гениальный программист и необычайно креативный кодер Юрий Харон. Вместе с Ильфаком (не без помощи других талантливых парней, конечно) они начали работать в том направлении, куда еще никто не вкладывал деньги. До этого дизассемблеры писались исключительно на пионерском энтузиазме параллельно с изучением ассемблера и довольно быстро забрасывались. Ильфак и
Юрий Харон решили рискнуть. В итоге IDA Pro стал не только основным, но и, пожалуй, единственным продуктом фирмы
DataRescue (мелкие утилиты и прочие ответвления не в счет). Стоит ли удивляться, что парням удалось решить практически все фундаментальные проблемы дизассемблирования, над которыми просто не хотели работать остальные разработчики, зная, что быстрой отдачи не будет и проект потребует десятилетий упорного труда. Самое время выяснить, что же это за проблемы такие, откуда они берутся и как решаются.

Фундаментальные проблемы декомпиляции

Компиляция — процесс однонаправленный и необратимый, в ходе которого теряется огромное количество лишней информации, совершенно ненужной процессору. Это не шутка! Исходный текст, написанный на языке высокого уровня, чрезвычайно избыточен, что с одной стороны упрощает его понимание, а с другой — страхует программиста от ошибок. Взять хотя бы информацию о типах. На низком уровне процессор оперирует базовыми типами: байт, слово, двойное слово. Строки превращаются в последовательности байтов, и, чтобы догадаться, что это строка, приходится прибегать к эвристическим алгоритмам.

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

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

Что в имени твоем

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

К счастью, современные программы наполовину (а то и более) состоят из библиотечных и API-функций, которые распознаются классическим сигнатурным поиском. Главное — собрать обширную базу библиотек всех популярных (и непопулярных) компиляторов с учетом многообразия их версий.

IDA Pro уже давно поддерживает технологию FLIRT (Fast Library Identification and Recognition Technology), не только распознающую библиотечные функции, но также восстанавливающую их прототипы вместе с прототипами API-функций, которые, кстати говоря, могут импортироваться не только по имени, но еще и по ординалу, то есть по номеру. Чтобы превратить бессловесный номер в имя, понятное человеку, опять-таки требуется база.

Почему реконструкция прототипов так важна для декомпилятора? А потому, что она позволяет восстанавливать типы передаваемых функциями переменных, назначая им хоть и обезличенные, но все же осмысленные имена в стиле: hWnd, hModule, X, Y, nWidth, nHeight, hCursor, hMenu, hDlg. Согласись, это намного лучше, чем dword_1008030, dword_1008269, dword_1006933, что характерно для подавляющего большинства остальных
декомпиляторов.

Даже если часть переменных распознана, то это уже упрощает анализ программы и реконструкцию оставшихся переменных.

Константа или смещения

В силу архитектурных особенностей x86-процессоров константы и смещения (они же в терминах языков высокого уровня указатели) синтаксически абсолютно неразличимы, и
декомпилятору (равно как и дизассемблеру) приходится задействовать мощные эвристические алгоритмы, чтобы не попасть впросак.

А какая между этими двумя сущностями разница? Очень большая! Вот, например, в регистр EAX загружается число 106996h. Если это указатель на ячейку памяти или массив данных, то дизассемблер должен воткнуть по этому адресу метку (label) и написать MOV EAX, _offset_ lab_106996 (естественно, имя метки дано условно, и совпадение с ее численным значением абсолютно случайно — при повторной компиляции она может оказаться расположенной по совершенно другому адресу). А вот если 106996h — это константа, выражающая, например, среднюю плотность тушканчиков на один квадратный метр лесополосы или количество полигонов на морде монстра, то ставить offset ни в коем случае нельзя, поскольку это введет нас в
заблуждение при анализе, а еще, как уже говорилось, при повторной компиляции смещение может уплыть, превращая число 106996h черт знает во что. Программа либо будет работать неправильно, либо сразу рухнет (особенно, если путаница между константами и смещениями происходит не единожды, а совершается на протяжении всего листинга).

Так как же все-таки определить, кто есть кто? На первый взгляд, все достаточно просто. Если данная сущность используется как указатель (то есть через нее происходит обращение к памяти по заданному адресу: mov eax, 106996h/mov ebx,[eax]), тут и
дизассемблеру ясно, что это смещение. Но стоит лишь немного усложнить пример, скажем, передать 106996h какой-нибудь функции или начать производить с ней сложные манипуляции, то дизассемблеру потребуется высадиться на полную реконструкцию всей цепочки преобразований. Но даже тогда его решение может оказаться неверным, поскольку в языке Си индексы (то есть константы) и указатели (то есть смещения) полностью взаимозаменяемы и конструкция buf[69] не
только равносильна 69[buf], но и транслируется в идентичный машинный код, при реконструкции которого возникает очевидная проблема.

У нас есть два числа A и B, сумма которых представляет указатель (то есть существует возможность определить, что это указатель, да и то если попыхтеть), но вот что из них индекс? Увы. Формальная математика не дает ответа на этот вопрос, и дизассемблеру приходится полагаться лишь на свою интуицию да эвристику. Указатели в win32, как правило, велики, поскольку минимальный базовый адрес загрузки файла равен 100000h. Индексы же, как правило (опять! как правило!), малы и много меньше указателей, однако если у нас имеется массив, расположенный по адресу 200000h и состоящий из 3 145 728 (300000h) элементов (а почему бы, собственно, и нет?!), то тут индексы старших элементов становятся больше
базового указателя на массив, что вводит дизассемблер в заблуждение.

Код или данные

Вот так проблема! Наверное, даже самый тупой дизассемблер разберется, что ему подсунули: код или данные, тем более что в PE-файлах (основной формат исполняемых файлов под Windows) они разнесены по разным секциям. Ну, это в теории они разнесены, а на практике компиляторы очень любят пихать данные в секцию кода (особенно этим славиться продукция фирмы Borland).

С другой стороны, практически все компиляторы (особенно на Си++) сплошь и рядом используют вызовы функций типа CALL EBX. Чтобы понять, куда ведет такой вызов, необходимо установить значение регистра EBX, что требует наличия более или менее полного эмулятора процессора, отслеживающего всю историю содержимого EBX с момента его инициализации и до непосредственного вызова.

Но непосредственные вызовы - ерунда. Вот косвенные - это да! Реконструкция CALL dword ptr DS:[EBX] требует не только эмуляции процессора (то есть набора машинных команд), но и эмуляции памяти! Естественно, это на порядок усложняет дизассемблерный движок, зато нераспознанные массивы данных мгновенно превращаются в функции и, что самое главное, дизассемблер показывает, кто именно и откуда их вызывает!

Наличие эмулятора процессора и памяти позволяет также отслеживать положение регистра ESP, используемого для адресации локальных переменных и аргументов, передаваемых функциям. Если же эмулятора нет (а в IDA он есть), дизассемблер способен распознавать лишь простейшие формы адресации/передачи аргументов. Механизм, ответственный за распознание и отслеживание аргументов, носит красивое название PIT, но эта аббревиатура отнюдь не расшифровывается как «Пивоваренный [завод] Ивана Таранова», а происходит от
Parameter Identification and Tracking — идентификация и отслеживание параметров, то есть аргументов. Тех, что бывают у функций. А еще бывают функции без аргументов, но это уже другая история.

Реконструкция потока управления

Языки высокого уровня оперируют такими конструкциями, как циклы, операторы выбора, ветвления и т.д., что делает программу простой и наглядной. Собственно говоря, именно отсюда и пошло структурное программирование. А ведь когда-то, давным-давно, в Бейсике (и других языках того времени), кроме примитивного GOTO, ничего не было и программа, насчитывающая больше сотни строк, превращалась в сплошные «спагетти», лишенные всякой логики, внутренней организации и следов цивилизации.

Начиная с пятой версии в IDA Pro появился механизм графов, позволяющий автоматически реконструировать циклы, ветвления и прочие «кирпичи» языков высокого уровня. Впрочем, польза от графов была небольшой, и в реальности они только замедляли анализ, поскольку подобрать адекватный механизм визуализации и навигации Ильфаку так и не удалось… Но ведь не пропадать же труду?!

У истоков HexRays

К пятой версии IDA Pro имела в своем арсенале все необходимое для автоматической декомпиляции, причем не просто декомпиляции, а очень
качественной декомпиляции, декомпиляции принципиально нового уровня, до которого не дотягивает ни один другой существующих
декомпилятор.

Вот так и родилась идея дописать к IDA еще небольшую (на самом деле очень большую) порцию кода, переводящую китайскую ассемблерную грамоту в доступный и понятный листинг на языке Си. Закипела напряженная работа, по ходу которой выявлялись все новые и новые подводные камни, обход которых требовал времени, усилий и мозговой активности. А всякая (или практически всякая) работа упирается в деньги, тем более что у Ильфака фирма!

Включать декомпилятор в дистрибутив IDA Pro Ильфак не стал. Тому было несколько причин. Первая и главная — основной массе текущих пользователей IDA декомпилятор не сильно нужен, если они им и будут пользоваться, то лишь из чистого любопытства, запустят пару раз, плюнут и вернутся к привычному стилю жизни - анализу дизассемблерного листинга. Второе — зарабатывать на жизнь (Ильфаку) и содержать фирму как-то же надо?!

Все это привело к тому, что декомпилятор, получивший название (HexRays), был выпущен отдельным продуктом, но - внимание на экран - требующим
обязательного присутствия IDA, поскольку HexRays — всего лишь плагин. Таким образом, реверсеру, желающему упростить свою жизнь за счет автоматической декомпиляции, необходимо прибрести как саму IDA, так и
HexRays. Причем приобретать этот комплект будет совсем другая пользовательская аудитория, совсем не та, что приобретала ИДУ и почитала ее как самый лучший интерактивный дизассемблер. Интерактивный — значит, тесно взаимодействующий с пользователем (в смысле с хакером). В противовес ей, пакетные дизассемблеры стремятся к максимальной автоматизации
реверсинга, лишая пользователя возможности вмешиваться в процесс и отдавать указания.
HexRays в отличии от IDA Pro интерактивностью не обладает: она у него атрофирована еще в зародыше. Нет даже опций настройки! А там где нет интерактивности, нет и хакеров. И тут мы плавно переходим к ответу на вопрос кому нужен
HexRays.

Боевое крещение

Итак, Hex-Rays у нас на руках. Устанавливаем его туда же, где располагаются все остальные
плагины для IDA Pro, и приступаем к тестированию. В качестве объекта тестирования используется стандартный блокнот (в данном случае из комплекта поставки W2KSP0), на котором обкатываются все вирусы, все упаковщики исполняемых файлов (вместе с распаковщиками), все протекторы. словом, декомпилятор не станет исключением. А что? Блокнот - достаточно простая программа, обуславливающая тот минимум функционала, ниже которого декомпилятор из мощного программного комплекса превращается в дорогостоящую, но абсолютно бесполезную игрушку.

Загрузив notepad.exe в IDA Pro и ответив на ряд несложных вопросов мастера автоанализа, даем дизассемблеру некоторое время поработать и, когда он перейдет в режим ожидания, заходим в меню «File -> Produce File -> Create C file» или нажимаем горячие клавиши <Ctrl-F5>.

Сначала на экране появляется логотип HexRays с предложением провериться на обновления и после нажатия на OK
HexRays думает некоторое время, а когда он закончит заниматься магической деятельностью, на диске образуется файл notepad.c.

Может, мы не тот компилятор выбрали для тестирования? Вообще-то, по идее, декомпилятор должен выдавать листинг на ANSI C, поддерживаемый любым ANSI-совместимым C-компилятором, но… все мы хорошо знаем любовь Ильфака к продукции фирмы Borland. На нем написана сама IDA, на нем же вышло первое SDK… Хорошо, берем последнюю версию
Borland C++ (благо она бесплатна) и что же?! Вновь простыня ошибок и ругательств, приводящих к преждевременному прерыванию компиляции. Оказывается,
чтобы откомпилировать декомпилированный файл, над ним еще предстоит основательно поработать. Вот тебе и раз…

А вот тебе и два! Декомпилятор выдал чистый *.c-файл, проигнорировав тот факт, что notepad.exe содержит еще и секцию ресурсов, но даже если при загрузке блокнота в IDA форсировать обработку ресурсов, мы все равно ничего не получим. Ну не умеет
HexRays с ними работать и все-тут! Возможно, когда-нибудь он этому и научиться, но сейчас - нет.

Другими словами, HexRays не позволяет компилировать декомпилированные программы без дополнительной ручной работы и реально пригоден лишь для анализа. Возникает резонный вопрос: и насколько же он упрощает анализ? Чтобы не быть голословным, приведу два фрагмента кода:

if ( RegOpenKeyExA(
HKEY_CLASSES_ROOT,
"CLSID\\\\InprocServer32",
0,
0x20019u,
&hKey) )
result = 0;
>
else
cbData = 260;
if ( !RegQueryValueExA(hKey, ValueName, 0, 0, lpData, &cbData) ) v1 = 1;
RegCloseKey(hKey);
result = v1;
>
return result;

Просто? Красиво? Понятно? Элегантно? Еще как! А вот как выглядел тот же самый код в чистом дизассемблере:

.text:0100318F push ebp
.text:01003190 mov ebp, esp
.text:01003192 push ecx
.text:01003193 push ecx
.text:01003194 lea eax, [ebp+hKey]
.text:01003197 push esi
.text:01003198 xor esi, esi
.text:0100319A push eax ; phkResult
.text:0100319B push 20019h ; samDesired
.text:010031A0 push esi ; ulOptions
.text:010031A1 push offset SubKey ; lpSubKey
.text:010031A6 push 80000000h ; hKey
.text:010031AB call ds:RegOpenKeyExA
.text:010031B1 test eax, eax
.text:010031B3 jnz short loc_10031E7
.text:010031B5 lea eax, [ebp+cbData]
.text:010031B8 mov [ebp+cbData], 104h
.text:010031BF push eax ; lpcbData
.text:010031C0 push [ebp+lpData] ; lpData
.text:010031C3 push esi ; lpType
.text:010031C4 push esi ; lpReserved
.text:010031C5 push offset ValueName ; lpValueName
.text:010031CA push [ebp+hKey] ; hKey
.text:010031CD call ds:RegQueryValueExA
.text:010031D3 test eax, eax
.text:010031D5 jnz short loc_10031DA
.text:010031D7 push 1
.text:010031D9 pop esi
.text:010031DA
.text:010031DA loc_10031DA: ; CODE XREF: sub_100318F+46?j
.text:010031DA push [ebp+hKey] ; hKey
.text:010031DD call ds:RegCloseKey
.text:010031E3 mov eax, esi
.text:010031E5 jmp short loc_10031E9
.text:010031E7
.text:010031E7 loc_10031E7: ; CODE XREF: sub_100318F+24?j
.text:010031E7 xor eax, eax
.text:010031E9
.text:010031E9 loc_10031E9: ; CODE XREF: sub_100318F+56?j
.text:010031E9 pop esi
.text:010031EA leave
.text:010031EB retn 4

Согласись, что сравнение отнюдь не в пользу дизассемблера, но не спеши радоваться. Рассмотрим еще один пример:

Что делает этот код? Совершенно непонятно. То есть не то чтобы совсем непонятно, но смысл как-то ускользает. Тут требуется проанализировать, что это за переменные такие, кто еще (помимо этой функции) их модифицирует и зачем? В дизассемблере листинг выглядит схожим образом, но мощная система навигации по коду вкупе с перекрестными ссылками и подсветкой одноименных переменных/функций сокращает время анализа на несколько порядков, причем ни в одном текстовом редакторе, ни в одной среде программирования подобной системы навигации по коду нет!

А это вид в дизассемблере:

.text:01002306 loc_1002306: ; CODE XREF: sub_1002239+C4?j
.text:01002306 mov eax, dword_1008028
.text:0100230B push ebx
.text:0100230C push edi
.text:0100230D mov dword_1008BCC, eax
.text:01002312 push dword_10087D0
.text:01002318 call sub_10059A3
.text:0100231D test eax, eax
.text:0100231F jz short loc_1002328

Наш вердикт

HexRays – это, безусловно, большой шаг вперед и неплохое подспорье для начинающих, но… он не стоит тех денег, которые за него просят, к тому же (это касается начинающих), однажды потратив время на изучение ассемблера, мы обретаем возможность реверсировать что угодно и в чем угодно (на худой конец с помощью утилиты DUMPBIN.EXE, входящей в состав SDK), а обольщенные возможностями автоматической декомпиляции, мы становимся заложниками
HeyRays со всеми вытекающими отсюда последствиями.



Полную версию статьи
читай в февральском номере Хакера! Демонстрационную версию IDA ты найдешь на нашем диске. К сожалению, мы не можем выложить HexRays по правовым соображениям. На нашем диске будет видеоролик, демонстрирующий возможности HexRays.

Читайте также: