问题描述
我想通过 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();
});
但它返回给我:
* 无法调用
解决方法
您的代码有两个问题:
- 方法
cp2
不是类com.company.a.b
的成员,而是它的内部类com.company.a.b$c
。
因此您需要以下类参考:
var class = Java.use("com.company.a.b$c");
- 第二个问题是方法
cp2
不是静态方法,这使得调用它有点复杂,因为您不能只在类上调用它。 相反,您需要引用类com.company.a.b$c
的现有实例。
由于发布的代码不包含 com.company.a.b$c
的构造函数,我不知道如何创建 com.company.a.b$c
的实例。
一个简单的解决方法是搜索一个被调用的方法,该方法将 com.company.a.b$c
的实例作为参数并挂钩该方法。在钩子内部,您将拥有一个可以调用 cp2
的实例。