Декомпиляция
Декомпиля́тор — это программа, транслирующая исполняемый модуль (полученный на выходе компилятора) в относительно эквивалентный исходный код на языке программирования высокого уровня. Для сравнения, дизассемблер транслирует исполняемый модуль программы в текст на языке ассемблера.
Декомпиля́ция — процесс воссоздания исходного кода декомпилятором.
Удачность декомпиляции зависит от объема информации, представленной в декомпилируемом коде; байт-код, используемый большинством виртуальных машин (таких как JVM для машинный код более скуден и сложен в декомпиляции.
Если известно на каком языке была написана декомпилируемая программа, то в первую очередь дизассемблируются и анализируются библиотеки времени исполнения (run-time library) компилятора с этого языка, так как в основном компиляция программы сводится к вызовам с различными параметрами процедур из этих библиотек. Кроме того, многие компиляторы позволяют увидеть, в какой ассемблерный код превращаются операторы программы после компиляции. Эти конструкции становятся шаблонами для декомпилятора, поэтому процесс декомпиляции в некотором смысле похож на распознавание в машинном коде конечного набора подобных шаблонов. Легче всего распознаются вызовы и возврат из процедур. Они служат границами для восстановления операторов процедуры. В СССР декомпиляторы с языков PL/M-80 и Фортран-80 разрабатывались Н.А. Надольским в лаборатории Э.М. Пройдакова в ИПУ АН (1983—1984 гг).
Декомпиляция, в частности, используется при обратной разработке программ.
См. также
Wikimedia Foundation . 2010 .
Что значит декомпилировать файл и как декомпилируются файлы exe

Декомпиляция — это процесс восстановления исходного кода программы из машинного кода. Декомпилятор — это программа, которая может совершить процесс декомпиляции. Декомпилятор может быть разным:
- декомпилятор exe;
- декомпилятор с;
- декомпилятор ассемблера;
- и др.
Декомпиляция — это любимый процесс хакеров, хотя в некоторых случаях этот процесс помогает и с хорошими намерениями. Пока звучит как непонятная «каша», но давайте разбираться во всем по порядку.
Компиляция и декомпиляция — это противоположные процессы

Все мы знаем, что программирование может вестись на множестве языков. Всего языков насчитываю т тысячи, наиболее популярных несколько десятков, но их не понимает ни один компьютер. Компьютер понимает только свой собственный машинный язык, который состоит из единиц и нулей. Для того чтобы компьютер понял, что написал программист , необходим а компиляция.
Компиляция — это процесс преобразования программы в двоичный код. Двоичный код — это низкоуровневый машинный код, который понимает «железо». Код , написанный разработчиком , — это код высокого уровня, который понимает разработчик и интерпретаторы с компиляторами. Не будем углубляться глубоко в эту тематику, потому что есть языки компилируемые, есть интерпретируемые, есть «нейтральные», у которых код компилируется не в машинный код, а в собственный байт-код. Сейчас не об этом.
Итак, компиляция — это «перевод» программ, написанных разработчиками , на понятный компьютеру машинный язык. Этот процесс считается необратимым. Поэтому полностью восстановить исходный код программы после ее компиляции не может ни одна программа. Хотя сам такой процесс существует, и называется он декомпиляция.
Декомпиляция — это обратный процесс компиляции, также его называют «обратная разработка» или «реверс-инженерия». Суть ее сводится к простому — восстановить исходный код программы. Причем «хорошего» в этом процессе мало. Очень редко декомпиляцию применяют в добрых целях, например, чтобы восстановить исходники. Декомпи ля ция не восстанавливает исходники, а лишь предоставляет общую и запутанную структуру, в которой бывает очень трудно разобраться. Причем при декомпиляции прослеживается важная зависимость — чем сложнее и больше программа, тем менее точным будет конечный результат. Плю с и ногда разработчики применя ю т метод обфу ск аци и ( запутывания) исходного кода, тогда после декомпиляции такой программы исходный код практически не читаем.
Так для чего тогда нужна декомпиляция? Получить двоичный код программы может любой, а получить ее исходники — это уже проблема. Но бывают случаи, когда без исходников невозможно осуществить какое-либо действие с программой, например:
- полностью скопировать программу или какой-то отдельный ее функционал;
- взломать программ у б ез понимания ее структуры и архитектуры;
- внедрить вирус в программ у б ез понимания того, как построена программа;
- чтобы «обойти» лицензию или вообще отключить проверку лицензии;
- и др.
В основном декомпиляция нужна для «серых» целей, поэтому реверс-инженерия в некоторых странах наказуема законом. А декомпиляция — это важная часть реверс-инженерии, хотя очень часто эти два понятия считают идентичными.
Для того чтобы декомпиляция была более-менее успешной , важно знать , на каком языке написана программа или какой файл нужно декомпилировать ; от этого будет зависеть , какой инструмент нужно применять, например , декомпилятор «ехе» и декомпилятор «С» — это будут две разные программы. Есть , конечно , «общие» декомпиляторы, которые работают сразу со множеством языков, но результаты еще менее точны, чем у специальных декомпиляторов.
Сегодня мы рассмотрим , какой можно использовать декомпилятор, чтобы декомпилировать файл «ехе».
Декомпилятор ехе

Как мы знаем, ехе-файлы применяются в операционной системе Windows. В самой Виндовс по умолчанию не установлен «декомпилятор ехе», поэтому придется использовать программы «со стороны», которые могут помочь в решении этой задачи. Не будем задаваться вопросом, для чего вам это нужно. Нужно — значит , нужно.
Декомпиляторы ехе-файлов:
- VB Decompiler. Это самый популярны й декомпилятор ехе. Он ориентирован на декомпиляцию ехе-файлов, которые были разработаны при помощи языка программирования Visual Basic. Полностью бесплатный декомпилятор ехе.
- EMS Source Rescuer. Это тоже бесплатная программа, но она ориентирована на ехе-файлы, которые были созданы при помощи языков программирования Delphi или С++.
- ReFox. На нем отлично проходит декомпиляция ехе, если декомпилируемый файл был создан при помощи Visual FoxPro или FoxBase. Условно-бесплатная программ а с небольшим бесплатным периодом, далее придется платить.
- DeDe. Отличный декомпилятор ехе, но работает только с языком программирования Delphi.
- DnSpy. Это очень мощный инструмен т д ля «потрошения» программ и файлов exe. Декомпилирует программы на С# и Visual Basic. Помимо декомпилятора , несет в себе еще множество других инструментов: отладчик, НЕХ-редактор, редактор сборки и др.
- IDA Pro. Это профессиональный комплекс инструментов для полноценной реверс-инженерии. Среди прочих инструментов легко найти декомпилятор ехе. Однако у этой программы есть один минус — она очень дорогая с неадекватно завышенными ценами. Поэтому выхода два: на официальном сайте попробовать бесплатную демо-версию и решить свою проблему или тщательно поискать слитую в свободный доступ нужную версию программы — такие тоже имеются. Есть и третий выход — купить лицензию, но тогда будьте готовы заплатить за нее от 900 и до 4000$.
Заключение
Чтобы правильно подобрать декомпилятор для ехе-файлов, нужно знать , на каком языке написан желанный файл. Только в этом случае можно получить более-менее адекватный исходный код программы. Если вы не знаете, на каком языке написан ехе, тогда нужно будет пропустить ваш файл через несколько декомпиляторов , и тогда один из них выдаст вам искомый результат.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Декомпилятор
Декомпилятор это инструмент , используемый для восстановления, частично или полностью, в исходный код из программного обеспечения из исполняемой программы , то в двоичном формате .
Резюме
- 1 Использование
- 2 Технические
- 3 Правовые ограничения
- 3.1 Что гласит французское право
- 5.1 Внешние ссылки
использовать
Декомпиляция — это метод обратного проектирования или обратного проектирования . Его можно использовать для переноса и адаптации приложения, исходный код которого недоступен, для достижения функциональной совместимости, для перевода, анализа и проверки функционирования программы, а также для повторной отладки программы.
Таким образом, принцип декомпилятора состоит в том, чтобы изучить или протестировать работу этого программного обеспечения, чтобы определить идеи и принципы, которые лежат в основе любого элемента программного обеспечения при выполнении любой загрузки, отображения или выполнения, передачи или хранения программное обеспечение.
Программное обеспечение, исходный код которого доступен, не требует использования декомпилятора.
Декомпиляция — сложная проблема и со строго теоретической точки зрения невозможна. Декомпиляция — это функция, обратная функции компиляции (как правило) с языка высокого уровня на машинный. Проблема с декомпиляцией состоит в том, чтобы иметь возможность связать машинный код с семантически эквивалентной формой на языке высокого уровня. Математическая невозможность задачи зависит от выбранного языка. На ассемблере машин x86 есть инструкция, определяющая, произошло ли переполнение буфера . В языке C, в котором удалены вызовы ассемблера, невозможно иметь эквивалентную инструкцию. В этом случае необходимо будет написать конкретный код, но это будет означать изменение работы программы.
Однако для большинства языков программирования можно найти определенный объем информации о начальном исходном коде из скомпилированного кода. Декомпиляция — это вспомогательный инструмент обратного проектирования. Полностью автоматический декомпилятор невозможен.
Технический
Декомпилятор — это компилятор, который работает наоборот. Сначала он анализирует ( разбирает ) двоичный файл. Он также должен преобразовывать операторы условного перехода в switch , while и для элементов структурированного программирования . Последний шаг — записать исходные файлы .
Однако код, как правило, не очень удобочитаем, потому что он больше не следует правилам, применяемым при разработке программного обеспечения, исходные комментарии, в частности, отсутствуют, и практически невозможно определить, является ли переменная частью структуры или единичными данными. .
Правовые ограничения
Как правило, декомпиляция прямо запрещена лицензией на использование определенного проприетарного программного обеспечения . Иногда это запрещено законом в некоторых странах. В некоторых случаях обратное проектирование разрешено с целью взаимодействия .
Что говорит французский закон
Глава II: Имущественные права
Артикул L122-6.
(Закон № 94-361 от 10 мая 1994 г. Изобразительное искусство. 4 Официальный журнал 11 мая 1994 г. )
В соответствии с положениями статьи L. 122-6-1 право на использование, принадлежащее автору программного обеспечения, включает право выполнять и разрешать: 1 ° Постоянное или временное воспроизведение программного обеспечения полностью или частично любыми средствами и в любой форме. Поскольку загрузка, отображение, выполнение, передача или хранение этого программного обеспечения требует воспроизведения, эти действия возможны только с разрешения автора; 2 ° Перевод, адаптация, компоновка или любая другая модификация программного обеспечения и воспроизведение полученного программного обеспечения; 3 ° Размещение на рынке за плату или бесплатно, включая аренду, копии (ей) программного обеспечения любым способом. Однако первая продажа копии программного обеспечения на территории государства-члена Европейского сообщества или государства-участника Соглашения о Европейском экономическом пространстве автором или с его согласия исчерпана. Право на размещение этой копии на рынке во всех государствах-членах, за исключением права разрешить последующий прокат копии.
Артикул L122-6-1.
(внесен Законом № 94-361 от 10 мая 1994 г. Изобразительное искусство. 5 I Официальный журнал 11 мая 1994 г. )
I. Действия, предусмотренные в пунктах 1 и 2 статьи L. 122-6, не подлежат разрешению автора, когда они необходимы для разрешения использования программного обеспечения в соответствии с его назначением лицом, имеющим право использовать его, в том числе для исправления ошибок. Тем не менее, автор имеет право оставить по контракту право исправлять ошибки и определять конкретные условия, которым будут подчиняться действия, предусмотренные в пунктах 1 и 2 статьи L. 122-6, необходимые для разрешения использования. программного обеспечения в соответствии с его назначением лицом, имеющим право его использовать. II. Лицо, имеющее право использовать программное обеспечение, может сделать резервную копию, когда это необходимо для сохранения возможности использования программного обеспечения. III. Лицо, имеющее право использовать программное обеспечение, может без разрешения автора наблюдать, изучать или тестировать работу этого программного обеспечения, чтобы определить идеи и принципы, которые составляют основу любого элемента программного обеспечения, когда оно выполняет любую загрузку, отображение, выполнение, передачу или хранение программного обеспечения, которое имеет право выполнять. IV. Воспроизведение программного кода или перевод формы этого кода не подлежат разрешению автора, если воспроизведение или перевод в пределах значения 1 ° или 2 ° статьи L. 122-6 необходимы для получения информация, необходимая для взаимодействия независимо созданного программного обеспечения с другим программным обеспечением, при соблюдении следующих условий: 1 ° Эти действия совершаются лицом, имеющим право использовать копию программного обеспечения, или от его имени лицом, уполномоченным для этой цели; 2 ° Информация, необходимая для взаимодействия, еще не была сделана легко и быстро доступной для лиц, упомянутых в пункте 1 ° выше; 3 ° И эти действия ограничиваются частями исходного программного обеспечения, необходимыми для этой совместимости. Полученная таким образом информация не может быть: 1º Не используется ни для каких иных целей, кроме обеспечения функциональной совместимости независимо созданного программного обеспечения; 2 ° Не сообщается третьим лицам, кроме случаев, когда это необходимо для функциональной совместимости программного обеспечения, созданного независимо; 3 °. Не используется для разработки, производства или маркетинга программного обеспечения, выражения которого по существу аналогичны, или для любых других действий, нарушающих авторские права. V. Настоящая статья не может быть истолкована как позволяющая вмешиваться в нормальное использование программного обеспечения или причинять неоправданный ущерб законным интересам автора. Любая оговорка, противоречащая положениям II, III и IV данной статьи, не имеет юридической силы.
Примечания и ссылки
- ↑ (in) Сатиш Сампат, « декомпиляция » , режим отладки , обновлено 22 октября 2001 г.
Смотрите также
Внешние ссылки
- ( fr ) DeCompilation Wiki — справочный сайт (в форме Wiki) по вопросам декомпиляции: история, исследования, существующие декомпиляторы и т. д.
Создание исходного кода из сборок .NET во время отладки
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code 
При отладке приложения .NET может потребоваться просмотреть исходный код, который у вас нет. Например, происходит прерывание в исключении, или стек вызовов используется для перехода к исходному расположению.
- Создание исходного кода (декомпиляция) возможно только для приложений .NET и построено на проекте ILSpy с открытым кодом.
- Декомпиляция доступна только в Visual Studio 2019 версии 16.5 и более поздних версий.
- Атрибут SuppressIldasmAttribute, примененный к сборке или модулю, не позволит Visual Studio выполнить декомпиляцию. Хотя атрибут устарел в .NET 6 и более поздних версиях, Visual Studio учитывает атрибут.
Создание исходного кода
Если при выполнении отладки исходный код недоступен, в Visual Studio отображается документ Исходный код не найден, а если отсутствуют символы для сборки, отображается документ Символы не загружены. Оба документа имеют параметр Декомпилировать исходный код, который создает код C# для текущего расположения. Созданный код C# можно использовать так же, как любой другой исходный код. Вы можете просматривать этот код, проверять переменные, устанавливать точки останова и т. д.
Символы не загружены
На следующем рисунке показано сообщение Символы не загружены.

Исходный код не найден
На следующем рисунке показано сообщение Исходный код не найден.

Создание и внедрение исходного кода для сборки
Можно создать не только исходный код для определенного расположения, но и весь исходный код для конкретной сборки .NET. Чтобы выполнить эту задачу, перейдите в окно «Модули» и в контекстном меню сборки .NET, а затем выберите команду decompile Source to Symbol File . Visual Studio создает файл символов для сборки, а затем внедряет исходный код в файл символов. На последующем этапе можно извлечь внедренный исходный код.

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

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

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

SourceLink
Для библиотек .NET или пакетов NuGet, включенных для SourceLink, можно также выполнять по шагам исходный код, задавать точки останова и использовать все функции отладчика. Дополнительные сведения см. в разделе «Включение отладки и диагностика с помощью исходного канала» и «Улучшение производительности во время отладки» с помощью SourceLink.
Известные ограничения
Требуется режим прерывания выполнения

Создание исходного кода с помощью декомпиляции возможно только в том случае, если отладчик находится в режиме прерывания выполнения и приложение приостановлено. Например, Visual Studio переходит в режим прерывания, попадая в точку останова или в исключение. Вы можете легко активировать Visual Studio, чтобы разорвать следующий раз, когда код выполняется с помощью команды Break All ().
Ограничения декомпиляции
Создание исходного кода из промежуточного языка (IL), используемого в сборках .NET, имеет некоторые внутренние ограничения. Поэтому созданный исходный код не выглядит в точности как оригинальный исходный код. Большая часть различий сосредоточена в тех местах, где информация в оригинальном исходном коде не нужна во время выполнения. Например, во время выполнения не нужна такая информация, как пробелы, комментарии и имена локальных переменных. Рекомендуется использовать созданный исходный код, чтобы понять, как выполняется программа, а не в качестве замены оригинального исходного кода.
Отладка оптимизированных сборок или сборок выпуска
При отладке кода, декомпилированного из сборки, скомпилированной с помощью оптимизаций компилятора, могут возникнуть следующие проблемы:
- Точки останова могут не всегда привязаться к сопоставлению расположения источника данных.
- Пошаговое выполнение может не всегда выполняться в правильном расположении.
- Локальные переменные могут не иметь точных имен.
- Некоторые переменные могут быть недоступны для оценки.
Дополнительные сведения можно найти в проблеме GitHub: интеграция ICSharpCode.Decompiler с ОТладчиком VS.
Надежность декомпиляции
Относительно небольшой процент попыток декомпиляции может привести к сбою. Это поведение связано с ошибкой null-ссылочной точки последовательности в ILSpy. Мы устранили этот сбой путем перехвата таких проблем и корректного завершения попытки декомпиляции.
Дополнительные сведения можно найти в проблеме GitHub: интеграция ICSharpCode.Decompiler с ОТладчиком VS.
Ограничения при работе с асинхронным кодом
Результаты декомпиляции модулей с шаблонами кода async/await могут быть неполными или завершаются сбоем. Шаблоны кода async/await и машины состояния yield state-machine в ILSpy реализованы только частично.
Дополнительные сведения можно найти в проблеме с GitHub: состояние генератора PDB.
Только мой код
Параметр Just My Code (JMC) позволяет Visual Studio перешагировать системные, платформы, библиотеки и другие вызовы, не являющиеся пользователями. Во время сеанса отладки в окне Модули отображаются модули кода, которые отладчик воспринимает как «Мой код» (т. е. пользовательский код).
Декомпиляция оптимизированных или выпускных модулей создает неиспользуемый код. Если отладчик прерывает работу в коде неиспользуемого неиспользуемого кода, например, откроется окно «Нет источника «. Чтобы отключить режим «Только мой код», перейдите в раздел Инструменты>Параметры (или Отладка>Параметры) >Отладка>Общие и снимите флажок Включить только мой код.
Извлеченный исходный код
Исходный код, извлеченный из сборки, имеет следующие ограничения.
- Имена и расположение созданных файлов нельзя настроить.
- Файлы являются временными и удаленными Visual Studio.
- Файлы помещаются в одну папку без использования какой-либо иерархии, которая была в оригинальных исходных файлах.
- Имя каждого файла содержит хэш контрольной суммы файла.
Создается только код C#
При декомпиляции создаются только файлы исходного кода на C#. Нет возможности создавать файлы на любом другом языке.
