You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Frida为当前类成员赋值后调用其方法提示未定义如何解决

问题根因

你遇到的问题是Frida操作Java对象成员字段的规则使用错误:

  • Frida中访问Java对象的成员字段时,this.carrier拿到的是字段的Frida包装对象,不是字段实际存储的值,要读写Java层的字段值必须通过.value属性
  • 直接执行this.carrier = Carrier.$new()的操作,本质是给当前JS代理对象新增了一个名为carrier的普通JS属性,完全没有修改Java层SignUpActivity实例的carrier成员字段,后续访问方法异常就是该错误操作导致的。

修复代码

Java.perform(function () {
    var SignUpActivity = Java.use('com.app.features.authentication.SignUpActivity');
    // 提前加载Carrier类,不要放在Hook方法内部重复加载
    var Carrier = Java.use("com.app.Carrier");
    SignUpActivity.validatePhoneNumber.implementation = function() {
        // 1. 实例化Carrier对象
        var carrierInstance = Carrier.$new();
        // 2. 调用setId赋值
        carrierInstance.setId(123);
        // 可选:验证赋值是否正常
        console.log("Carrier实例ID: " + carrierInstance.getId());
        // 3. 通过.value属性给Java层的carrier成员字段赋值
        this.carrier.value = carrierInstance;
        
        // 执行原方法的原有逻辑,不可省略
        return this.validatePhoneNumber.apply(this, arguments);
    };
});

异常排查

如果修改后还是出现方法找不到的问题,可以按以下步骤排查:

  • 确认com.app.Carrier的包名路径完全正确,没有拼写错误
  • 打印Carrier类的所有方法确认setId存在,若应用开启了混淆,方法名可能会被修改为a、b之类的短名称:
    Carrier.methods.forEach(method => console.log(method.toString()))
    
  • 确认SignUpActivity中的carrier字段名没有被混淆,类型确实是com.app.Carrier

内容的提问来源于stack exchange,提问作者toothpick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:06:01