學習smail注入遇到的坑


1.將需要被反編譯的apk包解開之后,找到MainActivity,然后在OnCreate中添加需要加入注入的smail代碼:

Java代碼:

 1 /**
 2      * 獲取Android id
 3      * 
 4      * @param context
 5      * @return
 6      */
 7     public static void getAndroidId(Context context,String appId) {
 8         Log.i("DCLOG", "appid:"+appId+";androidID:"+"" + 
 9                 Secure.getString(context.getContentResolver(), Secure.ANDROID_ID));
10     }

調用的Java代碼:

1 getAndroidId(TestSmail.this, "aaaa");

注入到MainActivity中的smail代碼:

1 const-string v0, "aaaa"
2 invoke-static {p0, v0}, Lcom/dataeye/demo/example/TestSmail;->getAndroidId(Landroid/content/Context;Ljava/lang/String;)V

但是出現了異常:

 

按照提示的意思,應該是期望傳入一個Context,但是我傳入了一個String,可是這是不科學的,因為我完全傳的就是p0,p0本身代表this,確實是Context

 

后來經過Google到

 

果然改一下寄存器的個數就成功了。

注意:上面的.locals 10代表的是這個函數最少要用到的本地寄存器的個數為10 .(其實也就是局部變量的個數)

 

解釋:Dalvik VM與JVM的最大的區別之一就是Dalvik VM是基於寄存器的。

基於寄存器是什么意思呢?也就是說,在smali里的所有操作都必須經過寄存器來進行:

本地寄存器用v開頭數字結尾的符號來表示,如v0、v1、v2、...(本地寄存器沒有限制,理論上是可以任意使用的)

參數寄存器則使用p開頭數字結尾的符號來表示,如p0、p1、p2、...

特別注意的是,p0不一定是函數中的第一個參數,在非static函數中,p0代指“this”,p1表示函數的第一個參數,p2代表函數中的第二個參數…

在static函數中p0才對應第一個參數(因為Java的static方法中沒有this方法)

 

但是如果要在onResume和onPause中添加smail代碼的話:

此時使用了一個寄存器,但是locals卻可以設置為0,原因是因為對於一個非靜態的方法而言,會隱含的使用p0寄存器來當作類的this引用。

 


免責聲明!

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



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