конвертировать исполняемый файл обратно в исходный код C


14

К сожалению, я потерял свой исходный код, и у меня просто есть выходной файл, созданный с помощью gcc в linux, и у меня сейчас нет доступа к моему компьютеру. Есть ли способ конвертировать выходной файл в исходный файл (в c под linux)?


То, что вы хотите, называется декомпилятором. Вы можете найти некоторую помощь с этим ответом: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Эрик Ренуф

IDA Pro с модулем декомпилятора - единственное практическое решение, которое действительно работает с большими исполняемыми файлами.
fpmurphy

@ fpmurphy1 У вас есть Hopper, который по качеству сопоставим с IDA Pro, и какая лицензия является частью цены.
Руи Ф Рибейро

@ fpmurphy1 Мне еще не удалось увидеть качество кода, сгенерированного Avast ... кто больше использует 32-битные платформы Intel? Кроме того, я не пользовался Wintel уже несколько десятилетий. см. unix.stackexchange.com/questions/418354/… Разница в цене весьма существенна, однако, Hex-Ray / IDA pro начинаются с 1500USD для личной лицензии до некоторых грабительских ценностей для коммерческих лицензий, таких как 5000USD или выше AFAIK, Hopper составляет 100USD для одного пользователя и 130 для одного компьютера.
Руи Ф. Рибейро

@RuiFRibeiro. Чертовски много вредоносных программ, которые я изучаю, все еще 32-битные.
fpmurphy

Ответы:


25

Итак, у вас была корова, но вы случайно превратили ее в гамбургер, и теперь вы хотите вернуть свою корову.

Извините, просто так не работает.

Просто восстановите исходный файл из ваших резервных копий.

Ах, у вас не было резервных копий. К сожалению, вселенная не дает вам перерыва для этого.

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

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


1
Бумеранг выглядит довольно аккуратно; Позор, что документация ссылается на gcc -O4, поскольку это абсолютно ничего не делает (за исключением -O3), если память мне не изменяет. Ваше последнее предложение, конечно же, чрезвычайно верно, как и ваши первые пять предложений. Это не значит, что все остальное недействительно, поскольку вы подчеркиваете важность регулярного резервного копирования. +1
Прифтан

6

Несколько инструментов являются общими в обратном проектировании исполняемого файла.

  1. Команда «file», которая принимает путь к файлу в качестве первого параметра, чтобы вы могли определить (в большинстве случаев), какой тип исполняемого файла у вас есть.
  2. Дизассемблеры, которые показывают ТОЧНО, что делает исполняемый файл, но их трудно прочитать тем, кто не пишет ассемблерный код для этой конкретной архитектуры или имеет опыт дизассемблирования.
  3. Декомпиляторы, такие как Boomerang, Hex-Ray и Snowman, могут обеспечить лучшую читабельность, но они не восстанавливают фактические имена переменных или синтаксис исходной программы и не являются на 100% надежными, особенно в тех случаях, когда инженеры, создавшие исполняемый файл, протестировали с помощью эти пакеты и пытались запутать безопасность дальше.
  4. Диаграммы или таблицы потоков данных. Я не знаю ни одного бесплатного инструмента, который бы делал это автоматически, но может помочь скрипт Python или Bash поверх текстового анализатора вывода сборки (который может быть написан на sed или Perl).
  5. Карандаш и бумага, хотите верьте, хотите нет, для набросков и идей.

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


1
# 1: Правда, хотя у него тоже есть свои недостатки. № 3: Я думаю, это коммерческие? Мне просто любопытно в академическом плане (у меня есть резервные копии, поэтому нет необходимости в подобных вещах). # 4: на ум приходит cflow (хотя он использует источник, есть некоторые, которые работают с двоичным файлом - с некоторыми оговорками). Есть и другие, в зависимости от того, что вы после. Что касается графического вывода, я не могу помочь, так как мне не нравится или не нужен графический вывод для такого типа вещей (я бы на самом деле это отвлекал). № 5: очень верно. Вы также можете использовать текстовый файл здесь, конечно.
Прифтан

3

То, что вы хотите сделать, называется «декомпиляция». Существует много декомпиляторов, и нецелесообразно охватывать их все здесь.

Однако, как общее замечание: преобразование из исходного кода C в исполняемый машинный код с потерями. Например:

  • Комментарии безвозвратно утеряны
  • Имена переменных исчезли
  • Иногда циклы развертываются для производительности
  • Функции могут быть переставлены

Редко код компилируется как написано. Большинство компиляторов в наши дни радикально изменят ваш код, чтобы оптимизировать его. Поэтому, когда вы декомпилируете, компилятор может только догадываться о том, как должен выглядеть исходный код, он не может узнать, каким был ваш код, потому что его больше нет. Если декомпилятор хорош, полученный вами код будет, по крайней мере, скомпилирован обратно в эквивалентный исполняемый файл, а затем вы можете начать медленно реорганизовывать его для удобства чтения. Но, скорее всего, декомпилятор создаст абсолютно нечитаемый код спагетти, и расшифровка будет огромной головной болью. Иногда может потребоваться меньше усилий, чтобы просто переписать программу с нуля.


Что касается комментариев, то я недавно заметил, что - и я понятия не имею, позволит ли это читать комментарии декомпилятору, и при этом я не ожидаю, что декомпиляторы будут даже искать такие вещи - это: -C Не отбрасывать комментарии. Все комментарии передаются в выходной файл, за исключением комментариев в обработанных директивах, которые удаляются вместе с директивой. Он выделяет побочные эффекты, а также параметр -CC (это для gcc, хотя, вероятно, вместо cpp). Не то, чтобы я ожидал, что это применимо к ФП, но может быть интересным для некоторых.
Прифтан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.