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引用。