在smali代码中插入方法调用

时间:2014-11-27 11:40:29

标签: android smali

我想添加以下方法调用" send()"一个smali方法:

invoke-direct {p0}, X->send()V

send()是当前类的一种方法。 X是当前类名的通配符。现在我有两个未解决的问题:

  1. 为什么invoke-direct需要注册p0?我认为这是一个参数。

  2. 我是否考虑过p0寄存器?如果我保留它,这个额外的代码是否有可能使整个应用程序无法编译?如果是这样,我怎样才能找出必须使用哪个寄存器?

  3. 我想将此方法调用添加到任意方法。我不知道方法结构,也无法预测任何寄存器的使用情况。因此,我需要确切地知道上层代码中的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

    现在我只需要知道方法调用的位置。

0 个答案:

没有答案