我在Frida中挂接了一个函数,它使用以下代码:
this.carrier.getId()
然而,在这个时间点这个。运营商尚未设置,这将导致应用程序崩溃。
所以我正在考虑在类的当前函数中手动设置此成员。所以当编码发生的时候那个载体就已经存在了。
问题是我这样做遇到了一个问题。
到目前为止我得到的是:
Java.perform(function () {
var SignUpActivity = Java.use('com.app.features.authentication.SignUpActivity');
SignUpActivity.validatePhoneNumber.implementation = function() {
var Carrier = Java.use("com.app.Carrier");
this.carrier = Carrier.$new();
console.log(this.carrier) // This prints "[object Object]"
console.log(this.carrier.setId) // This prints "undefined"
this.carrier.setId(123); // crashes
};
});
承运人代码:
package com.app;
import android.os.Parcel;
import android.os.Parcelable;
public class Carrier implements Parcelable {
private int id;
private String name;
private String officeTerminalAddress;
public Carrier() {
}
protected Carrier(Parcel parcel) {
this.id = parcel.readInt();
this.name = parcel.readString();
this.officeTerminalAddress = parcel.readString();
}
public int getId() {
return this.id;
}
public void setId(int i) {
this.id = i;
}
}
看起来像Frida中常见的问题,在Frida中访问字段的方式不同。
Frida使用JavaScript代码,所以它不能直接处理非JavaScript对象。因此它包含了&;native&;对象(Android Java对象)在JavaScript对象。
如果你现在调用Fridathis.carrier
,你将获得Frida JavaScript包装器,而不是你所瞄准的Java Carrier实例。
当然Frida JavaScript包装器没有你尝试调用的方法,因此this.carrier.setId(123);
总是会失败。
使用Frida访问Java字段
要访问一个字段,您总是必须调用.value
来获得实际值:
所以如果你想要this.carrier
,你必须使用this.carrier.value
。
在与同名方法发生名称冲突的情况下,Frida默认将该名称分配给该方法。如果要访问该字段,请在字段名称的开头添加下划线。如果存在一个名为carrier
的方法,您可以这样访问该字段:this._carrier.value
参考Frida帮助页
这在Frida页面上也有描述,例如:
注意,我们使用
this.m.value = 0
而不是this.m = 0
来设置字段的值。如果在这个类中还有一个叫做m的方法,我们需要使用this._m.value = 0
来设置字段m的值。一般来说,当查看对象的属性时,需要使用.value
来访问这些字段所引用的值。
完整简化代码
但是在你的情况下,你可以通过使用一个局部变量来简化一切:
Java.perform(function () {
var SignUpActivity = Java.use('com.app.features.authentication.SignUpActivity');
SignUpActivity.validatePhoneNumber.implementation = function() {
const Carrier = Java.use("com.app.Carrier");
const c = Carrier.$new();
c.setId(123);
this._carrier.value = c;
};
});