使用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
相关产品推荐
相关产品推荐

