Jump to content

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

(Перенаправлено из Декомпиляции )

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

Введение

[ редактировать ]

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

Декомпиляция — это использование декомпилятора, хотя этот термин также может относиться к результатам работы декомпилятора. Его можно использовать для восстановления утерянного исходного кода, а также в некоторых случаях полезно для компьютерной безопасности , совместимости и исправления ошибок . [1] Успех декомпиляции зависит от количества информации, присутствующей в декомпилируемом коде, и сложности проведенного над ним анализа. Форматы байт-кода, используемые многими виртуальными машинами (такими как виртуальная машина Java или .NET Framework среда общего языка ), часто включают обширные метаданные и функции высокого уровня, которые делают декомпиляцию вполне осуществимой. Применение отладочных данных , то есть отладочных символов, может позволить воспроизвести оригинальные имена переменных и структур и даже номера строк. Машинный язык без таких метаданных или отладочных данных декомпилировать гораздо сложнее. [2]

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

Хотя декомпиляторы обычно используются для (повторного) создания исходного кода из двоичных исполняемых файлов, существуют также декомпиляторы для превращения определенных файлов двоичных данных в удобочитаемые и редактируемые исходные файлы. [3] [4]

На уровень успеха, достигнутый декомпиляторами, могут влиять различные факторы. К ним относится уровень абстракции исходного языка: если объектный код содержит явную информацию о структуре классов, это облегчает процесс декомпиляции. Описательная информация, особенно детали именования, также ускоряет работу компилятора. Более того, менее оптимизированный код быстрее декомпилируется, поскольку оптимизация может привести к большему отклонению от исходного кода. [5]

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

Погрузчик

[ редактировать ]

Первая фаза декомпиляции загружает и анализирует входной машинный код или на промежуточном языке программы формат двоичного файла . Он должен быть в состоянии обнаружить основные факты о программе ввода, такие как архитектура (Pentium, PowerPC и т. д.) и точка входа. Во многих случаях он должен быть в состоянии найти эквивалент main функция программы C , которая является началом написанного пользователем кода. Это исключает код инициализации среды выполнения, который по возможности не следует декомпилировать. Если доступно, также загружаются таблицы символов и отладочные данные. Интерфейсная часть может идентифицировать используемые библиотеки, даже если они связаны с кодом, это обеспечит библиотечные интерфейсы. Если он сможет определить используемый компилятор или компиляторы, он может предоставить полезную информацию для выявления идиом кода. [6]

Разборка

[ редактировать ]

Следующим логическим этапом является дизассемблирование инструкций машинного кода в машинно-независимое промежуточное представление (IR). Например, Pentium машинная инструкция

mov    eax, [ebx+0x04]

может быть переведен в ИР

eax  := m[ebx+4];

Для идиом

[ редактировать ]

Идиоматические последовательности машинного кода — это последовательности кода, объединенная семантика которых не сразу очевидна из индивидуальной семантики инструкций. Либо в рамках фазы разборки, либо в рамках последующего анализа эти идиоматические последовательности необходимо перевести в известный эквивалент IR. Например, ассемблерный код x86 :

    cdq    eax             ; edx is set to the sign-extension≠edi,edi +(tex)push
    xor    eax, edx
    sub    eax, edx

можно перевести на

eax  := abs(eax);

Некоторые идиоматические последовательности не зависят от машины; некоторые включают только одну инструкцию. Например, xor eax, eax очищает eax регистр (устанавливает его в ноль). Это можно реализовать с помощью машинно-независимого правила упрощения, такого как a = 0.

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

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

Анализ программы

[ редактировать ]

К IR можно применить различные программные анализы. В частности, распространение выражений объединяет семантику нескольких инструкций в более сложные выражения. Например,

    mov   eax,[ebx+0x04]
    add   eax,[ebx+0x08]
    sub   [ebx+0x0C],eax

может привести к следующему IR после распространения выражения:

m[ebx+12]  := m[ebx+12] - (m[ebx+4] + m[ebx+8]);

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

Анализ потока данных

[ редактировать ]

Места, где определяется и используется содержимое регистров, необходимо отслеживать с помощью анализа потока данных . Тот же анализ можно применить к местоположениям, которые используются для временных и локальных данных. Затем для каждого такого связанного набора определений и применений ценностей можно сформировать другое имя. Возможно, одно и то же местоположение локальной переменной использовалось для нескольких переменных в разных частях исходной программы. Хуже того, анализ потока данных может выявить путь, по которому значение может перемещаться между двумя такими видами использования, даже если на самом деле это никогда не произойдет и не будет иметь значения в реальности. В плохих случаях это может привести к необходимости определять местоположение как объединение типов. Декомпилятор может позволить пользователю явно разорвать такие неестественные зависимости, что приведет к более четкому коду. Это, конечно, означает, что переменная потенциально может использоваться без инициализации, что указывает на проблему в исходной программе. [ нужна ссылка ]

