使用 Frida 设置当前类中的成员

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)

Rob*_*ert 7

看起来 Frida 中的常见问题是访问字段的方式与 Frida 不同。

\n

Frida 使用 JavaScript 代码,因此无法直接处理非 JavaScript 对象。\n因此它将“本机”对象(在本例中为 Android Java 对象)包装在 JavaScript 对象中。

\n

如果您现在调用 Frida,this.carrier您将获得 Frida JavaScript 包装器,而不是您想要的 Java Carrier 实例。

\n

当然,Frida JavaScript 包装器没有您尝试调用的方法,因此this.carrier.setId(123);总是会失败。

\n

使用 Frida 访问 Java 字段

\n

要访问字段,您始终必须调用.value它来获取实际值:

\n

所以如果你想要this.carrier你必须使用this.carrier.value.

\n

如果与同名方法发生名称冲突,Frida 默认会为该方法分配名称。如果您想访问该字段,请在字段名称的开头添加下划线。\n如果存在名为的方法,carrier您可以通过以下方式访问该字段:this._carrier.value

\n

参考 Frida 帮助页面

\n

Frida 页面上也对此进行了描述,例如此处

\n
\n

请注意,我们使用this.m.value = 0而不是this.m = 0设置字段\xe2\x80\x99s 值。如果这个类中还有一个名为m的方法,我们需要使用它this._m.value = 0来设置字段m的值。一般来说,在查看对象的属性时,需要使用.value这些字段引用的值。

\n
\n

完整简化代码

\n

但在你的情况下,你可以通过使用局部变量来简化一切:

\n
Java.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});\n
Run Code Online (Sandbox Code Playgroud)\n