天天看點

一個簡單的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