too*_*ick 1 javascript java android reverse-engineering frida
我正在挂接 Frida 中的某个函数,该函数使用以下代码:
this.carrier.getId()
Run Code Online (Sandbox Code Playgroud)
然而,此时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
};
});
Run Code Online (Sandbox Code Playgroud)
承运人代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
看起来 Frida 中的常见问题是访问字段的方式与 Frida 不同。
\nFrida 使用 JavaScript 代码,因此无法直接处理非 JavaScript 对象。\n因此它将“本机”对象(在本例中为 Android Java 对象)包装在 JavaScript 对象中。
\n如果您现在调用 Frida,this.carrier您将获得 Frida JavaScript 包装器,而不是您想要的 Java Carrier 实例。
当然,Frida JavaScript 包装器没有您尝试调用的方法,因此this.carrier.setId(123);总是会失败。
要访问字段,您始终必须调用.value它来获取实际值:
所以如果你想要this.carrier你必须使用this.carrier.value.
如果与同名方法发生名称冲突,Frida 默认会为该方法分配名称。如果您想访问该字段,请在字段名称的开头添加下划线。\n如果存在名为的方法,carrier您可以通过以下方式访问该字段:this._carrier.value
Frida 页面上也对此进行了描述,例如此处:
\n\n\n请注意,我们使用
\nthis.m.value = 0而不是this.m = 0设置字段\xe2\x80\x99s 值。如果这个类中还有一个名为m的方法,我们需要使用它this._m.value = 0来设置字段m的值。一般来说,在查看对象的属性时,需要使用.value这些字段引用的值。
但在你的情况下,你可以通过使用局部变量来简化一切:
\nJava.perform(function () {\n var SignUpActivity = Java.use(\'com.app.features.authentication.SignUpActivity\');\n SignUpActivity.validatePhoneNumber.implementation = function() {\n \n const Carrier = Java.use("com.app.Carrier");\n const c = Carrier.$new();\n c.setId(123);\n this._carrier.value = c;\n };\n});\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3102 次 |
| 最近记录: |