smali函數分析


一.函數調用

  • smali中的函數和成員變量也分為兩種,分別為 direct 和 virtual

兩者的區別

  1.direct method 是指private函數

  2.virtual method 是指 protected和 public 函數

  3.所以在調用函數時,有invoke-direct,invoke-virtual,另外還有invoke-static、invoke-super以及invoke-interface等幾種不同的指令。

  4.當然其實還有invoke-XXX/range 指令的,這是參數多於4個的時候調用的指令,比較少見

1.invoke-static

  • 用於調用static函數

  例如:

    invoke-static {}, Lcom/aaa;->CheckSignature()Z

  注意:invoke-static后面有一對大括號“{}”,其實是調用該方法的實例+參數列表,由於這個方法既不需參數也是static的,所以{}內為空

  例如:

    const-string v0, "NDKLIB"

    invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

  這個是調用static void System.loadLibrary(String)來加載NDK編譯的so庫用的方法

2.invoke-super

  • 調用父類方法用的指令,一般用於調用onCreate、onDestroy等方法。

3.invoke-direct

  • 調用private函數:

  例如:

    invoke-direct {p0}, Landroid/app/TabActivity;-><init>()V

    這里init()就是定義在TabActivity中的一個private函數

4.invoke-virtual

  • 用於調用protected或public函數,同樣注意修改smali時不要錯用invoke-direct或invoke-static

5.invoke-xxxxx/range

  • 當方法的參數多於5個時(含5個),不能直接使用以上的指令,而是在后面加上“/range”,range表示范圍,使用方法也有所不同

二.函數的返回結果

在Java代碼中調用函數和返回函數結果可以用一條語句完成,而在Smali里則需要分開來完成,在使用上述指令后,如果調用的函數返回非void,那么還需要用到move-result(返回基本數據類型)和move-result-object(返回對象)指令:

  const-string v0, "Eric"

  invoke-static {v0}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;

  move-result-object v2

   v2保存的就是調用t方法返回的String字符串


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM