przekonwertować plik wykonywalny z powrotem na kod źródłowy C.

14

Niestety zgubiłem kod źródłowy i po prostu mam plik wyjściowy utworzony za pomocą gcc w systemie Linux i nie mam teraz dostępu do komputera. Czy istnieje sposób na konwersję pliku wyjściowego do pliku źródłowego (in c w systemie Linux)?

Mahsa
źródło
To, czego chcesz, nazywa się dekompilatorem. Możesz znaleźć pomoc w tej odpowiedzi: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf
IDA Pro z modułem dekompilatora jest jedynym praktycznym rozwiązaniem, które faktycznie działa z dużymi plikami wykonywalnymi.
fpmurphy
@ fpmurphy1 Masz Hopper, który jest porównywalny jakościowo do IDA Pro i która licencja stanowi ułamek ceny.
Rui F Ribeiro
@ fpmurphy1 Nie udało mi się jeszcze zobaczyć jakości kodu generowanego przez Avast ... kto korzysta z 32-bitowych platform Intel? Poza tym od dziesięcioleci nie korzystam z Wintel. zobacz unix.stackexchange.com/questions/418354/ ... Różnica w cenie jest jednak dość znacząca, jednak promieniowanie heksadecymalne / IDA pro zaczynają się od 1500 USD za licencję osobistą do niektórych wygórowanych wartości w przypadku licencji komercyjnych, takich jak 5000 USD lub wyżej AFAIK, Hopper wynosi 100 USD dla jednego użytkownika i 130 dla jednego komputera.
Rui F Ribeiro
@RuiFRibeiro. Spora część złośliwego oprogramowania, które badam, jest nadal 32-bitowe.
fpmurphy

Odpowiedzi:

25

Więc miałeś krowę, ale przypadkowo zamieniłeś ją w hamburgera, a teraz chcesz odzyskać swoją krowę.

Przepraszamy, to po prostu nie działa w ten sposób.

Wystarczy przywrócić plik źródłowy z kopii zapasowych.

Ach, nie miałeś kopii zapasowych. Niestety wszechświat nie daje ci za to przerwy.

Możesz dekompilować plik binarny. To nie da ci kodu źródłowego, ale da ci trochę kodu źródłowego o takim samym zachowaniu. Nie otrzymasz nazw zmiennych, chyba że był to plik binarny debugowania. Nie dostaniesz takiej samej logiki, chyba że skompilujesz bez optymalizacji. Oczywiście nie dostaniesz komentarzy.

Użyłem Boomeranga do dekompilacji niektórych programów, a wynik był bardziej czytelny niż kod maszynowy. Nie wiem, czy to najlepsze narzędzie na rynku. W każdym razie nie oczekuj cudów.

Gilles „SO- przestań być zły”
źródło
1
Bumerang wygląda raczej schludnie; szkoda, że ​​dokumentacja odwołuje się do gcc -O4, ponieważ nie robi to absolutnie nic (poza -O3), jeśli pamięć dobrze mi służy. Ostatnie zdanie jest oczywiście niezwykle ważne, podobnie jak pierwsze pięć zdań. Nie oznacza to, że reszta nie jest ważna, ponieważ bardzo mocno podkreślasz znaczenie regularnego tworzenia kopii zapasowych. +1
Pryftan
6

