Znaczenie i zastosowania dekompilacji

Mówiąc wprost, dekompilacja jest odwrotnością kompilacji: tłumaczeniem pliku wykonywalnego na język wyższego poziomu.

Załóżmy, że straciłeś źródło projektu Delphi i masz tylko plik wykonywalny: inżynieria odwrotna (dekompilacja) jest przydatna, jeśli oryginalne źródła nie są dostępne.

Hm, „źródła niedostępne”, czy to oznacza, że ​​możemy dekompilować projekty Delphi innych ludzi? Cóż, tak i nie ...

Czy możliwa jest prawdziwa dekompilacja?

Nie, oczywiście nie. W pełni zautomatyzowana dekompilacja nie jest możliwa - żaden dekompilator nie mógłby dokładnie odtworzyć oryginalnego kodu źródłowego.

Kiedy projekt Delphi jest kompilowany i łączony w celu utworzenia samodzielnego pliku wykonywalnego, większość nazw używanych w programie jest konwertowana na adresy. Ta utrata nazw oznacza, że ​​dekompilator musiałby stworzyć unikalne nazwy dla wszystkich stałych, zmiennych, funkcji i procedur. Nawet jeśli osiągnięty zostanie pewien stopień sukcesu, w wygenerowanym „kodzie źródłowym” brakuje znaczących nazw zmiennych i funkcji.

instagram viewer

Oczywiście składnia języka źródłowego nie istnieje już w pliku wykonywalnym. Dekompilatorowi bardzo trudno byłoby zinterpretować serię instrukcji języka maszynowego (ASM) istniejących w pliku wykonywalnym i zdecydować, jaka była oryginalna instrukcja źródłowa.

Dlaczego i kiedy korzystać z dekompilacji

Inżynierii odwrotnej można użyć z kilku powodów, z których niektóre to:

  • Odzyskiwanie utraconego kodu źródłowego
  • Migracja aplikacji na nową platformę sprzętową
  • Stwierdzenie obecności wirusów lub złośliwego kodu w programie
  • Korekta błędu, gdy właściciel aplikacji nie jest w stanie dokonać korekty.
  • Odzyskiwanie cudzego kodu źródłowego (na przykład w celu ustalenia algorytmu).

Czy to jest legalne?

Inżynieria odwrotna NIE pęka, chociaż czasami trudno jest narysować cienką linię między nimi. Programy komputerowe są chronione prawem autorskim i prawem znaków towarowych. Różne kraje mają różne wyjątki od praw właściciela praw autorskich. Najczęstsze z nich stwierdzają, że dekompilacja jest w porządku: do celów interpretacji, gdy specyfikacja interfejsu nie została udostępniona, dla cele korekcji błędów, w przypadku gdy właściciel praw autorskich nie jest w stanie dokonać korekty, w celu ustalenia części programu, które nie są chronione przez prawa autorskie. Oczywiście powinieneś być bardzo ostrożny / skontaktować się z prawnikiem, jeśli masz wątpliwości, czy możesz zdemontować plik exe programu.

Uwaga: jeśli szukasz pęknięć Delphi, generatorów kluczy lub tylko numerów seryjnych: jesteś na niewłaściwej stronie. Pamiętaj, że wszystko, co tu znajdziesz, zostało napisane / przedstawione wyłącznie w celach eksploracyjnych / edukacyjnych.

Na razie Borland nie oferuje żadnego produktu zdolnego do dekompilacji pliku wykonywalnego (.exe) lub „jednostki skompilowanej Delphi” (.dcu) z powrotem do oryginalnego kodu źródłowego (.pas).

Delphi Compiled Unit (DCU)

Podczas kompilowania projektu Delphi lub uruchamiania kompilowany plik jednostki (.pas) jest tworzony. Domyślnie skompilowana wersja każdej jednostki jest przechowywana w osobnym pliku w formacie binarnym o takiej samej nazwie jak plik jednostki, ale z rozszerzeniem .DCU. Na przykład unit1.dcu zawiera kod i dane zadeklarowane w pliku unit1.pas.

Oznacza to, że jeśli masz jakieś osoby, na przykład, skompilowane źródło komponentu, wszystko co musisz zrobić, to odwrócić go i pobrać kod. Źle. Format pliku DCU jest nieudokumentowany (format zastrzeżony) i może się zmieniać z wersji na wersję.

Po kompilatorze: Inżynieria odwrotna Delphi

Jeśli chcesz spróbować zdekompilować plik wykonywalny Delphi, oto kilka rzeczy, które powinieneś wiedzieć:

Pliki źródłowe programów Delphi są zwykle przechowywane w dwóch typach plików: plikach kodu ASCII (.pas, .dpr) i plikach zasobów (.res, .rc, .dfm, .dcr). Pliki Dfm zawierają szczegóły (właściwości) obiektów zawartych w formularzu. Podczas tworzenia exe, Delphi kopiuje informacje z plików .dfm do gotowego pliku kodu .exe. Pliki formularzy opisują każdy składnik w formularzu, w tym wartości wszystkich trwałych właściwości. Za każdym razem, gdy zmieniamy pozycję formularza, podpis przycisku lub przypisujemy procedurę zdarzenia do komponentu, Delphi zapisuje te modyfikacje w pliku DFM (nie w kodzie procedury zdarzenia - jest to przechowywane w pas / dcu plik). Aby uzyskać plik „dfm” z pliku wykonywalnego, musimy zrozumieć, jakiego rodzaju zasoby są przechowywane w pliku wykonywalnym Win32.

