使用 Frida 设置当前班级的成员

问题描述 投票:0回答:1

我正在挂接 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;
    }

}
javascript java android reverse-engineering frida
1个回答
6
投票

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

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

如果您现在调用 Frida

this.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;
    };
});
© www.soinside.com 2019 - 2024. All rights reserved.