`
lobin
  • 浏览: 381706 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java反编译

 
阅读更多

 

包括反编译出字节码以及汇编

 

字节码

参考另一篇文章:https://lobin.iteye.com/blog/2438472

 

汇编

 

>javac asm\SimpleClass.java

>java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -Xcomp asm.SimpleClass > SimpleClass.asm

 

需要安装hsdis插件

参考另一篇文章:https://dropzone.nfshost.com/hsdis/

 

在Cygwin环境下build hsdis-amd64.dll and hsdis-i386.dll前需要先安装以下软件依赖:

 

  • gcc-core
  • make
  • mingw64-i686-gcc-core (only needed for hsdis-i386.dll)
  • mingw64-x86_64-gcc-core (only needed for hsdis-amd64.dll)

 

另外还需要准备:

1、binutils-2.32.tar.xz

下载地址:https://ftpmirror.gnu.org/binutils/binutils-2.32.tar.xz

 

2、jdk-jdk-13+16.tar.bz2

下载地址:https://hg.openjdk.java.net/jdk/jdk/archive/jdk-13%2B16.tar.bz2/src/utils/hsdis

 

hsdis-i386.dll build:

make OS=Linux MINGW=i686-w64-mingw32 BINUTILS=../../../../../binutils-2.32/binutils-2.32 DLDFLAGS='-shared -static-libgcc'

 

以一个最简单的java程序为例:

package asm;

public class SimpleClass {

    public static void main(String[] args) {
        System.out.println("hello, world!");
    }
}

反编译后的汇编代码:

核心部分

Decoding compiled method 0x00c69e88:

Code:

[Entry Point]

[Verified Entry Point]

[Constants]

  # {method} {0x134a019c} 'main' '([Ljava/lang/String;)V' in 'asm/SimpleClass'

  # parm0:    ecx       = '[Ljava/lang/String;'

  #           [sp+0x20]  (sp of caller)

  0x00c69f90: mov    %eax,-0x4000(%esp)

  0x00c69f97: push   %ebp

  0x00c69f98: sub    $0x18,%esp

  0x00c69f9b: nopl   0x0(%eax,%eax,1)

  0x00c69fa0: jmp    0x00c69ff5         ;   {no_reloc}

  0x00c69fa5: data16 xchg %ax,%ax

  0x00c69fa8: jmp    0x00c6a00f         ; implicit exception: dispatches to 0x00c69fff

  0x00c69fad: nop                       ;*getstatic out

                                        ; - asm.SimpleClass::main@0 (line 9)

 

  0x00c69fae: cmp    (%ecx),%eax        ; implicit exception: dispatches to 0x00c6a019

  0x00c69fb0: mov    $0x2cc8058,%edx    ;*invokevirtual println

                                        ; - asm.SimpleClass::main@5 (line 9)

                                        ;   {oop("hello, world!")}

  0x00c69fb5: nop

  0x00c69fb6: mov    $0xffffffff,%eax

  0x00c69fbb: call   0x00b2b780         ; OopMap{off=48}

                                        ;*invokevirtual println

                                        ; - asm.SimpleClass::main@5 (line 9)

                                        ;   {virtual_call}

  0x00c69fc0: add    $0x18,%esp

  0x00c69fc3: pop    %ebp

  0x00c69fc4: test   %eax,0x9c0100      ;   {poll_return}

  0x00c69fca: ret    

  0x00c69fcb: mov    $0x0,%edx          ;   {oop(NULL)}

  0x00c69fd0: push   %eax

  0x00c69fd1: push   %ebx

  0x00c69fd2: mov    0x44(%edx),%ebx

  0x00c69fd5: mov    %fs:0x0(,%eiz,1),%eax

  0x00c69fdd: mov    -0xc(%eax),%eax

  0x00c69fe0: cmp    0xac(%ebx),%eax

  0x00c69fe6: pop    %ebx

  0x00c69fe7: pop    %eax

  0x00c69fe8: jne    0x00c69ff5

  0x00c69fee: jmp    0x00c69fa5

  0x00c69ff0: mov    $0x5252a00,%eax

  0x00c69ff5: call   0x00b8e210         ; OopMap{off=106}

                                        ;*getstatic out

                                        ; - asm.SimpleClass::main@0 (line 9)

                                        ;   {runtime_call}

  0x00c69ffa: jmp    0x00c69fa0

  0x00c69ffc: nop

  0x00c69ffd: nop

  0x00c69ffe: nop

  0x00c69fff: call   0x00b8c210         ; OopMap{edx=Oop off=116}

                                        ;*getstatic out

                                        ; - asm.SimpleClass::main@0 (line 9)

                                        ;   {runtime_call}

  0x00c6a004: mov    0x0(%edx),%ecx

  0x00c6a00a: mov    $0x6050b00,%eax

  0x00c6a00f: call   0x00b8de90         ; OopMap{edx=Oop off=132}

                                        ;*getstatic out

                                        ; - asm.SimpleClass::main@0 (line 9)

                                        ;   {runtime_call}

  0x00c6a014: jmp    0x00c69fa8

  0x00c6a016: nop

  0x00c6a017: nop

  0x00c6a018: nop

  0x00c6a019: call   0x00b8c210         ; OopMap{ecx=Oop off=142}

                                        ;*invokevirtual println

                                        ; - asm.SimpleClass::main@5 (line 9)

                                        ;   {runtime_call}

  0x00c6a01e: nop

  0x00c6a01f: nop

  0x00c6a020: mov    %fs:0x0(,%eiz,1),%esi

  0x00c6a028: mov    -0xc(%esi),%esi

  0x00c6a02b: mov    0x1a4(%esi),%eax

  0x00c6a031: movl   $0x0,0x1a4(%esi)

  0x00c6a03b: movl   $0x0,0x1a8(%esi)

  0x00c6a045: add    $0x18,%esp

  0x00c6a048: pop    %ebp

  0x00c6a049: jmp    0x00b8bd40         ;   {runtime_call}

  0x00c6a04e: hlt    

  0x00c6a04f: hlt    

[Stub Code]

  0x00c6a050: nop                       ;   {no_reloc}

  0x00c6a051: nop

  0x00c6a052: mov    $0x0,%ebx          ;   {static_stub}

  0x00c6a057: jmp    0x00c6a057         ;   {runtime_call}

[Exception Handler]

  0x00c6a05c: call   0x00b8d540         ;   {runtime_call}

  0x00c6a061: push   $0x6d54ad44        ;   {external_word}

  0x00c6a066: call   0x00c6a06b

  0x00c6a06b: pusha  

  0x00c6a06c: call   0x6d433c90         ;   {runtime_call}

  0x00c6a071: hlt    

[Deopt Handler Code]

  0x00c6a072: push   $0xc6a072          ;   {section_word}

  0x00c6a077: jmp    0x00b2c030         ;   {runtime_call}

 

 

另外有个提供图形界面工具也可以查看Java反编译汇编代码:jitwatch

下载地址:https://github.com/AdoptOpenJDK/jitwatch/archive/1.3.0.zip

 

mvn clean install -DskipTests=true

 

运行jitwatch

launchUI.bat

 

VolatileTest为例:

package ins;

public class VolatileTest {

    private int i;
    private volatile int j;

    public void test_assign() {
        i = 10;
        j = 11;
        i = 11;
        j = 12;
        i = 12;
    }

    public static void main(String[] args) {
        VolatileTest test = new VolatileTest();
        test.test_assign();
    }
}

编译后运行:

>java -XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading  -XX:+PrintAssembly -XX:+LogCompilation -XX:LogFile=jit.log  -Xcomp  ins.VolatileTest

 

生成日志文件:

-XX:LogFile=jit.log

 

导入日志文件后启动:


 

 



 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics