Есть ли декомпилятор C ++? [закрыто]

116

У меня есть программа, в которой я потерял исходный код C ++. Есть ли хорошие декомпиляторы C ++?

Я уже наткнулся на Бумеранг .

Брайан Денни
источник
objdumpдля Linux
Stypox
1
cutter.re за отличный графический интерфейс и отличный встроенный декомпилятор
Misiur

Ответы:

80

Вы можете использовать IDA Pro от Hex-Rays . Обычно вы не получите хорошего C ++ из двоичного кода, если вы не скомпилируете отладочную информацию. Приготовьтесь потратить много ручного труда на изменение кода.

Если вы не удалили двоичные файлы, есть некоторая надежда, так как IDA Pro может создавать для вас C-подобный код для работы. Обычно он очень грубый, по крайней мере, когда я использовал его пару лет назад.

Дэвид Холм
источник
27
Чтобы уточнить, IDA даст только разборку. К нему есть надстройка под названием Hex-Rays, которая будет декомпилировать оставшуюся часть пути в исходный код C / C ++, насколько это возможно.
davenpcj
2
Насколько я знаю, hex-ray выводит только C как псевдокод. Не то чтобы это делает его бесполезным для декомпиляции C ++, вам просто нужно немного знать о том, как компиляторы конвертируют структуры C ++.
Майкл Андерсон
Для уточнения: дизассемблирование - это самое большее, что вы можете декомпилировать с помощью Hex-Rays, переведет ASM на C ++ ASM может быть переведен на любой язык программирования с работой, поскольку все программы могут работать как ASM
Barkermn01
4
SNOWMAN - хороший бесплатный декомпилятор c ++
Инга
2
+1 за Snowman, но, как уже упоминали другие, даже простой Hello, World становится практически нечитаемым после декомпиляции.
bdetweiler 02
25

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

Дастин Гетц
источник
25
«душа» программы ушла, просто пустая оболочка ее прежнего «я» ... »
Даршан Чаудхари
21

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

m_pГладиатор
источник
6

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

Ферруччо
источник
4

В зависимости от того, насколько велик и насколько хорошо написан исходный код, возможно, стоит начать заново с вашего любимого языка (которым может оставаться C ++) и извлечь уроки из ошибок, допущенных в последней версии. Разве кто-то однажды не сказал о том, чтобы написать одну, которую нужно выбросить?

nb Очевидно, что если это огромный продукт, то, возможно, оно того не стоит.

Харриотт
источник
24
Джоэл - отличный обозреватель, но временами ошибается. А бывают случаи, когда его цитируют неправильно. Как и здесь, поскольку вопрос касается потери исходного кода. В статье Джоэлса объясняется ценность исходного кода.
MSalters
5
Разве кто-то однажды не сказал о том, чтобы написать одну, которую нужно выбросить? Да, и он передумал davewsmith.com/blog/2010/brook-revisits-plan-to-throw-one-away [В 1975 году я посоветовал программистам «выбросить первую версию», а затем создать вторую один. К 20-летнему юбилею я понял, что постоянная инкрементная итерация - гораздо более
разумный