包括反编译出字节码以及汇编
字节码
参考另一篇文章: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 forhsdis-i386.dll
) -
mingw64-x86_64-gcc-core
(only needed forhsdis-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
导入日志文件后启动:
相关推荐
JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA...
jad 是应用最广泛的java 反编译工具;其本身是命令行工具;其他很多用具是在jad内核的基础上加了一个图形界面;比如我上传的资源、Cavaj Java Decompiler 以下假设jad.exe在c:\java目录下 一、基本用法 ...
1.java反编译工具 2.绿色版占用内存少 3.好用,值得下载
java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译的工具,非常好用 java反编译...
java反编译 java 反编译 java反编译 java 反编译 java反编译 java 反编译 java反编译 java 反编译 java反编译 java 反编译
JAVA反编译插件文件
JAVA反编译软件(可将class文件反编译为java文件)
java 反编译,jd-gui.exe打开class文件即可
JAVA反编译文件解决中文乱码问题
安卓、Java反编译工具的工具 可以把一编译过的文件反编译成java'文件
java反编译工具(jd-gui)是一款非常出色的电脑端java反编译工具。java反编译工具(jd-gui)拥有十分出色的反编译效率,能够有效提升整体工作的效率,节省更多时间,操作起来也相对简单,轻松进行反编译。 java反编译...
javadecompiler java反编译工具
可以将java编译后的class文件或者jar包反编译出来,看到编译前的代码
在众多的JAVA反编译工具中,有几种非常著名的工具使用了相同的核心引擎——JAD。JAD本身是一个命令行工具,没有图形界面,上述的这些工具大多是在JAD内核的基础之上加了一个图形界面而已。这么多种产品的共同选择,...
jad-java反编译工具eclipse插件,jad-java反编译工具eclipse插件
java反编译jd-gui-1.6.6.jar
.class文件反编译成java文件 支持类名索引 方法名索引 字段名索引 此软件仅用于学习使用
JAVA工具精品新译<5>DJ Java Decompiler 3.12.12.96 32位老朽痴拙汉化特别版(JAVA反编译之王) 使用DJ Java Decompiler可用於 2000,XP,2003,Vista,Windows7, 32位环境.你可以反编译class文件并且可以保存为文本...
java反编译项目工程,可以将class 文件 进行 修改 重新导包 生成修改后的jar 步骤 1、将需要修改的 jar 包 放入 lib 目录下,并加入项目中 ,选中 jar 右击 选择 add a libray这个时候会看到 jar 的 目录 结构 2、...