天天看点

一个简单的java文件反编译案例

1、写一个JAVA文件

        如果要分析smali文件的语法格式,寄存器等内容,我们先应该拿一个简单的案例来分析一下。在程序员的世界里,一般最开始接触到的是“Hello World!”,但这一次我们例外,因为是为了比较全面的了解smali文件与java文件之间的关联,我们尽可能在一个简单的类中,涉及更多的知识点。

        下面,我们给出一个名为Hello的文件,实现在main函数中调用一个fun()函数,如下:

public class Hello{
	public int fun(int a,int b){
		return (a+b)*(a-b);
	}

	public static void main(String[] args){
		Hello hello = new Hello();
		System.out.println(hello.fun(5,3));
	}
}
           

2、编译过程

2.1 java文件到class文件

       相信学过JAVA的同学,对java文件便以为class文件,一定不会陌生如下的命令行:

一个简单的java文件反编译案例

        经过编译之后,我们会在同目录下得到一个class文件,如下:

一个简单的java文件反编译案例

2.2 class文件到dex文件

       这里我们使用如下命令:dx --dex --output=Hello.dex Hello.class,截图如下:

一个简单的java文件反编译案例

2.3 dex文件到smali文件

一个简单的java文件反编译案例

3、得到Smali文件

       反编译之后得到的smali文件如下所示:

.class public LHello;
.super Ljava/lang/Object;
.source "Hello.java"


# direct methods
.method public constructor <init>()V
    .registers 1

    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static main([Ljava/lang/String;)V
    .registers 5

    .prologue
    .line 7
    new-instance v0, LHello;

    invoke-direct {v0}, LHello;-><init>()V

    .line 8
    sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;

    const/4 v2, 0x5

    const/4 v3, 0x3

    invoke-virtual {v0, v2, v3}, LHello;->fun(II)I

    move-result v0

    invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(I)V

    .line 9
    return-void
.end method


# virtual methods
.method public fun(II)I
    .registers 5

    .prologue
    .line 3
    add-int v0, p1, p2

    sub-int v1, p1, p2

    mul-int/2addr v0, v1

    return v0
.end method