Du ByteCode à l'Opcode

Du ByteCode à l'Opcode - Java - Programmation

Marsh Posté le 11-01-2007 à 14:51:15    

Bonjour à tous,
 
Est-il possible d'obtenir l'opcode d'un fichier .class, entre d'autres mots, est-il possible de passer du bytecode à l'opcode et de pouvoir visualiser cet opcode.
 
Cette question vient d'un projet, ce dernier doit afficher l'etat des piles, tas... de la machine virtuelle en en lisant en fichier .class.
 
En vous remerciant.

Reply

Marsh Posté le 11-01-2007 à 14:51:15   

Reply

Marsh Posté le 21-01-2007 à 11:33:43    

Si j'ai bien compris ce que tu veux c'est un "decompiler"... Normalement avec le sdk de java, il y a le programme javap qui pourrait t'aider... sinon un petit coup de "java decompiler" sur google devrait de donner des résultats intéressants.
 
A tites d'exemple, l'output de javap donne :

Code :
  1. public static double readDouble();
  2.   Code:
  3.    0:   aconst_null
  4.    1:   astore_0
  5.    2:   iconst_0
  6.    3:   istore_2
  7.    4:   invokestatic    #5; //Method readLine:()Ljava/lang/String;
  8.    7:   astore_1
  9.    8:   aload_1
  10.    9:   invokestatic    #18; //Method java/lang/Double.valueOf:(Ljava/lang/String;)Ljava/lang/Double;
  11.    12:  astore_0
  12.    13:  iconst_1
  13.    14:  istore_2
  14.    15:  goto    19
  15.    18:  astore_3
  16.    19:  iload_2
  17.    20:  ifeq    4
  18.    23:  aload_0
  19.    24:  invokevirtual   #19; //Method java/lang/Double.doubleValue:()D
  20.    27:  dreturn
  21.   Exception table:
  22.    from   to  target type
  23.      8    15    18   Class java/lang/NumberFormatException

Reply

Marsh Posté le 21-01-2007 à 16:08:35    

leonhard a écrit :

Si j'ai bien compris ce que tu veux c'est un "decompiler"... Normalement avec le sdk de java, il y a le programme javap qui pourrait t'aider... sinon un petit coup de "java decompiler" sur google devrait de donner des résultats intéressants.
 
A tites d'exemple, l'output de javap donne :

Code :
  1. public static double readDouble();
  2.   Code:
  3.    0:   aconst_null
  4.    1:   astore_0
  5.    2:   iconst_0
  6.    3:   istore_2
  7.    4:   invokestatic    #5; //Method readLine:()Ljava/lang/String;
  8.    7:   astore_1
  9.    8:   aload_1
  10.    9:   invokestatic    #18; //Method java/lang/Double.valueOf:(Ljava/lang/String;)Ljava/lang/Double;
  11.    12:  astore_0
  12.    13:  iconst_1
  13.    14:  istore_2
  14.    15:  goto    19
  15.    18:  astore_3
  16.    19:  iload_2
  17.    20:  ifeq    4
  18.    23:  aload_0
  19.    24:  invokevirtual   #19; //Method java/lang/Double.doubleValue:()D
  20.    27:  dreturn
  21.   Exception table:
  22.    from   to  target type
  23.      8    15    18   Class java/lang/NumberFormatException



Non, ce qu'il veut c'est pouvoir obtenir les opcodes depuis le bytecode, les opcodes étant le code exécuté par le processeur.
 
Leleniniste > je doute qu'il soit parfait (me semble qu'il y a pas mal de trucs pas encore implémentés) et il ne sort sûrement pas les même opcodes que la JVM officielle, mais GCJ est capable de compiler des .java et .class en code natif, tu peux probablement décompiler les executables derrière pour obtenir le bytecode.
 
Sinon, tu peux aussi essayer de voir dans l'implémentation de la JVM même (elle est passée OSS non?) de quelle manière elle fonctionne.
Alternative à la JVM officielle, il y a aussi Kaffe, une VM java avec JIT.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed