ресурсы и теория декомпиляции

#decompiler

#декомпилятор

Вопрос:

Должно быть, миллион книг и статей по теории и методам построения компиляторов. Есть ли какие-либо ресурсы для выполнения обратного? Меня не интересует какая-либо конкретная платформа HW. Ищу хорошие книги / исследовательские работы, в которых подробно рассматривается предмет и трудности.

Комментарии:

1. program-transformation.org/Transform/DeCompilation

Ответ №1:

Я работал над декомпилятором AS3 и Java и могу заверить вас, что все, что я узнал в отношении декомпиляции, взято прямо из теории компилятора. Промежуточные представления, анализ потока данных, переписывание терминов и другие связанные концепции — все это можно найти в книге dragon.

Комментарии:

1. Хотя есть немного того же, есть и немного другого. Например, в книге Dragon мало что говорится об алгоритме Эрли и фактически, похоже, предлагается не использовать его. Но декомпиляция по своей сути неоднозначна, поэтому вам действительно нужен полностью контекстно-свободный анализатор. Опять же, мой опыт по этому поводу находится на rocky.github.io/Deparsing-Paper.pdf

Ответ №2:

Здесь я писал о декомпиляторах для динамических языков и, в частности, для Python.

Обратите внимание, что это для динамических языков с пользовательскими (высокоуровневыми) виртуальными машинами.

Ответ №3:

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

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

В случаях, когда исходный код предназначен для четко определенной виртуальной машины, часто эту оптимизацию оставляют на усмотрение JIT-компилятора, и результирующий декомпилированный код очень удобочитаем — во многих случаях почти идентичен оригиналу. Компиляторы этого типа часто оставляют некоторые или все символы в объектном коде, позволяя их восстановить. Другие включают номера строк для облегчения отладки и устранения неполадок. Все это помогает восстановить исходный код.

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