Что такое деболитор, как это работает? [закрыто

StackOverflow https://stackoverflow.com/questions/2902074

  •  04-10-2019
  •  | 
  •  

Вопрос

Так что декомпилятор действительно вещь, которая дает, дает источник скомпилированного / интерпретированного кода? Потому что мне это звучит невозможно. Как бы вы получили имена функций, переменных, классов и т. Д., Если он скомпилирован. Или я неправильно отигрываю определение? Как это работает? А каково главное принципиально заставляя сделать один?

Это было полезно?

Решение

Вы правы в вашем определении декомпилятора: он принимает компиляционное приложение и создает исходный код для соответствия. Тем не менее, это делает нет В большинстве случаев знают имя и структуру переменных / функций / классов - это просто догадывается. Он анализирует поток программы и пытается найти способ представить этот поток через определенный язык программирования, как правило, C. Однако, поскольку язык программирования выбора (C, в этом примере) часто на более высоком уровне, чем состояние основной программы (бинарный исполняемый), некоторые части программы могут быть невозможны точно представить; В этом случае декомпилятор потерпит неудачу, и вам нужно будет использовать разборку. Вот почему многие люди любят блокировать их код: это делает его намного сложнее для декомпилеров открывать его.

Строительство декомпилятора - это не простая задача. В основном, вы должны принять приложение, которое вы декомпилируете (будьте его исполняемым или каким-то другим формой скомпилированного приложения) и анализировать его в какое-то дерево, с которым вы можете работать в памяти. Вы бы проанализировать поток программы и попытаться найти паттерс, которые могут предложить, чтобы if Заявление / переменная / функция / etc использовалась в определенном месте в коде. Это все действительно просто игра догадки: вам придется узнать шаблоны, которые компилятор делают в скомпилированном коде, затем искать эти шаблоны и заменить их эквивалентным человеком исходным кодом.

Это все намного проще для программ более высокого уровня, таких как Java или .NET, где вам не нужно иметь дело с инструкциями по сборке, а вещи, подобные переменные, в основном заботятся о вас. Там вам не нужно угадать столько, сколько просто переводится. Возможно, у вас могут быть не точные имена переменных / методов, но вы можете, по крайней мере, выводить структуру программы справедливо легко.

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

Другие советы

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

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

Он работает путем вывода «разумных» (на основе некоторого эвристики) представления того, что находится в объекте. Степень сходства между тем, что она производит и то, что изначально было, как правило, так сильно зависит от того, сколько информации содержится в двоичном, она начинается. Если вы начнете с в основном «чистый» двоичный двоичный, он обычно застрял только для того, чтобы составлять «разумные» имена для переменных, таких как использование таких вещей i, j а также k для индексов петлей и более длинные имена для большинства других.

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

Это зависит от того, на каком языке вы декомпилируете. Если вы декомпилируете что-то вроде C или C ++, то единственная информация, предоставленная вам именами функций и аргументы (в DLL). Если вы имеете дело с Java, то компилятор обычно вставляет номера строки, имена переменных, поле и имена методов и так далее. Если нет имени переменных, то вы получите такие имена localInt1, localInt2, localException1. Отказ Или какой бы компилятор был. И это может сказать расстоянию между линиями, из-за номеров строк.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top