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

一.介紹

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

二.Smali語法

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

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

②對象

smali對象                   java對象
Lpackage/name/ObjectName;  package.name.ObjectName
Ljava/lang/String;         java.lang.String

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

③數(shù)組

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

注:每一維最多255個

④類字段/變量

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大括號{} 
.locals 指定方法中非參寄存器總數(shù),出現(xiàn)在方法第一行
.registers 指定方法中寄存器總數(shù)
.prologue 表示代碼開始
.line 表示java源碼行號,用于調(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)前對象實例
p1 表示當(dāng)前onCreate方法參數(shù)
v0 表示本地(局部)變量,存放在locals寄存器
    
move-result 獲取方法返回基本數(shù)據(jù)類型
move-result-object 獲取方法返回對象     
    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實例
    
    invoke-virtual {v2}, Ljava/lang/String;->length()I  
    move-result v2  
    v2保存的則是調(diào)用String.length()返回的整型

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

⑥條件判斷語句(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 小于等于

簡書: http://www.reibang.com/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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灭衷,隨后出現(xiàn)的幾起案子次慢,更是在濱河造成了極大的恐慌,老刑警劉巖翔曲,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迫像,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞳遍,警方通過查閱死者的電腦和手機(jī)闻妓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傅蹂,“玉大人纷闺,你說我怎么就攤上這事》莺” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵氓轰,是天一觀的道長婚夫。 經(jīng)常有香客問我,道長署鸡,這世上最難降的妖魔是什么案糙? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮靴庆,結(jié)果婚禮上时捌,老公的妹妹穿的比我還像新娘。我一直安慰自己炉抒,他們只是感情好奢讨,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焰薄,像睡著了一般拿诸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞茅,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天亩码,我揣著相機(jī)與錄音,去河邊找鬼野瘦。 笑死描沟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吏廉,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蠢络,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迟蜜?” 一聲冷哼從身側(cè)響起刹孔,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娜睛,沒想到半個月后髓霞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡畦戒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年方库,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片障斋。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纵潦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垃环,到底是詐尸還是另有隱情邀层,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布遂庄,位于F島的核電站寥院,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涛目。R本人自食惡果不足惜秸谢,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霹肝。 院中可真熱鬧估蹄,春花似錦、人聲如沸沫换。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苗沧。三九已至刊棕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間待逞,已是汗流浹背甥角。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留识樱,地道東北人嗤无。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓震束,卻偏偏與公主長得像,于是被迫代替她去往敵國和親当犯。 傳聞我的和親對象是個殘疾皇子垢村,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容