Декомпиляция что это такое

Декомпиляция

Декомпиля́тор — это программа, транслирующая исполняемый модуль (полученный на выходе компилятора) в относительно эквивалентный исходный код на языке программирования высокого уровня. Для сравнения, дизассемблер транслирует исполняемый модуль программы в текст на языке ассемблера.

Декомпиля́ция — процесс воссоздания исходного кода декомпилятором.

Удачность декомпиляции зависит от объема информации, представленной в декомпилируемом коде; байт-код, используемый большинством виртуальных машин (таких как JVM для машинный код более скуден и сложен в декомпиляции.

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

Декомпиляция, в частности, используется при обратной разработке программ.

См. также

Смотреть что такое «Декомпиляция» в других словарях:

декомпиляция — Восстановление исходного текста программы на языке высокого уровня из ее исполнимого кода или объектных модулей. [http://www.morepc.ru/dict/] Тематики информационные технологии в целом EN decompiling … Справочник технического переводчика

декомпиляция — см. декомпилировать; и; ж … Словарь многих выражений

Компилятор — Эта статья включает описание термина «Компиляция»; см. также другие значения. Компилятор программа или техническое средство, выполняющее компиляцию.[1][2][3] Компиляция трансляция программы, составленной на исходном языке высокого… … Википедия

Обратная разработка — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия

Self — объектно ориентированный, прототипный язык программирования, который задумывался как развитие языка Smalltalk. Разрабатывался в лаборатории Xerox PARC, а потом в Стэндфордском университете. Это была экспериментальная разработка, целью которой… … Википедия

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

Обфускация — (от лат. obfuscare затенять, затемнять; и англ. obfuscate делать неочевидным, запутанным, сбивать с толку) или запутывание кода приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но… … Википедия

Электронный ключ — У этого термина существуют и другие значения, см. Электронный ключ (значения). Электронный ключ (также аппаратный ключ, иногда донгл от англ. dongle) аппаратное средство, предназначенное для защиты программного обеспечения (ПО) и данных от… … Википедия

Self (язык программирования) — Self объектно ориентированный, прототипный язык программирования, который задумывался как развитие языка Xerox PARC, а потом в Стэндфордском университете. Это была экспериментальная разработка, целью которой было выяснить, насколько далеко можно… … Википедия

Запутывание кода — Обфускация (от лат. obfuscare затенять, затемнять; и англ. obfuscate делать неочевидным, запутанным, сбивать с толку), или запутывание кода приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но… … Википедия

Источник

Как работает декомпиляция?

Я слышал термин «декомпиляция», используемый несколько раз раньше, и мне становится очень любопытно, как это работает.

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

Я также слышал термин»дизассемблер«, в чем разница между дизассемблером и декомпилятором?

Итак, чтобы подвести итог моему вопросу (- ам): Что именно участвует в процессе декомпиляции чего-либо? Как это обычно делается? Насколько сложны / легки процессы? может ли он произвести точный код? И в чем разница между декомпилятор и дизассемблер?

2 ответов

Ilfak Guilfanov, автор Декомпилятор Шестигранных Лучей, произнес речь о внутренней работе своего декомпилятора на каком-то con, и вот белая бумага и презентация. Это описывает хороший обзор в том, что все трудности в создании декомпилятора и как заставить все это работать.

в чем разница между дизассемблер и декомпилятор?

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

при компиляции, компилятор сначала генерирует файл сборки для этой функции, он может выглядеть примерно так:

(Я это придумал, а не реальные двоичные инструкции). Теперь вы знаете, что A дизассемблер переносит вас из двоичной формы в форму сборки. А декомпилятор переносит вас из формы сборки в код C (или какой-либо другой язык более высокого уровня).

Декомпиляция по существу является обратной компиляцией. То есть-взять объектный код (двоичный) и попытаться воссоздать исходный код из него.

Декомпиляция зависит от артефактов, оставленных в объектном коде, которые могут быть использованы для определения структуры исходного кода.

с C / C++ не так много осталось, чтобы помочь процессу декомпиляции, поэтому это очень сложно. Однако с Java и C# и другими языками, которые нацелены на виртуальные машины, это может быть легче декомпилировать, потому что язык оставляет гораздо больше подсказок в объектном коде.

Источник

Что такое компиляция и декомпиляция?

Компиляция – это преобразование программы из исходного текстового кода в байт-код.

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

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

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

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

Декомпиляция – сложный процесс воссоздания исходника из машинного кода, или обратная разработка.

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

Прежде чем пытаться распотрошить софт на исходные составляющие, в первую очередь необходимо знать его язык программирования. После этого можно предварительно провести дизассемблирование программы и тщательный анализ его библиотек RTL.

Только в этом случае можно приблизительно восстановить программу в первозданном виде. Как правило, полученный код значительно отличается от написанного программистом: он выглядит запутанным, и разобраться в таком исходнике порой бывает проблематично.

Нередко при компиляции среды разработки применяется метод обфускации (запутывания) кода. В таком случае процедура декомпиляции становится затруднительной или практически невозможной.

Цель декомпиляции – взлом и модификация программы, удаление триала и внедрение вируса. Реже декомпиляция нужна при утере исходников.

Источник

Что значит декомпилировать файл и как декомпилируются файлы exe

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

Декомпиляция — это процесс восстановления исходного кода программы из машинного кода. Декомпилятор — это программа, которая может совершить процесс декомпиляции. Декомпилятор может быть разным:

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

Компиляция и декомпиляция — это противоположные процессы

Декомпиляция — это обратный процесс компиляции, также его называют «обратная разработка» или «реверс-инженерия». Суть ее сводится к простому — восстановить исходный код программы. Причем «хорошего» в этом процессе мало. Очень редко декомпиляцию применяют в добрых целях, например, чтобы восстановить исходники. Декомпи ля ция не восстанавливает исходники, а лишь предоставляет общую и запутанную структуру, в которой бывает очень трудно разобраться. Причем при декомпиляции прослеживается важная зависимость — чем сложнее и больше программа, тем менее точным будет конечный результат. Плю с и ногда разработчики применя ю т метод обфу ск аци и ( запутывания) исходного кода, тогда после декомпиляции такой программы исходный код практически не читаем.

Так для чего тогда нужна декомпиляция? Получить двоичный код программы может любой, а получить ее исходники — это уже проблема. Но бывают случаи, когда без исходников невозможно осуществить какое-либо действие с программой, например:

полностью скопировать программу или какой-то отдельный ее функционал;

взломать программ у б ез понимания ее структуры и архитектуры;

внедрить вирус в программ у б ез понимания того, как построена программа;

чтобы «обойти» лицензию или вообще отключить проверку лицензии;

В основном декомпиляция нужна для «серых» целей, поэтому реверс-инженерия в некоторых странах наказуема законом. А декомпиляция — это важная часть реверс-инженерии, хотя очень часто эти два понятия считают идентичными.

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

VB Decompiler. Это самый популярны й декомпилятор ехе. Он ориентирован на декомпиляцию ехе-файлов, которые были разработаны при помощи языка программирования Visual Basic. Полностью бесплатный декомпилятор ехе.

EMS Source Rescuer. Это тоже бесплатная программа, но она ориентирована на ехе-файлы, которые были созданы при помощи языков программирования Delphi или С++.

ReFox. На нем отлично проходит декомпиляция ехе, если декомпилируемый файл был создан при помощи Visual FoxPro или FoxBase. Условно-бесплатная программ а с небольшим бесплатным периодом, далее придется платить.

DeDe. Отличный декомпилятор ехе, но работает только с языком программирования Delphi.

IDA Pro. Это профессиональный комплекс инструментов для полноценной реверс-инженерии. Среди прочих инструментов легко найти декомпилятор ехе. Однако у этой программы есть один минус — она очень дорогая с неадекватно завышенными ценами. Поэтому выхода два: на официальном сайте попробовать бесплатную демо-версию и решить свою проблему или тщательно поискать слитую в свободный доступ нужную версию программы — такие тоже имеются. Есть и третий выход — купить лицензию, но тогда будьте готовы заплатить за нее от 900 и до 4000$.

Заключение

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Источник

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

И теперь, когда требования определены, давайте подумаем, как устроена работа MSIL, и как это поможет нам в быстрой декомпиляции приложения.

В отличии от языка процессора, который вносит для нас некоторые сложности в процесс декомпиляции (регистры, оптимизации, возможность сделать одно действие несколькими способами), в MSIL все максимально просто. Если надо записать в локальную переменную нечто, то для этого есть всего одна команда. Другим способом записать в переменную значение не получится. Это свойство наделяет конечный компилятор (JITter) простотой в реализации с одной стороны… А с другой стороны наделяет простотой в реализации декомпилирующую сторону.

Второе свойство, каким обладает MSIL, это вычисления на стеке. Тут нет регистров. И единственная память, через которую идут все вычисления — это стек. Это абсолютно не значит что конечный процессор также все вычисляет через стек. Нет. Это значит что этой моделью для упрощения пользуется описание всех расчетов и вызовов на MSIL. Что это значит для нас? Это значит что сложить два числа можно только одной командой, которая вне зависимости от параметров — одна. Это команда, вытащив данные для сложения из стека, складывает их и сохраняет результат не куда-либо, а обратно в стек. Это важно, потому что для нас, как для людей, пишущих декомпилятор это не породит огромного ветвления кода.

Теперь мы подошли к самому главному: как происходит процесс декомпиляции.

Первая трудность, которая приходит в голову: положение инструкций может быть различным. Т.е., например, чтобы код выполнился, совсем не обязательно что между ldind_i4 и add не будет других инструкций. Например, совершенно валиден следующий код:

Что должно декомпилироваться, например, так:

Во-вторых названия переменных в релизе могут отсутствовать. Т.е. без примесей, код будет таким:

В третьих, что самое сложное, реализации if-else, while, do-while, switch могут отличаться. Этого касаются, в особенности, лямбды, yields, async/awaits и прочие языковые примочки, которые являются опциональными и на самом деле реализуются поверх обычных функций языка. Как все это учесть? На самом деле оба вопроса решаются всего двумя способами.

Стековая модель декомпиляции

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

Соответственно, если бы выражение было бы посложнее:

То процесс создания DOM выглядел бы следующим образом:

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

После чего осуществляется окончательная сборка дерева:

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

Таким же образом конструируются вызовы методов. Только в случае методов, со стека будет забираться требуемое под вызов количество параметров и сохраняться в классе ноды вызова метода. Если метод возвращает значение, то нода вызова метода будет сложена в стек. Если нет — добавлена к группе готовых выражений.

Сборка дерева

Это все были подготовительные этапы. Далее, для модульности, создаются классы, которые распознают какую-либо одну конструкцию в дереве и переводят ее в другую. Например, если это if-else, то матчится наличие условного перехода такого, чтобы переход осуществлялся вперед. Тогда узел преобразуется в if-else ноду, код за переходом помечается как else (negative if) нода, а код между условием и else нодой — как positive if нода. Если матчится как условный переход с переходом на прошлые инструкции, то это матчится как while цикл и дерево также перестраивается. Соответственно, в зависимости от чистоты исполнения матчеров, на выходе мы получем преобразованное дерево под конкретный язык программирования. Далее, у каждого из языков программирования мы задаем множество матчеров, которые ему подходят. Например, циклы и условия подойдут всем, потому они будут присутствовать почти во всех пакетах. А вот, например, async/await — он только для C#. Потому, будет присутствовать тольк в его пакете.

Для ясности картины, как собираются if-else и while/do-while, рассмотрим примеры:

Сборка IF-ELSE блока

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

Сборка WHILE блока

Декомпиляция что это такое. Смотреть фото Декомпиляция что это такое. Смотреть картинку Декомпиляция что это такое. Картинка про Декомпиляция что это такое. Фото Декомпиляция что это такое

Генерация кода

Последний этап матчинга — генерация кода по дереву. Тут не должно быть каких-то сложностей. Идеально, конечно, было бы круто подсасывать правила от R# или StyleCop. Благо, они в XML. Но в простейшем случае, мы пишем генератор, который принимает на вход дерево описания класса. Он сперва обязан проверить все дерево: содержит ли оно не поддерживаемые типы нод. Если все в порядке, то обходится все дерево и для каждого узла вызывается соответствующий метод по шаблону проектирования Visitor, которому передается StringBuilder и соответствующая нода. Дополнительно, необходимо считать количество пробелов, которые надо отступать с начала каждой строки. На этом этапе все достаточно просто.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *