2009-08-11 76 views
1

我創建了一個JVMTI代理,做以下處於較高水平:ASM字節碼儀器儀表/出口

  • onClassLoadHook爲加載的類的字節碼發送到一個單獨的Java過程儀表類使用ASM

  • 得到字節碼回並加載它們

在我的獨立的java進程,儀器加載Java類我做次E採用:

.. ..

cr = new ClassReader(inBytes, offset, inLen); 
    cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); 

    ClassAdapter ca = new ClassAdapter(cw) { 
    .. 
    .. 

     @Override 
     public MethodVisitor visitMethod(final int access, 
             final String name, 
             final String desc, 
             String signature, 
             String[] exceptions) { 

      return new MethodAdapter(mv) { 

       @Override 
       public void visitCode() { 

        mv.visitVarInsn(Opcodes.ALOAD, 0); 
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/Tester", "callTestStatic3", "(Ljava/lang/Object;)V"); 
        mv.visitCode(); 

       } 

      } 
     } 

當我嘗試反編譯是使用Java反編譯該儀器後寫的類 - 我看到了下面的反編譯功能,我知道錯了:

public void func1(int arg1, int arg2) 
    { 
    int b; 
    Tester.callTestStatic3(???); 
    System.out.println("arg = " + a + " b = " + b); 

    } 

,因爲我的功能其實是這樣的:

public void func1(int a, int b) 
{ 

    System.out.println("arg = " +a + " b = " +b); 

} 

任何人都可以告訴我,如果我在這裏做錯了什麼?我唯一的線索是,如果不是作爲參數傳遞給我的函數THIS指針,如果我傳入基本類型,則所有東西都可以運行。對於我需要管理的THIS指針有什麼特別之處?我已經比較了字節碼,並且我使用ASMIFIER來了解我需要使用什麼語句來生成正確的字節碼。

回答

1

它看起來像你的代碼是正確的,用mv.visitCode()。 javap顯示預期的字節碼。我想你的原始反編譯器只是沒有做正確的事情。

+0

感謝您的回覆。事實證明你是對的,反編譯器是免費的,而不是最大的指標。自寫這個原始線程以來,我開始使用JAD反編譯器,這看起來很可靠。 – 2009-08-22 06:02:50

1

也許沒關係,但是不應該叫super.visitCode()

@Override 
public void visitCode() { 
    super.visitCode(); 
    ... 

我會使用TraceClassVisitor檢查正在發生什麼。

+0

我確實有super.visitCode()調用 - 我忘了將它添加到示例中。接得好。任何其他想法?當我運行它的工具代碼時,它只是很差的反編譯。感謝您的迴應。 – 2009-08-11 23:26:37

+0

我做了一個mv.visitCode,而不是super.visitCode。我不認爲這是一個問題。 – 2009-08-11 23:27:56

+0

另一個發現 - DJ反編譯器報告正確的反編譯代碼。 – 2009-08-11 23:48:14