我想添加以下方法调用" send()"一个smali方法:
invoke-direct {p0}, X->send()V
send()是当前类的一种方法。 X是当前类名的通配符。现在我有两个未解决的问题:
为什么invoke-direct需要注册p0?我认为这是一个参数。
我是否考虑过p0寄存器?如果我保留它,这个额外的代码是否有可能使整个应用程序无法编译?如果是这样,我怎样才能找出必须使用哪个寄存器?
我想将此方法调用添加到任意方法。我不知道方法结构,也无法预测任何寄存器的使用情况。因此,我需要确切地知道上层代码中的p0是否可以改变以及在哪些条件下。
我提供了一个简单的例子来强调我的意图:
我们假设我们有这种方法只读取智能手机上保存的联系人:
.method private getContacts()Ljava/util/ArrayList;
.locals 12
.annotation system Ldalvik/annotation/Signature;
value = {
"()",
"Ljava/util/ArrayList",
"<",
"Ljava/lang/String;",
">;"
}
.end annotation
.prologue
const/4 v2, 0x0
.line 43
new-instance v7, Ljava/util/ArrayList;
invoke-direct {v7}, Ljava/util/ArrayList;-><init>()V
.line 44
.local v7, "contacts":Ljava/util/ArrayList;, "Ljava/util/ArrayList<Ljava/lang/String;>;"
invoke-virtual {p0}, Lorg/puellen/contacts/MainActivity;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v0
sget-object v1, Landroid/provider/ContactsContract$Contacts;->CONTENT_URI:Landroid/net/Uri;
move-object v3, v2
move-object v4, v2
move-object v5, v2
...
我编写了一个解析器,它自动从.apk文件中提取此代码。现在我想通过添加上层方法调用来扩展方法功能。
在这种情况下我可以在开头添加电话。唯一的区别出现在第13行(见评论)
.method private getContacts()Ljava/util/ArrayList;
.locals 12
.annotation system Ldalvik/annotation/Signature;
value = {
"()",
"Ljava/util/ArrayList",
"<",
"Ljava/lang/String;",
">;"
}
.end annotation
.prologue
invoke-direct {p0}, Lorg/my_package/custom_class/MainActivity;->send()V # added method call
const/4 v2, 0x0
.line 43
new-instance v7, Ljava/util/ArrayList;
invoke-direct {v7}, Ljava/util/ArrayList;-><init>()V
.line 44
.local v7, "contacts":Ljava/util/ArrayList;, "Ljava/util/ArrayList<Ljava/lang/String;>;"
invoke-virtual {p0}, Lorg/puellen/contacts/MainActivity;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v0
sget-object v1, Landroid/provider/ContactsContract$Contacts;->CONTENT_URI:Landroid/net/Uri;
move-object v3, v2
move-object v4, v2
move-object v5, v2
直到知道我只是在 .prologue 之后添加方法调用。但我确信这种行为并不总是有效。有没有完美的&#34;添加电话的地方?我是否可以在&#34; invoke-direct&#34;中使用 p0 或者我如何找出可以使用的寄存器?
问题:我是否可以在&#34; invoke-direct&#34;中使用 p0 。或者我如何找出可以使用的寄存器?
答案:&#34;非静态方法的第一个参数始终是调用该方法的对象。&#34; (链接见第一评论中的打击)。由于我的方法不是静态的,我总是可以使用p0
现在我只需要知道方法调用的位置。