Wszystkie programy skompilowane przez Delphi mają następujące sekcje: CODE, DATA, BSS, .idata, tls, .rdata, .rsrc. Najważniejsze z punktu widzenia dekompilacji są sekcje CODE i .rsrc. W "Dodanie funkcjonalności do programu Delphi„artykuł pokazuje kilka interesujących faktów na temat formatu plików wykonywalnych Delphi, informacji o klasach i zasobów DFM: jak ponownie przypisać zdarzenia do obsługi przez inne procedury obsługi zdarzeń zdefiniowane w tej samej formie. Co więcej: jak dodać własną procedurę obsługi zdarzeń, dodając kod do pliku wykonywalnego, który zmieni podpis przycisku.

Spośród wielu rodzajów zasobów przechowywanych w pliku exe, RT_RCDATA lub zasób zdefiniowany w aplikacji (surowe dane) przechowuje informacje, które znajdowały się w pliku DFM przed kompilacją. Aby wyodrębnić dane DFM z pliku exe, możemy wywołać plik EnumResourceNames Funkcja API... Aby uzyskać więcej informacji na temat wyodrębniania DFM z pliku wykonywalnego, zobacz: Kodowanie eksploratora DFM Delphi artykuł.

Sztuka inżynierii odwrotnej była tradycyjnie krajem czarodziejów technicznych, znających język asemblera i debuggerów. Pojawiło się kilka dekompilatorów Delphi, które pozwalają każdemu, nawet przy ograniczonej wiedzy technicznej, odtworzyć większość plików wykonywalnych Delphi.

Jeśli jesteś zainteresowany programami inżynierii odwrotnej Delphi, proponuję rzucić okiem na kilka „dekompilatorów”:

Dekompilator plików wykonywalnych (EXE) i biblioteki dynamiczne (DLL), napisany w Delphi i wykonany w środowisku Windows32. Ostatecznym celem projektu jest opracowanie programu zdolnego do przywrócenia większości początkowej wersji Delphi kody źródłowe ze skompilowanego pliku, ale IDR, a także inne dekompilatory Delphi, nie mogą tego jeszcze zrobić. Niemniej jednak IDR ma status znacznie ułatwiający taki proces. W porównaniu z innymi dobrze znanymi dekompilatorami Delphi wynik analizy IDR ma największą kompletność i niezawodność.

Revendepro znajduje prawie wszystkie struktury (klasy, typy, procedury itp.) W programie i generuje reprezentację pascal, procedury zostaną zapisane w asemblerze. Z powodu pewnych ograniczeń w asemblerze wygenerowanych danych wyjściowych nie można ponownie skompilować. Źródło tego dekompilatora jest dostępne bezpłatnie. Niestety jest to jedyny dekompilator, którego nie byłem w stanie użyć - wyświetla monit z wyjątkiem, gdy próbujesz dekompilować jakiś plik wykonywalny Delphi.

EMS Source Rescuer to łatwa w użyciu aplikacja kreatora, która może pomóc Ci przywrócić utracony kod źródłowy. Jeśli stracisz źródła projektu Delphi lub C ++ Builder, ale masz plik wykonywalny, to narzędzie może uratować część utraconych źródeł. Rescuer tworzy wszystkie formularze projektów i moduły danych ze wszystkimi przypisanymi właściwościami i zdarzeniami. Wytworzone procedury zdarzeń nie mają treści (nie jest to dekompilator), ale mają adres kodu w pliku wykonywalnym. W większości przypadków Ratownik oszczędza 50–90% czasu na przywrócenie projektu.

DeDe to bardzo szybki program, który może analizować pliki wykonywalne skompilowane z Delphi. Po dekompilacji DeDe zapewnia:

  • Wszystkie pliki dfm celu. Będziesz mógł je otwierać i edytować za pomocą Delphi.
  • Wszystkie opublikowane metody w dobrze skomentowanym kodzie ASM z odniesieniami do ciągów, importowanych wywołań funkcji, wywołań metod klas, komponentów w jednostce, bloków Try-Except i Try-Wreszcie. Domyślnie DeDe pobiera tylko źródła metod opublikowanych, ale możesz również przetworzyć inną procedurę w pliku wykonywalnym, jeśli znasz przesunięcie RVA za pomocą Narzędzia | Rozmontuj menu Proc.
  • Wiele dodatkowych informacji.
  • Możesz utworzyć folder projektu Delphi ze wszystkimi plikami dfm, pas, dpr. Uwaga: pliki pas zawierają wspomniany wyżej dobrze skomentowany kod ASM. Nie można ich ponownie skompilować!