逆向工程smali代码的Frida调用函数Android

问题描述

我想通过 frida 在 apk 中调用一个函数,同时只有反编译的 smali 代码代码如下所示:

b.smali

.class public final Lcom/company/a/b;
.super Ljava/lang/Object;
.source ""

# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lcom/company/a/b$c;
    }
.end annotation

.annotation runtime Lkotlin/Metadata;
[...]
    d2 = {
        "Lcom/company/a/b;",[...]
        "f",[...]
    }
[...]
.end annotation


# static fields
[...]

.field public static final f:Lcom/company/a/b$c;

b$c.smali

.class public final Lcom/company/a/b$c;
.super Ljava/lang/Object;
.source ""


# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
    value = Lcom/company/a/b;
.end annotation

.annotation system Ldalvik/annotation/InnerClass;
    accessFlags = 0x19
    name = "c"
.end annotation

.annotation runtime Lkotlin/Metadata;
[...]
    d2 = {
        "Lcom/company/a/b$c;",[...]
        "cp2",[...]
    }
.end annotation

# direct methods
[...]

.method public final cp2()V
    .locals 2
    .annotation build Landroidx/annotation/Keep;
    .end annotation

    [...]

    return-void
.end method

这里我想从对象 f 调用函数 cp2()。我该怎么做呢? 我传递给 frida 的 .js 文件包含:

Java.perform(function(){
    var class = Java.use("com.company.a.b");
    class.f.cp2();
});

但它返回给我:

* 无法调用

甚至可以在 frida 中调用对象的函数吗?

解决方法

您的代码有两个问题:

  1. 方法 cp2 不是类 com.company.a.b 的成员,而是它的内部类 com.company.a.b$c

因此您需要以下类参考:

var class = Java.use("com.company.a.b$c");
  1. 第二个问题是方法 cp2 不是静态方法,这使得调用它有点复杂,因为您不能只在类上调用它。 相反,您需要引用类 com.company.a.b$c 的现有实例。

由于发布的代码不包含 com.company.a.b$c 的构造函数,我不知道如何创建 com.company.a.b$c 的实例。

一个简单的解决方法是搜索一个被调用的方法,该方法将 com.company.a.b$c 的实例作为参数并挂钩该方法。在钩子内部,您将拥有一个可以调用 cp2 的实例。