Skip to content

Frida 调用 Kotlin Companion 方法指南

1. 核心问题分析

在 Kotlin 中,companion object 的方法在字节码层面通常不是真正的 static 方法:

  • 类结构:编译器会生成一个名为 MainActivity$Companion 的内部类。
  • 实例:外部类 MainActivity 持有一个名为 Companion 的静态单例字段。
  • 错误原因:直接在类上调用会触发 cannot call instance method without an instance,因为你需要通过那个单例对象来调用。

2. 解决方案

方案 A:通过 Companion 静态字段调用(最推荐)

这是最通用的方式,直接获取外部类持有的单例实例。

javascript
// 1. 获取外部类
var MainActivity = getClassWrapper("com.example.multidex_demo.MainActivity");

// 2. 访问静态单例字段 .value 并调用方法
MainActivity.Companion.value.showToast();

方案 B:使用 Java.choose 搜索实例

如果单例已经存在于内存中,可以直接抓取。

javascript
Java.choose("com.example.multidex_demo.MainActivity$Companion", {
    onMatch: function(instance) {
        console.log("找到实例,正在调用...");
        instance.showToast();
    },
    onComplete: function() {
        console.log("搜索完毕");
    }
});

3. 调试与排查

如果调用失败,请检查真实的字段名称(可能被混淆或自定义):

javascript
var mainKlass = getClassWrapper("com.example.multidex_demo.MainActivity");

// 打印所有字段,找类型为 ...$Companion 的字段名
console.log(mainKlass.class.getDeclaredFields().map(f => f.toString()).join('\n'));

Generated by Frida Assistant