包括反编译出字节码以及汇编
字节码
参考另一篇文章: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字节码(.class文件)转换回源代码格式,这对于查看和理解第三方库或者研究已有的二进制代码非常有帮助。本绿色版的Java反...
JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA...
Java反编译工具是开发者在特定情况下非常有用的工具,它能够将已经编译好的.class文件转换回源代码的.java文件。这种技术对于软件维护、学习他人代码、逆向工程或者理解已有的二进制库的工作原理都至关重要。本文将...
Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...
Java反编译是将已编译的Java字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解已加密或混淆的代码、逆向工程库或者研究软件内部工作原理非常有用。这款名为“咖啡图形的java反编译工具”很可能是一...
Java反编译是Java开发中一个重要的辅助工具,主要用于查看和理解Java字节码,将已编译的.class文件或.jar文件转换回源代码形式。这在进行逆向工程、学习开源项目、修复bug或者理解未知代码的工作流程时非常有用。...
此时,就需要用到反编译工具,而jd-gui就是这样一款强大的JAVA反编译工具。它以其简单易用、功能齐全的特点,深受广大开发者喜爱。 首先,jd-gui是一款开源的Java反编译工具,能够将字节码还原为接近原始的Java源...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程。在开发或维护项目时,如果原始的源代码丢失或不可用,反编译工具就能派上用场。这些工具可以帮助开发者理解代码的功能,修复错误,...
jad 是应用最广泛的java 反编译工具;其本身是命令行工具;其他很多用具是在jad内核的基础上加了一个图形界面;比如我上传的资源、Cavaj Java Decompiler 以下假设jad.exe在c:\java目录下 一、基本用法 ...
Java反编译exe主要指的是将Java的字节码(.class文件)转换回源代码(.java文件)的过程。在Java编程中,源代码被编译成字节码,然后由JVM(Java虚拟机)执行。然而,出于调试、学习或者逆向工程的目的,有时我们...
Java反编译与Unicode字符转换是Java开发过程中两个重要的技术环节。反编译是指将已编译的字节码(.class文件)转换回源代码的过程,这对于理解已有的类库或者进行逆向工程非常有用。Unicode是国际通用的字符编码标准,...
本文将详细介绍如何解决JAVA反编译文件时的中文乱码问题。 首先,理解问题的根源:Java源代码默认采用UTF-8编码,但某些情况下,源代码可能使用了其他编码方式,如GBK。当这些源代码被编译成字节码后,再用不支持...
本文将深入探讨“安卓、Java反编译工具”这一主题,包括它们的工作原理、常用的反编译工具以及如何使用这些工具来解析编译过的文件。 首先,我们需要理解编译和反编译的基本概念。编译是将源代码(如Java或Android...
Java反编译工具是开发者和逆向工程人员用于查看Java字节码的工具,它们能够将已编译的.class文件转换回源代码形式,以便理解程序的内部工作原理或者进行代码分析。Java语言的编译过程是将源代码(.java文件)编译成...
Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...
Java反编译是将已编译的Java字节码(.class文件)转换回源代码的过程,这对于理解或学习已封装的库、框架或者解决逆向工程问题非常有用。在Mac操作系统上,一个常见的Java反编译工具是JD-GUI。JD-GUI是一款图形化...
Java反编译是将已编译的Java字节码(.class文件)转换回源代码的过程,这在软件开发、逆向工程、调试和学习他人的代码时非常有用。Java的字节码并不直接对应于源代码,因此需要特定的工具来实现反编译。这些工具可以...
Java反编译软件是开发人员在特定情况下非常有用的工具,它允许用户查看和理解已编译的Java字节码,从而获取类似于原始源代码的表示。这种能力在多个场景下非常有用,例如学习第三方库的工作原理、调试无源码的JAR...