Java - Disassemblieren - Bytecode
lima-city → Forum → Programmiersprachen → Java
adresse
befehl
byte
code
eigentlichen frage
entsprechenden abschnitte
ergebnis
instruktion
lang string
legen
lesbaren code
operation
programm
resultat
richtigen reihenfolge
sprung
url
wiederherstellen
zeile
zeiteinheit
-
Hey,
ich habe eine Frage zu einem Disassemblierten Code
Der Code der disassembliert wurde: Quelltext
public class switchD extends java.lang.Object{ public switchD(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_2 1: istore_1 2: sipush 2000 5: istore_2 6: iconst_0 7: istore_3 8: iload_1 9: tableswitch{ //1 to 12 1: 72; 2: 84; 3: 72; 4: 78; 5: 72; 6: 78; 7: 72; 8: 72; 9: 78; 10: 72; 11: 78; 12: 72; default: 117 } 72: bipush 31 74: istore_3 75: goto 125 78: bipush 30 80: istore_3 81: goto 125 84: iload_2 85: iconst_4 86: irem 87: ifne 97 90: iload_2 91: bipush 100 93: irem 94: ifne 105 97: iload_2 98: sipush 400 101: irem 102: ifne 111 105: bipush 29 107: istore_3 108: goto 125 111: bipush 28 113: istore_3 114: goto 125
So wieso gibt es die "Zeilen" 0, 1, 2 ,5... aber nicht 3 und 4?
0: iconst_2 1: istore_1 2: sipush 2000 5: istore_2 6: iconst_0 7: istore_3 8: iload_1
Beitrag zuletzt geändert: 10.7.2010 7:49:24 von myhead -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Genau weiß ich es auch nicht, aber wenn man sich die entsprechenden Abschnitte ansieht, fällt auf, dass nach Instruktionen mit extra Parametern ein Sprung kommt. Die logische Erklärung dafür ist, dass die Zahlen Byte-Adressen sind und dass manche Anweisungen mehr als ein Byte brauchen.
2: sipush 2000 5: istore_2
sipush -> 1 Byte
2000 -> größer als 256 -> braucht 2 Bytes
72: bipush 31 74: istore_3
bipush -> 1 Byte
31 -> 1 Byte
75: goto 125 78: bipush 30
goto -> vermutlich 2 Bytes. Die JavaVM kennt wahrscheinlich deutlich mehr als 256 Befehle und die weniger häufigen Befehle benötigen mehr als 1 Byte
125 -> 1 Byte
Beitrag zuletzt geändert: 10.7.2010 8:33:08 von bladehunter -
Disassemblieren != Decompilieren.
Bladehunter hat vollkommen Recht, denn nur beim Decompilieren, bekommst du Zeilen an Code mit Zeilennummern zurück. Im Bytecode siehst du eben auch nur das Bytearray (in teilweise interpretierter Form) und ebendessen Byte-Adressen (landläufig auch Offsets genannt).
Liebe Grüße
- VampireSilence -
Gibt es gute Decompilierer oder beisst man sich daran die Zähne aus?
Und wie kann man seinen Code dann vor klau schützen? (nicht, dass das nötig wäre, nur Interessehalber)
gruß
-
Moin,
Es gibt einige gute Dekompilierungsprogramme, aber nur bestimmte werden hoch angepriesen aufgrund Ihrer Funktionalität.
Generell kann man seinen Code vor niemanden schützen der den Source wiederherstellen will.
Darüber sollte man sich im Klaren sein. Andersrum gesehen wird sich aber auch nicht jeder die Mühe machen,
ein Programm zu dekompilieren, denn der Aufwand ist schon enorm bevor man lesbaren Code verzeichnen kann.
Gruß,
Pawnee -
Ich weiß ja nicht ob die Angabe von solchen Programmen hier verboten ist. Wenn ja bitte einfach zensieren oder darauf hinweisen. (An und für sich sind diese Tools ja nichts verbotenes).
Ich verwende üblicherweise JAD um meinen Sourcecode vom ByteCode wiederherzustellen. Liefert bei nicht zu Komplexen und nicht Obfuscated ByteCode gute Ergebnisse. Mit dem Ergebnis lässt sich der ursprüngliche Code gut nachbauen / neuschreiben.
Zur eigentlichen Frage warum diese Offsets fehlen (meines Wissens): Diese "Sprünge" sind das Resultat der benötigten "Zeiteinheiten" der ensprechenden Operationen. So benötigt ein bipush 2 Zeiteinheiten um die Operation abzuschließen (den Wert auf den Stack legen). D.h. die Zeiteinheit direkt nach dem bipush bekommt keine eigene Sprungmarke. Da diese Sprungmarken als solche nicht im Bytecode mit abgelegt werden, werden diese vom Disassembler / Decompiler erzeugt um nach dem "interpretieren" des Bytecodes den Code in der Richtigen Reihenfolge wieder Schreiben zu können.
Grüße Daniel -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage