smali的檔案語法格式
阿新 • • 發佈:2018-12-21
無論是普通類、抽象類、介面類或者內部類,在反編譯出來的程式碼中,他們都以單獨的smali檔案來存放。
一、smali檔案的頭3行描述了當前類的一些資訊,格式如下:
.class <訪問許可權>[修飾關鍵字]<類名>
.super <父類名>
.source <原始檔名>
類名開頭的L是遵循Dalvik位元組碼的相關約定,表示後面跟隨的字串為一個類,經過混淆的dex檔案,反編譯出來的smali程式碼可能沒有原始檔資訊,因此,.source行可能為空。
二、smali檔案中,欄位的宣告使用“.field”指令
- 靜態欄位格式:
#static fields
.field <訪問許可權> static[修飾關鍵字]<欄位名>:<欄位型別>
- 例項欄位格式:
#instance fields
.field <訪問許可權> static[修飾關鍵字]<欄位名>:<欄位型別>
三、smail檔案中,方法的宣告使用“.method”指令,方法有直接方法與虛方法。
- 直接方法宣告格式:
#direct methods .method <訪問許可權>[修飾關鍵字]<方法原型> <.locals> //置頂了使用的區域性變數的個數 [.parameter] //多個引數則有多個[.parameter] [.prologue] //指定了程式碼的開始處,混淆過的程式碼可能去掉了該指令 [.lime] //置頂了該處指令在原始碼中的行號,混淆過的程式碼可能去除了行號 <程式碼體> .end method
- 虛方法的宣告格式:
#virtual methods
.method <訪問許可權>[修飾關鍵字]<方法原型>
<.locals> //置頂了使用的區域性變數的個數
[.parameter] //多個引數則有多個[.parameter]
[.prologue] //指定了程式碼的開始處,混淆過的程式碼可能去掉了該指令
[.lime] //置頂了該處指令在原始碼中的行號,混淆過的程式碼可能去除了行號
<程式碼體>
.end method
四、如果類實現了介面,在smali檔案中使用“.implements”,格式如下:
#interfaces .implements <介面名>
五、如果類使用了註解,在smali檔案中使用“.annotation”,格式如下:
#annotations
.annotatiion[註解屬性]<註解類名>
[註解欄位 = 值]
.end annotation
註解的作用範圍可以是類、方法或欄位。如果註解的作用方位是類,“.annotation”指令會直接定義在檔案中,如果是方法或欄位,“.annotation”指令則包含在方法或欄位定義中。