~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 30998FB3362EE89EDC9F7122ADD0A6B1__1718663760 ✰
Заголовок документа оригинал.:
✰ Decompiler - Wikipedia ✰
Заголовок документа перевод.:
✰ Декомпилятор — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Decompiler ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/30/b1/30998fb3362ee89edc9f7122add0a6b1.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/30/b1/30998fb3362ee89edc9f7122add0a6b1__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 06:48:16 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 18 June 2024, at 01:36 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Декомпилятор — Википедия 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    :  =   м  [  ebx  +  4  ]  ; 

Идиомы [ править ]

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

    cdq      eax               ;   Для edx установлено расширение знака ≠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, с приведением типов и арифметикой указателей.

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

структура   T1   *  ebx  ; 
      структура   T1   { 
         int   v0004  ; 
          интервал   v0008  ; 
          интервал   v000C  ; 
      }; 
  ebx  ->  v000C   -=   ebx  ->  v0004   +   ebx  ->  v0008  ; 

Структурирование [ править ]

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

    xor   eax  ,   eax 
 l0002: 
     или    ebx  ,   ebx 
     jge   l0003 
     add   eax  ,[  ebx  ] 
     mov   ebx  ,[  ebx  +  0x4  ] 
     jmp   l0002 
 l0003: 
     mov   [  0x10040000  ],  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
Номер скриншота №: 30998FB3362EE89EDC9F7122ADD0A6B1__1718663760
URL1:https://en.wikipedia.org/wiki/Decompiler
Заголовок, (Title) документа по адресу, URL1:
Decompiler - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)