19 Stimmen

Gibt es einen Disassembler + Debugger für Java (ala OllyDbg / SoftICE für Assembler)?

Gibt es ein ähnliches Dienstprogramm wie OllyDbg / SoftICE für Java? D.h. Klasse ausführen (aus jar / mit Klassenpfad) und, ohne Quellcode, die Disassemblierung des Zwischencodes mit der Fähigkeit, Schritt durch / Schritt über / Suche nach Referenzen / bearbeiten spezifische Zwischencode im Speicher / gelten bearbeiten, um Datei...

Wenn nicht, ist es überhaupt möglich, so etwas zu schreiben (vorausgesetzt, wir sind bereit, für die Dauer der Fehlersuche ohne Hotspot zu leben)?

Edit: Ich spreche nicht von JAD oder JD oder Cavaj. Das sind gute Decompiler, aber ich will aus mehreren Gründen keinen Decompiler, der wichtigste ist, dass ihre Ausgabe falsch ist (im besten Fall, manchmal einfach nur falsch). Ich bin nicht auf der Suche nach einer magischen "Kompilierung von Bytes zu Java-Code" - ich möchte die tatsächlichen Bytes sehen, die gerade ausgeführt werden sollen. Außerdem möchte ich die Möglichkeit haben, diese Bytes zu ändern (genau wie in einem Assembler-Debugger) und hoffentlich den geänderten Teil zurück in die Klassendatei zu schreiben.

Edit2: Ich weiß, dass javap existiert - aber es macht nur einen Weg (und ohne irgendeine Art von Analyse). Beispiel (Code aus der vmspec-Dokumentation): Aus Java-Code kompilieren wir diesen mit "javac":

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

in eine Java-Klassendatei. Mit javap -c kann ich diese Ausgabe erhalten:

    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

Das ist OK für den Demontageteil (nicht wirklich gut ohne Analyse - "Feld #4 ist Beispiel.i"), aber ich kann die beiden anderen "Werkzeuge" nicht finden:

  1. Ein Debugger, der die Anweisungen selbst überprüft (mit Stack, Speicherabzügen usw.), so dass ich den eigentlichen Code und die Umgebung untersuchen kann.
  2. Ein Weg, den Prozess umzukehren - bearbeiten Sie den disassemblierten Code und erstellen Sie die .class-Datei neu (mit dem bearbeiteten Code).

12voto

ig0774 Punkte 36899

Ich glaube nicht, dass dies eine vollständige Antwort ist, aber ein paar Hinweise, die vielleicht eine brauchbare Lösung bieten:

(1) In Bezug auf die Anzeige und die direkte Arbeit mit Bytecode ist die alte BCEL Klasse Baukasten kann nützlich sein (es ist der einzige GUI-Editor für Bytecode, den ich kenne).

(2) In Bezug auf die Fehlersuche und das Steppen durch den Bytecode, dieses Eclipse-Plugin die in den Debugger von Eclipse integriert ist, könnte Ihren Bedürfnissen entsprechen.

Mir sind keine Dienstprogramme bekannt, die diese Funktionen kombinieren und es Ihnen ermöglichen, den Bytecode während der Ausführung zu manipulieren (zumindest in der gleichen Weise wie in OllyDbg usw.). Allerdings ist die Java Debugger-API sollte in der Lage sein, die Manipulation des Codes zur Laufzeit zu unterstützen (obwohl ich angesichts der Natur von HotSpot und JIT im Allgemeinen nicht weiß, ob es möglich wäre, eine Anweisung umzuschreiben, kurz bevor sie aufgerufen wird --- der aktuell ausgeführte Bytecode-Opcode ist wirklich eine Abstraktion dafür, wie der Interpreter sich entscheidet, den Op zu implementieren, im Gegensatz zu nativem Code, wo der disassemblierte Opcode tatsächlich die an die CPU gesendete Anweisung ist). Alternativ könnten Sie sich auch mit dem Java-Instrumentierungs-API die eine Möglichkeit bietet, Bytecode zur Laufzeit umzudefinieren. Und, natürlich, eine der verschiedenen quelloffenen Bibliotheken zur Bytecode-Manipulation können vielleicht helfen oder Anregungen geben.

Und natürlich gibt es immer die Möglichkeit, die gesamte JVM-Infrastruktur zu umgehen und einfach einen Debugger an den JVM-Prozess anzuhängen. Es gibt einige Diskussionen darüber in dieser Frage und weiter diese Seite, die mit dieser Frage verlinkt ist .

Die Quintessenz ist jedoch, dass das, was Sie zu erreichen versuchen, zwar in der Welt des nativen Codes üblich ist, aber in der Java-Welt nicht so häufig vorkommt (ein Teil des Grundes für die Verwendung von Java ist die Abstraktion von all den schmutzigen Details). Dies und die relativ triviale Natur der Dekompilierung von Bytecode (im Vergleich zu, sagen wir, C++) hat zu einer Situation geführt, in der diese Art von Anforderung selten ist und somit auch diese Art von Tooling.

2voto

Slava Imeshev Punkte 1322

Werfen Sie einen Blick auf JAD-Verzögerer zur Dekompilierung von Java-Code. Sie können dann den integrierten Debugger einer IDE mit den erzeugten Quellen ausführen. Die IDE kann IntelliJ, Eclipse oder NetBeans sein. Dieser Ansatz ist nicht völlig automatisch, aber er sollte die Aufgabe erfüllen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X