Типовой анализ

[ редактировать ]

Хороший декомпилятор машинного кода выполнит анализ типов. Здесь способ использования регистров или ячеек памяти приводит к ограничениям на возможный тип ячейки. Например, and инструкция подразумевает, что операнд является целым числом; программы не используют такую ​​операцию со значениями с плавающей запятой (за исключением специального библиотечного кода) или с указателями . Ан add Инструкция приводит к трем ограничениям, поскольку операнды могут быть как целыми числами, так и одним целым числом и одним указателем (с целыми числами и указателями соответственно; третье ограничение связано с упорядочиванием двух операндов, когда их типы различны). [7]

Могут быть распознаны различные выражения высокого уровня, которые запускают распознавание структур или массивов. Однако отличить многие возможности сложно из-за свободы, которую допускают машинный код или даже некоторые языки высокого уровня, такие как C, с приведением типов и арифметикой указателей.

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

struct T1 *ebx;
    struct T1 {
        int v0004;
        int v0008;
        int v000C;
    };
ebx->v000C -= ebx->v0004 + ebx->v0008;

Структурирование

[ редактировать ]

Предпоследний этап декомпиляции включает в себя структурирование IR в конструкции более высокого уровня, такие как while петли и if/then/else условные высказывания. Например, машинный код

    xor eax, eax
l0002:
    or  ebx, ebx
    jge l0003
    add eax,[ebx]
    mov ebx,[ebx+0x4]
    jmp l0002
l0003:
    mov [0x10040000],eax

можно перевести на:

eax = 0;
while (ebx < 0) {
    eax += ebx->v0000;
    ebx = ebx->v0004;
}
v10040000 = eax;

Неструктурированный код сложнее перевести в структурированный, чем уже структурированный код. Решения включают репликацию некоторого кода или добавление логических переменных. [8]

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

[ редактировать ]

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

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

Другие методы

[ редактировать ]

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

Законность

[ редактировать ]

На большинство компьютерных программ распространяется действие законов об авторском праве . Хотя точный объем того, на что распространяется авторское право, различается в зависимости от региона, закон об авторском праве обычно предоставляет автору (программисту(ам) или работодателю) набор исключительных прав на программу. [10] компьютера Эти права включают в себя право создавать копии, в том числе копии, вносимые в оперативную память (за исключением случаев, когда создание такой копии необходимо для использования программы). [11] Поскольку процесс декомпиляции предполагает создание нескольких таких копий, он, как правило, запрещен без разрешения правообладателя. Однако, поскольку декомпиляция часто является необходимым шагом для достижения совместимости программного обеспечения , законы об авторском праве как в США, так и в Европе разрешают декомпиляцию в ограниченной степени.

В Соединенных Штатах защита добросовестного использования авторских прав успешно применяется в делах о декомпиляции. Например, в деле Sega v. Accolade суд постановил, что Accolade может на законных основаниях заниматься декомпиляцией, чтобы обойти механизм блокировки программного обеспечения, используемый игровыми консолями Sega. [12] Кроме того, Закон об авторском праве в цифровую эпоху (ПУБЛИЧНЫЙ ЗАКОН 105–304). [13] ) имеет соответствующие исключения для тестирования и оценки безопасности в §1201(i) и обратного проектирования в §1201(f). [14]

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

  • Во-первых, физическое или юридическое лицо должно иметь лицензию на использование декомпилируемой программы.
  • Во-вторых, декомпиляция должна быть необходима для достижения совместимости с целевой программой или другими программами. Поэтому информация о совместимости не должна быть легкодоступной, например, в руководствах или документации API . Это важное ограничение. Необходимость должна быть доказана декомпилятором. Целью этого важного ограничения является, прежде всего, стимулирование разработчиков документировать и раскрывать информацию о совместимости своих продуктов. [15]
  • В-третьих, процесс декомпиляции должен, если возможно, ограничиваться частями целевой программы, имеющими отношение к совместимости. Поскольку одной из целей декомпиляции является понимание структуры программы, это третье ограничение может быть трудно преодолеть. Опять же, бремя доказательства лежит на декомпиляторе.

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

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

  1. ) право на декомпиляцию используется нечасто, и поэтому право на декомпиляцию может быть ненужным,
  2. ) право на декомпиляцию функционирует хорошо и обеспечивает достаточную юридическую определенность, чтобы не вызывать юридических споров или
  3. ) незаконная декомпиляция остается практически незамеченной.

