2010-03-29 11 views
15

Czy jest narzędzie podobne do OllyDbg/SoftICE dla java? To znaczy. wykonaj klasę (od słoika/ze ścieżką klasy) i, bez kodu źródłowego, pokaż demontaż kodu pośredniego z możliwością przejścia przez/krok po/wyszukania referencji/edycji określonego pośredniego kodu w pamięci/zastosowania edycji do pliku ...Czy istnieje dezasembler + debugger dla java (ala OllyDbg/SoftICE dla asemblera)?

Jeśli nie, czy możliwe jest nawet napisanie czegoś takiego (zakładając, że jesteśmy gotowi żyć bez hotspotu dla czasu debugowania)?

Edytuj: Nie mówię o JAD lub JD lub Cavaj. To są świetne dekompilatory, ale nie chcę dekompilatora z kilku powodów, najbardziej godne uwagi jest to, że ich wyniki są niepoprawne (w najlepszym przypadku, czasami po prostu źle). Nie szukam magicznego "skompilowanego kodu bajtowego do kodu Java" - chcę zobaczyć rzeczywiste bajty, które mają zostać wykonane. Chciałbym też możliwość zmiany tych bajtów (tak jak w debugerze zespołu) i, miejmy nadzieję, zapisać zmienioną część z powrotem do pliku klasy.

Edycja2: Wiem, że istnieje javap - ale działa tylko w jeden sposób (i bez żadnej analizy). Przykład (kod pochodzi z vmspec dokumentacji): z kodu java, używamy "javac" skompilować to:

void setIt(int value) { 
    i = value; 
} 
int getIt() { 
    return i; 
} 

do pliku .class Java. Korzystanie javap -c mogę dostać tego wyjścia:

Method void setIt(int) 
    0 aload_0 
    1 iload_1 
    2 putfield #4 
    5 return 
    Method int getIt() 
    0 aload_0 
    1 getfield #4 
    4 ireturn 

Jest OK do demontażu części (nie bardzo dobry, bez analizy - „pole nr 4 jest Example.i”), ale nie mogę znaleźć dwa inne "narzędzia":

  1. Debugger, który przechodzi przez same instrukcje (ze stosu, zrzutów pamięci, itp.), co pozwala mi sprawdzić rzeczywisty kod i środowisko.
  2. Sposób odwrócenia procesu - edytuj zdemontowany kod i odtwórz plik .class (z edytowanym kodem).

Odpowiedz

11

nie sądzę, to jest naprawdę pełna odpowiedź, ale kilka wskazówek, które mogą zapewnić coś praktycznego:

(1) W odniesieniu do oglądania i bezpośrednio współpracuje z kodu bajtowego stary BCEL Class Construction Kit może być użyteczne (jest to tylko edytor GUI dla znanego bajtodu).

(2) Jeśli chodzi o debugowanie i przechodzenie przez kod bajtowy, this Eclipse plugin, który integruje się z debugerem Eclipse, może spełnić Twoje potrzeby.

Nie jestem świadomy żadnych narzędzi, które łączyłyby te funkcje i pozwalają manipulować kodami bajtowymi podczas wykonywania kodu (przynajmniej w taki sam sposób, jak w OllyDbg itp.). Jednak Java debugger API powinna być w stanie obsłużyć manipulowanie kodem w czasie wykonywania (chociaż, biorąc pod uwagę naturę HotSpot i JIT w ogóle, nie wiem, czy byłoby możliwe przepisanie instrukcji tuż przed jej wywołaniem --- aktualnie wykonywalny kod kodu bajtowego jest w rzeczywistości abstrakcją tego, jak tłumacz wybiera implementację operacji op, w przeciwieństwie do kodu natywnego, w którym zdemontowany kod operacji jest w rzeczywistości instrukcją wysyłaną do procesora). Alternatywnie można zajrzeć do Java Instrumentation API, która umożliwia redefiniowanie kodu bajtowego w środowisku wykonawczym.I, oczywiście, any of the various open source bytecode manipulation libraries może być w stanie pomóc lub dostarczyć inspiracji.

Oczywiście zawsze istnieje możliwość obejścia całej infrastruktury JVM i po prostu dołączenie debuggera do procesu JVM. Trochę się o tym dyskutuje in this question i this page linked from that question.

Najważniejsze jest jednak to, że to, co wydaje się próbować osiągnąć, będąc wspólnym miejscem w świecie kodu natywnego, nie jest tak powszechną praktyką w świecie Java (część przyczyn używanie Java jest abstrakcją ze wszystkich krwawych szczegółów). To, a względnie banalny charakter dekompilacji kodu bajtowego (w porównaniu z, powiedzmy C++) doprowadził do sytuacji, w której tego rodzaju wymagania są ograniczone, podobnie jak tego typu oprzyrządowanie.

+0

Wow, świetna odpowiedź. Szkoda, że ​​nie ma takiego narzędzia. Wątpię, czy sam ją zbuduję (bardzo interesująca - ale presja w pracy, życie, niewystarczająca znajomość domeny ...). Dzięki za bardzo kompletną odpowiedź. –

+0

+1 Wszystkie te informacje bardzo mi pomogły! =) Dzięki – jyz

2

Proszę spojrzeć na JAD Decomplier dla dekompilacji kodu Java. Następnie można uruchomić wbudowany debuger IDE przy użyciu produkowanych źródeł. IDE może być IntelliJ, Eclipse lub NetBeans. Takie podejście nie jest całkowicie automatyczne, ale powinno wykonać to zadanie.

+0

Nie tego szukam - zapoznaj się z moją zmianą w celu uzyskania pełnej odpowiedzi. –

+0

Cóż, wtedy odpowiedź brzmi: "Nie ma czegoś takiego". –

+0

:(. : Czy istnieje sposób na stworzenie czegoś takiego? Czy interfejs API debugowania VM go obsługuje? –

Powiązane problemy