example-structures.smali

转载自 :http://androidcracking.blogspot.com/p/way-of-android-cracker-lessons.html(得翻墙大笑

many people find this blog by searching for smali syntax examples and finding a previous post on example smali syntax. since i originally hastily wrote it, i have learned more so i updated it as best i could for now. more helpfully, i worked out a syntax highlighter for smali using syntaxhighlighter. i'll upload it somewhere official when i'm finished so others can use it. because i know there are throngs of people just itching to have highlighted smali code!

so for the googler's out there trying to make sense of smali, here's example-structures.smali from lesson 1 from way of the android cracker.


.class publicLcom/lohan/crackme1/example;

.superLjava/lang/Object;

.source"example.java"

 

 

# staticfields

.field privatestatic Counter:I

 

 

# directmethods

# all theconstructor does is set Counter to 0x10 (or 16)

.method publicconstructor <init>()V

    .registers 2

 

    .prologue

    .line 11

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

 

    const/16 v0, 0x10

    sput v0,Lcom/lohan/crackme1/example;->Counter:I

 

    return-void

.end method

 

.method publicstatic ArrayExample()V

    .registers 4

 

    .prologue

    const/4 v3, 0x1

    const/4 v2, 0x0

 

    .line 50

    const/4 v1, 0x5

 

    new-array v0, v1, [Ljava/lang/String;

 

    .line 52

    .local v0, someArray:[Ljava/lang/String;

 

    # put value v1 inside array v0 at index v2(0x0)

    const-string v1, "set value at index0"

    aput-object v1, v0, v2

 

    .line 53

    # put value v1 inside array v0 at index v3(0x1)

    const-string v1, "index 1 has thisvalue"

    aput-object v1, v0, v3

 

    .line 55

    # store in v1 the value from array v0 atindex v2

    aget-object v1, v0, v2

 

    # store in v2 the value from array v0 atindex v3

    aget-object v2, v0, v3

 

    # compare two strings

    invoke-virtual {v1, v2},Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v1

 

    # if equals() returns 0, it means they arenot equal, so just return

    if-eqz v1, :cond_1e

 

    .line 57

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

    const-string v2, "array at index 0 = 1(wont happen)"

    invoke-virtual {v1, v2},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

 

    .line 59

    :cond_1e

    return-void

.end method

 

# loop from 0to Counter

# just a fewlines in java

.method publicstatic LoopExample()V

    .registers 4

 

    .prologue

    .line 15

    const/4 v0, 0x0

 

    .local v0, i:I

    :goto_1

    sget v1,Lcom/lohan/crackme1/example;->Counter:I

 

    if-lt v0, v1, :cond_6

 

    .line 17

    return-void

 

    .line 16

    :cond_6

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

 

    new-instance v2, Ljava/lang/StringBuilder;

    const-string v3, "current val forloop: "

    invoke-direct {v2, v3},Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v2, v0},Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

 

    invoke-virtual {v2},Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

 

    invoke-virtual {v1, v2},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

 

    .line 15

    add-int/lit8 v0, v0, 0x1

 

    goto :goto_1

.end method

 

.method publicstatic SwitchExample()V

    .registers 3

 

    .prologue

    .line 21

    const/16 v0, 0x2a

 

    .line 22

    .local v0, val:I

   

    # begin the switch

    # look down at .sparse_switch directive

    sparse-switch v0, :sswitch_data_2e

 

    # switch default just passes through tohere

    .line 27

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

    const-string v2, "invalid value"

    invoke-virtual {v1, v2},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

 

    .line 29

    :goto_c

    return-void

 

    .line 23

    :sswitch_d # if v0 is 1, we'll be here

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

    const-string v2, "val 1"

    invoke-virtual {v1, v2},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    goto :goto_c

 

    .line 24

    :sswitch_15 # if v0 is 2

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

    const-string v2, "val 2"

    invoke-virtual {v1, v2},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    goto :goto_c

 

    .line 25

    :sswitch_1d # if v0 is 42

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

    const-string v2, "val 42"

    invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    goto :goto_c

 

    .line 26

    :sswitch_25 # if v0 is 5

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

    const-string v2, "val 5"

    invoke-virtual {v1, v2},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

    goto :goto_c

 

    .line 22

    nop

 

    :sswitch_data_2e

    # if v0 is 0x1 goto :sswitch_d

    # if 0x2 :sswitch_15

    # and so on...

    .sparse-switch

        0x1 -> :sswitch_d   # 1

        0x2 -> :sswitch_15  # 2

        0x5 -> :sswitch_25  # 5

        0x2a -> :sswitch_1d # 42

    .end sparse-switch

.end method

 

.method publicstatic TryCatchExample()V

    .registers 8

 

    .prologue

    const-string v7, ": "

 

    .line 33

    const-string v3, "google.com"

 

    .line 36

    .local v3, urlStr:Ljava/lang/String;

    # begin try here

    :try_start_4

    new-instance v2, Ljava/net/URL;

 

    invoke-direct {v2, v3},Ljava/net/URL;-><init>(Ljava/lang/String;)V

 

    .line 37

    .local v2, url:Ljava/net/URL;

    invoke-virtual {v2},Ljava/net/URL;->openStream()Ljava/io/InputStream;

 

    move-result-object v1

 

    .line 38

    .local v1, is:Ljava/io/InputStream;

    invoke-virtual {v1},Ljava/io/InputStream;->close()V

    :try_end_10

    # end of the try

   

     # if there was a MalformedURLException,goto :catch_11

    .catch Ljava/net/MalformedURLException;{:try_start_4 .. :try_end_10} :catch_11

   

    # IOException goes to :catch_36

    .catch Ljava/io/IOException; {:try_start_4.. :try_end_10} :catch_36

 

    # ifNO exception, just pass through:

    .line 46

    .end local v1           #is:Ljava/io/InputStream;

    .end local v2           #url:Ljava/net/URL;

    :goto_10

    return-void

 

    .line 39

    :catch_11

    # move the exception to v4, then to v0

    # allof the code below is what happens with an exception

    move-exception v4

    move-object v0, v4

 

    .line 41

    .local v0,e:Ljava/net/MalformedURLException;

    sget-object v4,Ljava/lang/System;->out:Ljava/io/PrintStream;

 

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Invalid URL "

    invoke-direct {v5, v6},Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v5, v3},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

   move-result-object v5

 

    const-string v6, ": "

    invoke-virtual {v5, v7},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

 

    invoke-virtual {v0},Ljava/net/MalformedURLException;->getMessage()Ljava/lang/String;

    move-result-object v6

 

    invoke-virtual {v5, v6},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

 

    invoke-virtual {v5},Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v5

 

    invoke-virtual {v4, v5},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

 

    goto :goto_10

 

    .line 42

    .end local v0           #e:Ljava/net/MalformedURLException;

    # end exception code

   

    # begin exception code   

    :catch_36

    move-exception v4

    move-object v0, v4

 

    .line 44

    .local v0, e:Ljava/io/IOException;

    sget-object v4,Ljava/lang/System;->out:Ljava/io/PrintStream;

 

    new-instance v5, Ljava/lang/StringBuilder;

    const-string v6, "Unable to execute"

    invoke-direct {v5, v6},Ljava/lang/StringBuilder;-><init>(Ljava/lang/String;)V

    invoke-virtual {v5, v3},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

 

    const-string v6, ": "

    invoke-virtual {v5, v7},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

 

    invoke-virtual {v0},Ljava/io/IOException;->getMessage()Ljava/lang/String;

    move-result-object v6

 

    invoke-virtual {v5, v6},Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v5

 

    invoke-virtual {v5},Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v5

 

    invoke-virtual {v4, v5},Ljava/io/PrintStream;->println(Ljava/lang/String;)V

 

    goto :goto_10

    # end exception code

.end method



 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值