Kilka narzędzi jest powszechnych w inżynierii odwrotnej pliku wykonywalnego.

  1. Polecenie „plik”, które przyjmuje ścieżkę do pliku jako pierwszy parametr, abyś mógł (w większości przypadków) określić, jaki typ pliku wykonywalnego masz.
  2. Dezasemblery, które dokładnie pokazują, co robi plik wykonywalny, ale są trudne do odczytania dla tych, którzy nie piszą kodu asemblera na tej konkretnej architekturze lub mają doświadczenie w dezasemblacji.
  3. Dekompilatory, takie jak Boomerang, Hex-ray i Snowman, mogą zapewnić lepszą czytelność, ale nie odzyskują rzeczywistych nazw zmiennych lub składni oryginalnego programu i nie są w 100% niezawodne, szczególnie w przypadkach, gdy inżynierowie, którzy stworzyli plik wykonywalny, testowali z te pakiety i próbowały dodatkowo zaciemnić zabezpieczenia.
  4. Diagramy lub tabele przepływu danych. Nie znam żadnego darmowego narzędzia do automatycznego wykonywania tego zadania, ale pomocny może być skrypt Python lub Bash na wierzchu parsera tekstowego danych wyjściowych zestawu (który można zapisać w wersji sed lub Perl).
  5. Ołówek i papier, wierzcie lub nie, do notowania przepływów i pomysłów.

W większości przypadków, które widziałem, kod musiał zostać przepisany od nowa, utrzymany jako program w asemblerze lub odtworzony przez ponowne zastosowanie żądań zmiany do starszej wersji.

Douglas Daseeco
źródło
1
# 1: Prawda, chociaż ma też swoje wady. # 3: Myślę, że są komercyjne? Jestem po prostu ciekawy naukowo (mam nadmiarowe kopie zapasowe, więc nie ma takiej potrzeby). # 4: przychodzi mi na myśl cflow (choć korzysta ze źródła, niektóre działają na binarnie - oczywiście z pewnymi zastrzeżeniami). Są inni, zależnie od tego, czego szukasz. Jeśli chodzi o wyjście graficzne, nie mogę nic na to poradzić, ponieważ nie lubię lub nie potrzebuję wyjścia graficznego dla tego typu rzeczy (uważam, że bardziej to rozprasza). # 5: bardzo prawda. Oczywiście możesz również użyć pliku tekstowego.
Pryftan
3

To, co chcesz zrobić, nazywa się „dekompilacją”. Istnieje wiele dekompilatorów i omawianie ich wszystkich tutaj nie jest praktyczne.

Jednak jako ogólna uwaga: Konwersja ze źródła C na wykonywalny kod maszynowy jest stratna. Na przykład:

  • Komentarze są nieodwracalnie utracone
  • Zmienne nazwy zniknęły
  • Czasami pętle są rozwijane w celu zwiększenia wydajności
  • Funkcje mogą zostać zmienione

Kod kompiluje się tak, jak napisano. Obecnie większość kompilatorów radykalnie zmieni kod, aby go zoptymalizować. Więc kiedy dekompilować, kompilator może się tylko domyślać, co kod źródłowy musi wyglądało, że nie ma możliwości dowiedzenia się, co twój kod był, bo to nie ma. Jeśli dekompilator jest dobry, otrzymany kod będzie przynajmniej mógł zostać skompilowany z powrotem do równoważnego pliku wykonywalnego, a następnie możesz zacząć powoli refaktoryzować go do odczytu. Ale najprawdopodobniej dekompilator wytworzy absolutnie nieczytelny kod spaghetti i rozszyfrowanie go będzie ogromnym bólem głowy. Czasami może być mniej pracy, aby napisać program od nowa.

Bagalaw
źródło
Na temat komentarzy ostatnio zauważyłem - i nie mam pojęcia, czy pozwoliłoby to na odczytywanie komentarzy przez dekompilator, czy też nie oczekuję, że dekompilatory będą nawet szukać tego typu rzeczy - to: -C Nie odrzucaj komentarzy. Wszystkie komentarze są przekazywane do pliku wyjściowego, z wyjątkiem komentarzy w przetworzonych dyrektywach, które są usuwane wraz z dyrektywą. Podkreśla efekty uboczne, a także opcję -CC (dotyczy to gcc, ale prawdopodobnie zamiast tego cpp). Nie dlatego, że oczekuję, że będzie miało zastosowanie do PO, ale może być interesujące dla niektórych.
Pryftan