1.将需要被反编译的apk包解开之后,找到MainActivity,然后在OnCreate中添加需要加入注入的smail代码:
Java代码:
/**
* 获取Android id
*
* @param context
* @return
*/
public static void getAndroidId(Context context,String appId) {
Log.i("DCLOG", "appid:"+appId+";androidID:"+"" +
Secure.getString(context.getContentResolver(), Secure.ANDROID_ID));
}
调用的Java代码:
getAndroidId(TestSmail.this, "aaaa");
注入到MainActivity中的smail代码:
const-string v0, "aaaa"
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引用。