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