Temat: W jaki sposób można zobaczyć kod programu napisany w C po...

W jaki sposób można zobaczyć kod programu napisany w C po kompilacji czyli w kodzie binarnym?
Piotr Głudkowski

Piotr Głudkowski Rzucam się na
wszystko to, co jest
ciekawe i wymaga
rusze...

Temat: W jaki sposób można zobaczyć kod programu napisany w C po...

Google: dekompilacja, dekompilator.

Ale w ogólności się nie da - zależy, jak został skompilowany.
Znaczy zawsze uzyskasz kod źródłowy, ale niekoniecznie identyczny z oryginalnym kodem źródłowym. Oczywiście ten uzyskany kod da się skompilować i dostaniesz pewnie taką samą binarkę - ale takie źródło czytelne zbyt nie jest.
Dlaczego?
Niektóre z przyczyn:
- kompilator w trakcie kompilacji może przeprowadzać pewne optymalizacje (np. zamieniać instrukcje na miejsca, wyłączać instrukcje z pętli, dodawać pewne zmienne tymczasowe itd). Podczas dekompilacji nie da się odwrócić tych optymalizacji, w związku z czym dostaniesz kod źródłowy "zoptymalizowany", w szczególności mogą pojawić się zmienne, których wcale w oryginalnym kodzie nie było, albo pętla, która miała się wykonać stałą ilośc razy, zostanie "rozwinięta".
- w trakcie kompilacji tworzona jest tablica symboli (nazw zmiennych, funkcji itp), która m.in. odwzorowuje nazwy na adresy. Jeśli skompilowany program tej tabeli nie zawiera w binarce, praktycznie nie ma szansy, żeby zmienne i funkcje po dekompilacji nazywały się tak samo, jak w oryginalnym źródle - zwykle będą to raczej nazwy w stylu var_001, fun_132 itd. Binarka zawierać będzie tą tablicę tylko wtedy, jeśli przy kompilacji została użyta odpowiednia opcja - to jest użyteczne np. przy debugowaniu, ale wersje "produkcyjne" binarek zwykle tablicy symboli nie mają, primo dla tego, że dość znacznie zwiększa to rozmiar binarki, secundo - żeby nie ułatwiać dekompilacji :)Piotr Głudkowski edytował(a) ten post dnia 17.10.11 o godzinie 22:44

konto usunięte

Temat: W jaki sposób można zobaczyć kod programu napisany w C po...

Nie zawsze też wiadomo co jest danymi, a co jest kodem :) Trzeba by mieć dostęp do pełnego pokrycia, czyli wszystkich możliwych scenariuszy użycia softu, żeby to na 100% wiedzieć.

Inaczej w przypadku języków kompilowanych do kodu pośredniego (Java, C#), w takim przypadku można już dostać dość dokładnie kod, oczywiście nazwy zmiennych będą mało znaczące, ale pewne małe fragmenty algorytmów/rozwiązań można próbować reverse engineerować.Adam Michalski edytował(a) ten post dnia 17.10.11 o godzinie 22:49

konto usunięte

Temat: W jaki sposób można zobaczyć kod programu napisany w C po...

W sumie to pytanie zadane dość wieloznacznie.
Jeśli chodzi Ci o podgląd samej binarki(czyli jak kod C przekłada się na bajty w pliku wykonywalnym) to zrobi to dowolny hex edytor np. hex workshop.
Jeśli krok wyżej, czyli jak kod C przekłada się na pojedyncze instrukcje procesora, to tutaj trzeba deasemblera np. IDA czy gdb.
Jeśli jeszcze wyżej, to tak jak napisali poprzednicy - dekompilator.



Wyślij zaproszenie do