Android-Smali-入門介紹/基礎(chǔ)語(yǔ)法

一.介紹

百科名詞:
    Smali/Baksmali分別是Android虛擬機(jī)Dalvik的.dex文件的匯編器/反匯編器。
    Smali/Baksmali實(shí)現(xiàn)了.dex格式所有功能(注解,調(diào)試信息,線路信息等)
    Smali/Baksmali分別是冰島語(yǔ)中編譯器/反編譯器名字。也許你會(huì)問為什么是冰島語(yǔ)呢?因?yàn)镈alvik是一個(gè)冰島漁村名字!
    
作用: 
    在沒有源碼情況下,修改一個(gè)APK的java代碼最可靠方法是直接修改.smali代碼文件(apktool工具把.dex反匯編成.smali);
    如果把.dex反編譯為.class,再反編譯.java,修改后重新編譯,一般情況都很難正常運(yùn)行,因?yàn)榉淳幾g流程太長(zhǎng)了很容易出現(xiàn)錯(cuò)誤!
    就如C/C++反編譯都只到匯編語(yǔ)言級(jí)別,強(qiáng)行反編譯為C/C++代碼,基本上都會(huì)出錯(cuò)!
    
    所以把.dex反編譯成java,僅用于查看,要修改時(shí)直接修改smali,然后重新編譯運(yùn)行(apktool工具把.smali匯編成.dex)

二.Smali語(yǔ)法

①基本數(shù)據(jù)類型

smali類型  java類型
V           void
Z           boolean
B           byte
S           short
C           char
I           int
J           long   64位 需要2個(gè)寄存器存儲(chǔ)
F           float
D           double 64位 需要2個(gè)寄存器存儲(chǔ)

②對(duì)象

smali對(duì)象                   java對(duì)象
Lpackage/name/ObjectName;  package.name.ObjectName
Ljava/lang/String;         java.lang.String

L 表示對(duì)象類型
package/name 表示包名
; 表示結(jié)束

③數(shù)組

smali數(shù)組            java數(shù)組
[I                   int[]    一維數(shù)組
[[I                  int[][]  二維數(shù)組
[Ljava/lang/String   String[] 對(duì)象數(shù)組  

注:每一維最多255個(gè)

④類字段/變量

Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;

smali字段                     java字段
public f1:Z                   public boolean f1;                        
public f2:I                   public int f2;  
public f3:Ljava/lang/String;  public String f3; 
    
1.賦值
靜態(tài)static
    const-string v0, "Hello Smali"
    sput-object v0, Lcom/MyActivity;->name:Ljava/lang/String;
    
    相當(dāng)于java代碼 MyActivity.name = "Hello Smali"
    
非靜態(tài)instance
    .local v0, act:Lcom/MyActivity;
    const/4 v1, 0x2
    iput v1, v0, Lcom/MyActivity;->name:Ljava/lang/String;
    
    相當(dāng)于java代碼 act.name = "Hello Smali"
    
2.取值
靜態(tài)(static fields)       
    sget-object v0, Lcom/MyActivity;->name:Ljava/lang/String;
    
    相當(dāng)于java代碼 v0 = MyActivity.name;
    
非靜態(tài)(instance fields)
    .local v0, act:Lcom/MyActivity;
    iget-object v1, v0 Lcom/MyActivity;->name:Ljava/lang/String;
    
    相當(dāng)于java代碼 v1 = act.name;

⑤類方法/函數(shù)

smali方法           
myMethod([I)Ljava/lang/String;

java方法
String myMethod(int[])

//Java代碼
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
}

#samli代碼
.method protected onCreate(Landroid/os/Bundle;)V  
.locals 1  
.parameter "savedInstanceState"  
.prologue  
.line 8  
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V  
.line 9  
const/high16 v0, 0x7f03  
invoke-virtual {p0, v0}, Lcom/fusijie/helloworld/MainActivity;->setContentView(I)V  
.line 10  
return-void  
.end method
    
#是smali注釋
.method和.end method 類似Java大括號(hào){} 
.locals 指定方法中非參寄存器總數(shù),出現(xiàn)在方法第一行
.registers 指定方法中寄存器總數(shù)
.prologue 表示代碼開始
.line 表示java源碼行號(hào),用于調(diào)試
invoke-static 調(diào)用static方法/函數(shù)
invoke-super 調(diào)用父類方法
invoke-direct 調(diào)用private方法
invoke-virtual 調(diào)用protected或public方法
return-void 表示方法結(jié)束返回void    
p0 在靜態(tài)方法中表示當(dāng)前對(duì)象實(shí)例
p1 表示當(dāng)前onCreate方法參數(shù)
v0 表示本地(局部)變量,存放在locals寄存器
    
move-result 獲取方法返回基本數(shù)據(jù)類型
move-result-object 獲取方法返回對(duì)象     
    const/4 v2, 0x0  
    invoke-virtual {p0, v2}, Lcom/Activity;->getPreferences(I)Landroid/content/SharedPreferences;  
    move-result-object v1  
    v1保存的就是調(diào)用getPreferences(int)方法返回的SharedPreferences實(shí)例
    
    invoke-virtual {v2}, Ljava/lang/String;->length()I  
    move-result v2  
    v2保存的則是調(diào)用String.length()返回的整型

注: Long和Double類型是64位,需要2個(gè)寄存器存儲(chǔ)參數(shù)
    例如:
        myMethod(IJ)V;
        參數(shù)          
        P1     I(int)
        P2,P3  J(long)

⑥條件判斷語(yǔ)句(if)

如果p1和v0相等,則執(zhí)行c1流程
if-eq p1, v0, :c1
:c1
invoke-direct {p0}, Lcom/paul/test/a;->d()V

表示不相等,則執(zhí)行c2流程
if-ne p1, v0, :c2
:c2
invoke-direct {p0}, Lcom/paul/test/a;->c()V

if-gt 大于
if-ge 大于等于
if-lt 小于
if-le 小于等于

簡(jiǎn)書: http://www.itdecent.cn/p/e601b4433d89
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/72973025
GitHub博客:http://lioil.win/2017/06/09/Android_Smali.html
Coding博客:http://c.lioil.win/2017/06/09/Android_Smali.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容