Czy istnieje dekompilator C ++? [Zamknięte]

116

Mam program, w którym zgubiłem kod źródłowy C ++. Czy są tam jakieś dobre dekompilatory C ++?

Natknąłem się już na Boomerang .

Bryan Denny
źródło
objdumpdla systemu Linux
Stypox
1
cutter.re dla świetnego GUI i świetnego wbudowanego dekompilatora
Misiur

Odpowiedzi:

80

Możesz użyć IDA Pro firmy Hex-Rays . Zwykle nie uzyskasz dobrego C ++ z pliku binarnego, chyba że wkompilujesz informacje debugowania. Przygotuj się na dużo pracy fizycznej przy odwracaniu kodu.

Jeśli nie usunąłeś plików binarnych, jest pewna nadzieja, ponieważ IDA Pro może stworzyć kod podobny do C, z którym będziesz mógł pracować. Zwykle jest to jednak bardzo szorstkie, przynajmniej gdy używałem go kilka lat temu.

David Holm
źródło
27
Dla wyjaśnienia, IDA dokona jedynie demontażu. Jest do niego dodatek o nazwie Hex-Rays, który dekompiluje resztę do źródła C / C ++, w takim stopniu, w jakim jest to możliwe.
davenpcj
2
Czytając dokumentację, promienie szesnastkowe generują tylko C jako pseudokod. Nie oznacza to, że jest to bezużyteczne do dekompilacji C ++, wystarczy wiedzieć trochę o tym, jak kompilatory konwertują struktury C ++.
Michael Anderson
Aby wyjaśnić więcej, demontaż to najwięcej, co można zdekompilować za pomocą promieni szesnastkowych, przetłumaczy ASM na C ++ ASM można przetłumaczyć na dowolny język programowania z pracą, ponieważ wszystkie programy mogą działać jako ASM
Barkermn 01
4
SNOWMAN to dobry darmowy dekompilator C ++
Inga
2
+1 dla Bałwana, ale jak wspominali inni, nawet prosty Hello, World staje się praktycznie nieczytelny po dekompilacji.
bdetweiler
25

informacje są odrzucane w procesie kompilacji. Nawet jeśli dekompilator mógłby stworzyć logiczny równoważny kod z klasami i wszystkim (prawdopodobnie nie może), część samodokumentująca się zniknęła w zoptymalizowanym kodzie wydania. Żadnych nazw zmiennych, nazw procedur, nazw klas - tylko adresy.

Dustin Getz
źródło
25
„dusza” programu zniknęła, tylko pusta skorupa jego dawnej jaźni… ”
Darshan Chaudhary
21

Tak, ale żadnemu z nich nie uda się stworzyć wystarczająco czytelnego kodu, aby był wart wysiłku. Spędzisz więcej czasu próbując odczytać zdekompilowane źródło z blokami asemblera w środku, niż przepisując swoją starą aplikację od zera.

m_pGladiator
źródło
6

Nie widziałem żadnych dekompilatorów, które generują kod C ++. Widziałem kilka eksperymentalnych, które podejmowały rozsądną próbę wygenerowania kodu w C, ale były one zwykle zależne od dopasowania wzorców generowania kodu określonego kompilatora (to mogło się zmienić, minęło trochę czasu, odkąd ostatnio się temu przyjrzałem ). Oczywiście znikną wszelkie symboliczne informacje. Google for „decompiler”.

Ferruccio
źródło
4

W zależności od tego, jak duży i dobrze napisany był oryginalny kod, warto zacząć od nowa w swoim ulubionym języku (którym nadal może być C ++) i uczyć się na błędach popełnionych w ostatniej wersji. Czy ktoś kiedyś nie powiedział o napisaniu jednego, żeby go wyrzucić?

Uwaga Oczywiście, jeśli jest to ogromny produkt, może nie być warty czasu.

harriyott
źródło
24
Joel jest świetnym felietonistą, ale czasami się myli. A potem są chwile, kiedy jest źle cytowany. Tak jak tutaj, ponieważ pytanie koncentruje się wokół utraty kodu źródłowego. Artykuł Joelsa wyjaśnia, dlaczego kod źródłowy jest cenny.
MSalters,
5
Czy ktoś kiedyś nie powiedział o napisaniu jednego, żeby wyrzucić? Tak, i zmienił zdanie. Davewsmith.com/blog/2010/brook-revisits-plan-to-throw-one-away [I] n 1975 r. Doradziłem programistom, aby „wyrzucili pierwszą wersję”, a następnie zbudowali drugą jeden. W wydaniu z okazji 20. rocznicy zdałem sobie sprawę, że ciągłe, przyrostowe iteracje to znacznie
rozsądniejsze