Android逆向不可不知的smali語言

1.smali語言簡介

smali是Dalvik的寄存器語言,smali代碼是安卓apk反編譯而來的,兩者文件是一一對應的,獲取smali需要ApkTool工具。
smali語言比較簡單,如果你會java和Android相關知識,就可以通過修改smali語言來改變java的代碼,進而可以修改apk文件。

2.smali語法

  • 前三行指明瞭類名,父類名,和源文件名。
  • 類名以“L”開頭相信熟悉Jni的童鞋都比較清楚。
  • “#”是smali中的註釋。
  • “.method”和“.end method”類似於Java中的大括號,包含了方法的實現代碼段。
  • 方法的括號後面指明瞭返回類型,這同樣類似與Jni的調用。
  • “.locals”指明瞭這個方法用到的寄存器數量,當然寄存器可以重複利用,從“V0”起算。
  • “.prologue”指定了代碼開始處。
  • “.line”表明這是在java源碼中的第幾行,其實這個值無所謂是多少,可以任意修改,主要用於調試。
  • “invoke-direct”這是對方法的調用,可以看到這裏調用了是Android.app.Activity的init方法,這在java裏是隱式調用的。
  • “return-void”表明了返回類型,這和java不一樣,即使沒有返回值,也需要這樣寫。
  • 接下來是onCreate方法,“.parameter”指明瞭參數名,但是一般沒有用,需要注意的是p0代表的是this,p1開始代表函數參數,靜態函數沒有this,所以從p0開始就代表參數。
  • 在實現裏先是調用了父類的方法,然後再調用setContentView,注意這裏給了一個傳參。整形的傳參,這個值是先賦給寄存器v0,然後再調用的使用傳遞進去的。smali中都是這麼使用,所有的值必須通過寄存器來中轉。這點和彙編很像。
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;])V

個人總結

smali比java複雜很多,但是不難,相當於把java語言中更多的信息給還原出來,同時顯式地指定了很多細節。

Dalvik虛擬機

Android4.4系統是個分水嶺,ART模式很多機制是和Dalvik。
Dalvik是心臟,
寄存器,內存,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章