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.
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 public Lcom/lohan/crackme1/example; .super Ljava/lang/Object; .source "example.java" # static fields .field private static Counter:I # direct methods # all the constructor does is set Counter to 0x10 (or 16) .method public constructor <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 public static 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 index 0" aput-object v1, v0, v2 .line 53 # put value v1 inside array v0 at index v3 (0x1) const-string v1, "index 1 has this value" aput-object v1, v0, v3 .line 55 # store in v1 the value from array v0 at index v2 aget-object v1, v0, v2 # store in v2 the value from array v0 at index 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 are not 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 0 to Counter # just a few lines in java .method public static 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 for loop: " 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 public static 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 to here .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 public static 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 # if NO 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 # all of 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
Good!
ReplyDeleteThanks!
ReplyDeleteExcelent!! Thank you so much
ReplyDeleteGreat , Thanks
ReplyDeletehehe
ReplyDeleteGood!
ReplyDeletegreat
ReplyDeletegreat
ReplyDeleteHello you could help me put a URL in the smali apk? I do not understand well
ReplyDeleteFantastic website. Lots of useful info here. I’m sending
ReplyDeleteit to some friends ans additionally sharing in delicious. And obviously, thank you on your sweat!
Great Article..Thanks for the sharing..
ReplyDeleteBigo live is a GooD APK.Connect friends.
Install the application here.....
Bigo Live App