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 .


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.


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.


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.


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”.


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.



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.