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

 

posted @ 2016-04-08 17:03  TwoFish  阅读(1983)  评论(0编辑  收藏  举报