2013-09-03 35 views
12

Mam plik exe i dekompilowałem go z Ida. Mówiono programowi kodowanemu w Delphi, więc próbowałem dekompilować z DeDe, ale to się nie udało, nie ma wyjścia i błędu. Zastanawiam się, czy można znaleźć język używany w tworzeniu exe, próbując różnych dekompilatorów napisanych specjalnie dla języka programowania? A może mogą zawieść z jakiegoś innego powodu?Czy można się dowiedzieć, w jakim języku jest napisany plik exe?

Odpowiedz

10

W wielu przypadkach numer to, umożliwiający identyfikację kompilatora użytego do kompilacji kodu, a także oryginalny język.

Większość wdrożeń językowych obejmuje pewną bibliotekę środowiska wykonawczego do implementacji różnych wysokopoziomowych operacji językowych. Na przykład C ma CRT, który implementuje operacje wejścia/wyjścia pliku (fopen, fread itp.), Delphi ma pomocników kompilatora dla swojego typu string (konkatenacja, przypisanie i inne), ADA ma różne funkcje niskiego poziomu, aby zapewnić bezpieczeństwo i wkrótce. Porównując kod programu i bibliotek uruchomieniowych kompilatorów kandydatów, możesz znaleźć dopasowanie.

IDA wdraża to podejście w FLIRT technology. Korzystając z podpisów, IDA jest w stanie określić większość głównych kompilatorów dla DOS i Windows. W przypadku Linuksa jest to nieco trudniejsze, ponieważ nie ma jednego dostawcy plików binarnych kompilatora, więc podpisy musiałyby być wykonane dla każdej dystrybucji.

Jednak nawet bez użycia kodu biblioteki wykonawczej może być możliwe zidentyfikowanie używanego kompilatora.Wiele kompilatorów używa bardzo różnych idiomów do reprezentowania różnych operacji. Na przykład I was able to guess, że kompilatorem używanym w wirusie Duqu był Visual C++, który później był confirmed.

5

Kompilacja jest stratny proces, więc nie jest to w ogóle możliwe, aby dekompilacji pliku wykonywalnego (lub inny moduł skompilowany program, taki jak .so lub .dll) i odzyskania kodu źródłowego w języku oryginalnym lub nawet jednoznacznie określić, jakie oryginalny język był. Nie jest nawet konieczne, aby istniał tylko jeden oryginalny język kodu źródłowego, ponieważ możliwe jest, że przed połączeniem różne moduły zostały napisane w różnych językach. Zazwyczaj można, zdemontować binarny i odzyskać język asemblera, chociaż może to mieć bardzo ograniczoną wartość.

W wielu przypadkach możesz może powiedzieć coś o oryginalnym języku pod warunkiem, że plik binarny nie został usunięty (z symboli). Na przykład zwykle możesz stwierdzić, czy plik binarny został pierwotnie napisany w C++, patrząc na symbole w pliku binarnym (w systemie Linux, używając objdump, nie ma pojęcia, jaki odpowiednik może być w systemie Windows): C++ symbole są zniekształcone w szczególny sposób. To nie jest 100% gwarancji, ale duże prawdopodobieństwo.

To powiedziawszy, niektóre dekompilatory wykonują całkiem sensowną pracę w bardzo trudnym zadaniu. Wnioskowanie prawdopodobnych konstruktów wysokiego poziomu z pliku binarnego nie jest łatwe. W moim (bardzo ograniczonym) doświadczeniu, pracują raczej dla dość trywialnych programów lub oprogramowania skompilowanego z wąskim zakresem wersji oryginalnego kompilatora, ale dławią się na czymś zasadniczym: autorowi dekompilatora bardzo trudno jest nadążyć za zmiany w kompilatorach, i może być dla niej bardzo mało bodźca do tego.

Nawet w przypadkach, gdy dekompilacja jest bardzo udana, wynikiem jest zasadniczo całkowicie nieskomentowany kod z bezsensownymi nazwami zmiennych, który jest niezwykle trudny do zrozumienia. Dekompilacja to jedno, a wydobycie zamierzonego semantycznego znaczenia z wyniku jest inne. Pamiętaj, że wiele zmiennych, odgałęzień, pętli i funkcji zostanie całkowicie zoptymalizowanych, wiele funkcji zostanie wstawionych itp. Zatem "kod źródłowy", nawet jeśli możesz go uzyskać w ten sposób, może nie być dużo użytkowania dla ciebie.

+0

Oczywiście nie oczekuję nagiego kodu źródłowego :) Ale programy tak bardzo się rozwinęły i mogą pokazać kod zespołu w sposób znacznie bardziej przyjazny dla użytkownika, dzięki czemu łatwiej jest odwrócić proste programy. Mimo to dziękuję – Kuzgun

+0

Możesz użyć 'objdump' na Windows też poprzez MingW lub Cygwin. Są instalowane w pakiecie 'binutils'. – adam

Powiązane problemy