Как получить исходный код переменного тока из скомпилированного кода - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть скомпилированный код C в текстовом формате.Мне нужно извлечь исходный код путем декомпиляции машинного кода.Как это сделать?

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Пожалуйста, опубликуйте образец «скомпилированного кода C в текстовом формате».

Возможно, тогда будет легче увидеть, чего вы пытаетесь достичь.

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

0 голосов
/ 17 февраля 2019

Как сказал Срджан, в общем случае декомпиляция C (или C ++) программы невозможна.Слишком много информации потеряно в процессе компиляции.Например, рассмотрим объявление, такое как int x, оно «потеряно», так как оно напрямую не генерирует никаких команд машинного уровня.Эта информация нужна компилятору только для проверки типов.

Теперь, однако, существует возможность разборки, которая переводит скомпилированный исполняемый файл на уровень ассемблера.Однако интерпретация сборки может быть (будет?) Сложной и, безусловно, трудоемкой.Доступно несколько дизассемблеров, если у вас есть деньги, IDA-Pro, вероятно, является отраслевым стандартом для дизассемблеров, и если вы выполняете эту работу, стоит несколько тысяч долларов за лицензию.Есть несколько доступных дизассемблеров с открытым исходным кодом, Google может их найти.

Теперь, когда говорят, что были попытки создать декомпиляторы, у IDA-Pro есть один, и вы можете посмотреть на http://boomerang.sourceforge.net/ в дополнение к Snowman, указанному выше.

Наконец, другие языки более дружественны к декомпиляции, чем C или C ++.Например, программы на C # декомпилируются с такими инструментами, как dotPeek или ilSpy.Аналогично с Java существует ряд инструментов, которые могут преобразовывать байт-код Java обратно в исходный код Java.

0 голосов
/ 17 февраля 2019

«Истинная» декомпиляция, в принципе, невозможна.Прежде всего, вы не можете «декомпилировать» локальные имена (в функциях и файлах / модулях исходного кода).Для них вы получите что-то вроде, для int локальных переменных: i1, i2 ... Конечно, если только у вас нет отладочной информации, что не часто бывает.

Декомпиляция до «чего-то» (что может быть не очень читабельным) возможна, но обычно она опирается на некоторую эвристику, распознавая шаблоны кода, которые генерируют компиляторы, и может быть обманутым для генерации странного (возможно, даже некорректного) кода C,На практике это означает, что декомпилятор обычно работает нормально для определенного компилятора с определенными (по умолчанию) параметрами компиляции, но не очень хорошо с другими.

Сказав это, декомпиляторы существуют, и вы можете попытать счастья сскажем Снеговик

...