`
lobin
  • 浏览: 427369 次
  • 性别: 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
分享到:
评论

相关推荐

    java反编译工具绿色版

    Java反编译工具是程序员在开发和调试过程中经常会用到的一种实用软件,它能够将已编译的Java字节码(.class文件)转换回源代码格式,这对于查看和理解第三方库或者研究已有的二进制代码非常有帮助。本绿色版的Java反...

    JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具

    JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA反编译工具JAVA...

    java反编译工具

    Java反编译工具是开发者在特定情况下非常有用的工具,它能够将已经编译好的.class文件转换回源代码的.java文件。这种技术对于软件维护、学习他人代码、逆向工程或者理解已有的二进制库的工作原理都至关重要。本文将...

    JAVA反编译软件(可将class文件反编译为java文件)

    Java反编译是Java开发中一个重要的辅助工具,它能够帮助开发者查看已编译的`.class`文件中的源代码,即使原始的`.java`源文件已经丢失或未被提供。这个过程对于理解类库的工作原理、逆向工程、调试、学习或者分析...

    咖啡图形的java反编译工具(实用)

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解已加密或混淆的代码、逆向工程库或者研究软件内部工作原理非常有用。这款名为“咖啡图形的java反编译工具”很可能是一...

    Java反编译工具jui

    Java反编译是Java开发中一个重要的辅助工具,主要用于查看和理解Java字节码,将已编译的.class文件或.jar文件转换回源代码形式。这在进行逆向工程、学习开源项目、修复bug或者理解未知代码的工作流程时非常有用。...

    jd-gui最好的JAVA反编译工具

    此时,就需要用到反编译工具,而jd-gui就是这样一款强大的JAVA反编译工具。它以其简单易用、功能齐全的特点,深受广大开发者喜爱。 首先,jd-gui是一款开源的Java反编译工具,能够将字节码还原为接近原始的Java源...

    java反编译程序

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程。在开发或维护项目时,如果原始的源代码丢失或不可用,反编译工具就能派上用场。这些工具可以帮助开发者理解代码的功能,修复错误,...

    java反编译工具 jad

    jad 是应用最广泛的java 反编译工具;其本身是命令行工具;其他很多用具是在jad内核的基础上加了一个图形界面;比如我上传的资源、Cavaj Java Decompiler  以下假设jad.exe在c:\java目录下  一、基本用法  ...

    java反编译exe

    Java反编译exe主要指的是将Java的字节码(.class文件)转换回源代码(.java文件)的过程。在Java编程中,源代码被编译成字节码,然后由JVM(Java虚拟机)执行。然而,出于调试、学习或者逆向工程的目的,有时我们...

    JAVA反编译和unicode转字符.rar

    Java反编译与Unicode字符转换是Java开发过程中两个重要的技术环节。反编译是指将已编译的字节码(.class文件)转换回源代码的过程,这对于理解已有的类库或者进行逆向工程非常有用。Unicode是国际通用的字符编码标准,...

    JAVA反编译文件解决中文乱码

    本文将详细介绍如何解决JAVA反编译文件时的中文乱码问题。 首先,理解问题的根源:Java源代码默认采用UTF-8编码,但某些情况下,源代码可能使用了其他编码方式,如GBK。当这些源代码被编译成字节码后,再用不支持...

    安卓、Java反编译工具

    本文将深入探讨“安卓、Java反编译工具”这一主题,包括它们的工作原理、常用的反编译工具以及如何使用这些工具来解析编译过的文件。 首先,我们需要理解编译和反编译的基本概念。编译是将源代码(如Java或Android...

    Java反编译工具

    Java反编译工具是开发者和逆向工程人员用于查看Java字节码的工具,它们能够将已编译的.class文件转换回源代码形式,以便理解程序的内部工作原理或者进行代码分析。Java语言的编译过程是将源代码(.java文件)编译成...

    java反编译工具(.class文件反编译成.java文件)

    Java反编译是将已编译的字节码(.class文件)转换回源代码(.java文件)的过程,这对于理解和学习已有的Java程序、逆向工程或调试都是很有用的。标题提到的"java反编译工具"是用于这个目的的软件,它能够帮助开发者...

    mac 版本 java反编译工具jd-gui

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码的过程,这对于理解或学习已封装的库、框架或者解决逆向工程问题非常有用。在Mac操作系统上,一个常见的Java反编译工具是JD-GUI。JD-GUI是一款图形化...

    java反编译工具 java反编译工具

    Java反编译是将已编译的Java字节码(.class文件)转换回源代码的过程,这在软件开发、逆向工程、调试和学习他人的代码时非常有用。Java的字节码并不直接对应于源代码,因此需要特定的工具来实现反编译。这些工具可以...

    java 反编译软件

    Java反编译软件是开发人员在特定情况下非常有用的工具,它允许用户查看和理解已编译的Java字节码,从而获取类似于原始源代码的表示。这种能力在多个场景下非常有用,例如学习第三方库的工作原理、调试无源码的JAR...

Global site tag (gtag.js) - Google Analytics