Demontaż - Disassembler

Dezasembler to program komputerowy , który przekłada języku maszynowym w asemblerze -The odwrotną operację że o asemblerze . Deasembler różni się od dekompilatora , którego celem jest język wysokiego poziomu, a nie język asemblera. Dezasemblacja, wyjście deasemblera, jest często formatowane w sposób czytelny dla człowieka, a nie jako dane wejściowe dla asemblera, co czyni go głównie narzędziem do inżynierii odwrotnej .

Zgromadzenie język kod źródłowy ogólnie umożliwia zastosowanie stałych i programista komentarze . Są one zwykle usuwane ze zmontowanego kodu maszynowego przez asembler. Jeśli tak, deasembler działający na kodzie maszynowym wytworzyłby deasembler bez tych stałych i komentarzy; zdeasemblowane dane wyjściowe stają się trudniejsze do interpretacji dla człowieka niż oryginalny kod źródłowy z adnotacjami. Niektóre deasemblery udostępniają wbudowaną funkcję komentowania kodu, w której generowane dane są wzbogacane o komentarze dotyczące wywoływanych funkcji API lub parametrów wywoływanych funkcji. Niektóre deasemblery wykorzystują symboliczne informacje debugowania obecne w plikach obiektowych, takich jak ELF . Na przykład IDA pozwala użytkownikowi na tworzenie symboli mnemonicznych dla wartości lub obszarów kodu w sesji interaktywnej: ludzki wgląd zastosowany w procesie demontażu często odpowiada ludzkiej kreatywności w procesie pisania kodu.

Na platformach CISC z instrukcjami o zmiennej szerokości może obowiązywać więcej niż jeden demontaż. Deasemblery nie obsługują kodu, który zmienia się podczas wykonywania.

Problemy z demontażem

Możliwe jest napisanie deasemblera, który tworzy kod, który po złożeniu tworzy dokładnie oryginalny plik binarny; jednak często występują różnice. To stawia wymagania wobec ekspresyjności asemblera. Na przykład asembler x86 dokonuje arbitralnego wyboru między dwoma kodami binarnymi dla czegoś tak prostego jak . Jeśli oryginalny kod korzysta z innego wyboru, oryginalny kod po prostu nie może być odtworzony w dowolnym momencie. Jednak nawet po wykonaniu w pełni poprawnego demontażu, problemy pozostają, jeśli program wymaga modyfikacji. Na przykład, ta sama instrukcja przeskoku języka maszynowego może być generowana przez kod asemblera, aby przeskoczyć do określonej lokalizacji (na przykład, aby wykonać określony kod) lub przeskoczyć określoną liczbę bajtów (na przykład, aby pominąć niechcianą gałąź) . Deasembler nie może wiedzieć, co jest zamierzone i może użyć dowolnej składni, aby wygenerować dezasemblację, która odtwarza oryginalny plik binarny. Jednakże, jeśli programista chce dodać instrukcje między instrukcją skoku a jej celem, konieczne jest zrozumienie działania programu, aby określić, czy skok powinien być bezwzględny czy względny, tj. czy jego cel powinien pozostać w stałej lokalizacji, czy przesunięty tak, aby pominąć zarówno oryginalne, jak i dodane instrukcje. MOV AX,BX

Przykłady deasemblerów

Deasembler może być samodzielny lub interaktywny. Samodzielny deasembler, kiedy jest wykonywany, generuje plik języka asemblera, który może być zbadany; interaktywna pokazuje natychmiastowy efekt każdej zmiany wprowadzonej przez użytkownika. Na przykład deasembler może początkowo nie wiedzieć, że część programu jest w rzeczywistości kodem i traktować ją jako dane; jeśli użytkownik określi, że jest to kod, wynikowy zdeasemblowany kod jest wyświetlany natychmiast, umożliwiając użytkownikowi sprawdzenie go i podjęcie dalszych działań podczas tego samego uruchomienia.

Każdy interaktywny debugger będzie zawierał pewien sposób przeglądania dezasemblacji debugowanego programu. Często to samo narzędzie do deasemblacji jest pakowane jako samodzielny deasembler dystrybuowany wraz z debuggerem. Na przykład objdump , część GNU Binutils , jest powiązany z interaktywnym debuggerem gdb .

Deasemblery i emulatory

Dynamiczny deasembler może zostać włączony do danych wyjściowych emulatora lub hiperwizora, aby „śledzić”, linia po linii, wykonywanie w czasie rzeczywistym dowolnych wykonywanych instrukcji maszynowych. W tym przypadku, jak również wiersze zawierające zdemontowany kod maszynowy, rejestr(y) i/lub zmiany danych (lub wszelkie inne zmiany „ stanu ”, takie jak kody warunków), które powoduje każda pojedyncza instrukcja, mogą być pokazane obok lub pod zdemontowaną instrukcją. Dostarcza to niezwykle potężnych informacji debugowania dla ostatecznego rozwiązania problemu, chociaż rozmiar wynikowego wyjścia może czasami być dość duży, zwłaszcza jeśli jest aktywny dla wykonywania całego programu. Firma OLIVER dostarczała te funkcje od wczesnych lat 70-tych w ramach swojej oferty produktów do debugowania CICS i obecnie można je znaleźć w produkcie XPEDITER firmy Compuware .

Demontaż długości

Deasembler długości , znany również jako silnik deasemblera długości ( LDE ), to narzędzie, które po podaniu sekwencji bajtów (instrukcji) wyświetla liczbę bajtów pobranych przez przeanalizowaną instrukcję. Godne uwagi projekty open source dla architektury x86 obejmują ldisasm, Tiny x86 Length Disassembler i Extended Length Disassembler Engine dla x86-64.

Zobacz też

Bibliografia

Dalsza lektura

  • Vinciguerra, Lori; M. Wills, Linda; Kejriwal, Nidhi; Martino, Paweł; Vinciguerra, Ralph L. (2003). „Ramy eksperymentalne do oceny narzędzi dezasemblacji i rekompilacji dla C++ i Java]”. Materiały z 10. Konferencji Roboczej na temat Inżynierii Odwrotnej (WCRE) : 14-23. doi : 10.1109/WCRE.2003.1287233 . Numer ISBN 0-7695-2027-8. S2CID  10398240 .
  • Schwarz, Benjamin; Debray, Saumya; Andrews, Gregory (2002). „Demontaż kodu wykonywalnego Revisited”. Materiały IX Konferencji Roboczej Inżynierii Odwrotnej (WCRE) . Wydział Informatyki, Uniwersytet Arizony : 45–54. CiteSeerX  10.1.1.85.6387 .

Linki zewnętrzne