В отчете 2000 года о реализации Директивы по программному обеспечению европейскими государствами-членами Европейская комиссия , похоже, поддержала вторую интерпретацию. [16]

См. также

[ редактировать ]

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

[ редактировать ]

Другие декомпиляторы

[ редактировать ]


  1. ^ Ван Эммерик, Майк (29 апреля 2005 г.). «Зачем декомпиляция» . Программа-трансформация.org. Архивировано из оригинала 22 сентября 2010 г. Проверено 15 сентября 2010 г.
  2. ^ Мечниковский, Джером; Хендрен, Лори (2002). «Декомпиляция байт-кода Java: проблемы, ловушки и подводные камни». В Хорспуле, Р. Найджел (ред.). Строительство компилятора: 11-я Международная конференция, труды / КК 2002 . Спрингер-Верлаг . стр. 111–127. ISBN  3-540-43369-4 .
  3. ^ Пол, Маттиас Р. (10 июня 2001 г.) [1995]. «Описание формата файлов .CPI DOS, OS/2 и Windows NT и Linux .CP» (файл CPI.LST) (изд. 1.30). Архивировано из оригинала 20 апреля 2016 г. Проверено 20 августа 2016 г.
  4. ^ Пол, Матиас Р. (13 мая 2002 г.). "[fd-dev] mkeyb" . freedos-dev . Архивировано из оригинала 10 сентября 2018 г. Проверено 10 сентября 2018 г. […] Анализатор, валидатор и декомпилятор файлов кодовых страниц .CPI и .CP […] Обзор параметров /Style: […] Исходные включаемые файлы ASM […] Автономные исходные файлы ASM […] Модульные исходные файлы ASM […]
  5. ^ Эло, Томми; Хасу, Теро (2003). «Обнаружение совместного производного исходного кода – обзор» (PDF) . Технический юридический отчет об авторских правах на исходный код компьютерных программ в Финляндии и Европе .
  6. ^ Сифуэнтес, Кристина; Гоф, К. Джон (июль 1995 г.). «Декомпиляция бинарных программ». Программное обеспечение: практика и опыт . 25 (7): 811–829. CiteSeerX   10.1.1.14.8073 . дои : 10.1002/спе.4380250706 . S2CID   8229401 .
  7. ^ Майкрофт, Алан (1999). «Декомпиляция на основе типов». В Свирстре, С. Доайтсе (ред.). Языки и системы программирования: 8-й Европейский симпозиум по языкам и системам программирования . Спрингер-Верлаг . стр. 208–223. ISBN  3-540-65699-5 .
  8. ^ Сифуэнтес, Кристина (1994). «Глава 6». Методы обратной компиляции (PDF) (кандидатская диссертация). Квинслендский технологический университет . Архивировано (PDF) из оригинала 22 ноября 2016 г. Проверено 21 декабря 2019 г. )
  9. ^ Тянь, Юаньдун; Фу, Ченг (27 января 2021 г.). «Представляем N-Bref: структуру декомпилятора на основе нейронов» . Проверено 30 декабря 2022 г.
  10. ^ Роуленд, Дайан (2005). Право информационных технологий (3-е изд.). Кавендиш. ISBN  1-85941-756-6 .
  11. ^ «Бюро авторских прав США — Закон об авторском праве: Глава 1» . Архивировано из оригинала 25 декабря 2017 г. Проверено 10 апреля 2014 г.
  12. ^ «Законность декомпиляции» . Программа-трансформация.org. 03.12.2004. Архивировано из оригинала 22 сентября 2010 г. Проверено 15 сентября 2010 г.
  13. ^ «Закон об авторском праве в цифровую эпоху» (PDF) . Конгресс США . 28 октября 1998 г. Архивировано (PDF) из оригинала 10 декабря 2013 г. Проверено 15 ноября 2013 г.
  14. ^ «Федеральный реестр::Запросить доступ» . Архивировано из оригинала 25 января 2022 г. Проверено 31 января 2021 г.
  15. ^ Чарнота, Бриджит; Харт, Роберт Дж. (1991). Правовая защита компьютерных программ в Европе: руководство по директиве ЕС . Лондон: Баттервортс Толли . ISBN  0-40600542-7 .
  16. ^ «Отчет Комиссии Совету, Европейскому парламенту и Экономическому и социальному комитету о реализации и влиянии Директивы 91/250/EEC о правовой защите компьютерных программ» . Архивировано из оригинала 04 декабря 2020 г. Проверено 26 декабря 2020 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 59a09b1b9e48acceabfcdf67ce909156__1721778000
URL1:https://arc.ask3.ru/arc/aa/59/56/59a09b1b9e48acceabfcdf67ce909156.html
Заголовок, (Title) документа по адресу, URL1:
Decompiler - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)