我正在挂接 Frida 中的某个函数,它使用以下代码:
this.carrier.getId()
但是,此时this.Carrier尚未设置,这会导致应用程序崩溃。
所以我正在考虑在类的当前函数中手动设置这个成员。因此,当代码发生时,该运营商就会存在。
问题是我这样做遇到了问题。
到目前为止,这就是我得到的:
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 对象。 因此,它将“本机”对象(在本例中为 Android Java 对象)包装在 JavaScript 对象中。
如果您现在调用 Frida
this.carrier
,您将获得 Frida JavaScript 包装器,而不是您想要的 Java Carrier 实例。
当然,Frida JavaScript 包装器没有您尝试调用的方法,因此
this.carrier.setId(123);
总是会失败。
要访问字段,您始终必须调用
.value
来获取实际值:
所以如果你想要
this.carrier
你必须使用this.carrier.value
。
如果与同名方法发生名称冲突,Frida 默认会为该方法分配名称。如果您想访问该字段,请在字段名称的开头添加下划线。 如果存在名为
carrier
的方法,您可以通过以下方式访问该字段:this._carrier.value
Frida 页面上也对此进行了描述,例如这里:
请注意,我们使用
而不是this.m.value = 0
来设置字段的值。如果这个类中还有一个名为m的方法,我们需要使用this.m = 0
来设置字段m的值。一般来说,在查看对象的属性时,需要使用this._m.value = 0
来访问这些字段引用的值。.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;
};
});