kostenloser Webspace werbefrei: lima-city


Java - Disassemblieren - Bytecode

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    myhead

    myhead hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    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
  5. 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ß

  6. 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
  7. 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
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!