декомпилировать что это значит

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

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

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

Удачность декомпиляции зависит от объема информации, представленной в декомпилируемом коде; байт-код, используемый большинством виртуальных машин (таких как 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 делать неочевидным, запутанным, сбивать с толку), или запутывание кода приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но… … Википедия

Источник

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

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

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

Читайте также:  что означает первая буква в имени мужчины

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

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

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

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

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

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

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

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

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

Источник

И теперь, когда требования определены, давайте подумаем, как устроена работа 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 и соответствующая нода. Дополнительно, необходимо считать количество пробелов, которые надо отступать с начала каждой строки. На этом этапе все достаточно просто.

Источник

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

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

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

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

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

Читайте также:  Болит горло на ранних сроках беременности чем лечить

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

Источник

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

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

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

Если известно на каком языке была написана декомпилируемая программа, то в первую очередь дизассемблируются и анализируются библиотеки времени исполнения (RTL — runtime library) компилятора с этого языка, так как в основном компиляция программы сводится к вызовам с различными параметрами процедур из этих библиотек. Кроме того, многие компиляторы позволяют увидеть, в какой ассемблерный код превращаются операторы программы после компиляции. Эти конструкции становятся шаблонами для декомпилятора, поэтому процесс декомпиляции в некотором смысле похож на распознавание в машинном коде конечного набора подобных шаблонов. Легче всего распознаются вызовы процедур и возвраты из них. Они служат границами для восстановления операторов процедуры.

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

Связанные понятия

О программном обеспечении рассказывает другая статья.Переносимое приложение (также портативное, автономное, и — неточно, в качестве кальки — портированное; англ. portable application, portable app) — программное обеспечение, которое для своего запуска не требует процедуры установки и может полностью храниться на съёмных носителях информации, что позволяет использовать данное ПО на многих компьютерах. Переносимое приложение может быть настроено так, чтобы считывать свои конфигурационные настройки.

Источник

Ответы на вопросы