Декомпилировать что это значит
Перейти к содержимому

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

  • автор:

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

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

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

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

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

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

См. также

Wikimedia Foundation . 2010 .

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

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

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

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

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

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

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

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

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

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

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

Как работает декомпиляция в .Net или Java на примере .Net

Сегодня хотелось бы поговорить про декомпиляцию приложений (все применительно к той же Java, да и любому языку с некоторыми допущениями и ограничениями, но поскольку сам я — .Net разработчик, примеры будут совсем немного MSIL’овизированы 🙂 ).

    (поддержка R# хоткеев, сервер символов) (также не плохой, множество хоткеев) (аналог dotPeek, но платный. Изначально был основным в мире .Net, но пока был бесплатным) (хороший, opensource. Полезен, когда вы сами пишете код, использующий Mono.Cecil, т.к. Это даст лучшее понимание его работы) с функцией inplace editor
    (основной, самый крутой декомпилятор в мире .Net. На выходе получаете объектное «зеркало» содержимого сборки. Т.е. Максимально-упрощенно, без наворотов типа конвертации массива IL в DOM). (надстройка над mono.cecil, переводящая array[MSIL] в DOM, где есть циклы, switches и if’ы. Является частью SharpDevelop/ILSpy) (аналогичное от меня, но сохраняющее информацию о символах. В среднем состоянии, не готова для прода, помощь приветствуется).

А теперь, хотелось бы описать как они работают (вам же интересно, как работает машинка от JetBrains?). Чтобы как минимум понять, насколько это сложно: написать свой декомпилятор .Net сборки обратно в код на C#.

  1. Должен принимать на вход любую сборку: от CLR 1.* до 4.*
  2. Обязан поддерживать не только C# вывод, но и MSIL, VB.NET и вообще — на что фантазии и потребностей хватит.
  3. Возможность выбирать между различными версиями языка (например, C#), при этом не имея дублирования в реализации.

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

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

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

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

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

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

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

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

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

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

    Т.е. Сначала у нас есть на входе 4 команды. Первые две ничего не берут на вход, а только отдают — число. Соответственно, мы кладем их на стек (ldind_i4 4, ldind_i4 5). После чего мы берем очередную команду — Add. Она принимает на вход два значения со стека. Поэтому мы считываем два узла с нашего стека и, схоранив их как параметры этой команды, сохраняем саму команду- на стек, поскольку у команды есть результат. А любой результат сохраняется на стеке.

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

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

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 71ad3134da799b95 • Your IP : 82.102.23.104 • Performance & security by Cloudflare

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

Lorem ipsum dolor

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

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

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

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

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

  • и др.

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

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

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

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

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

  5. DnSpy. Это очень мощный инструмен т д ля «потрошения» программ и файлов exe. Декомпилирует программы на С# и Visual Basic. Помимо декомпилятора , несет в себе еще множество других инструментов: отладчик, НЕХ-редактор, редактор сборки и др.

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

Заключение

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

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

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

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

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