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

Posted

技术标签:

【中文标题】使用 Frida 在当前类中设置成员【英文标题】:Setting a member in current class using Frida 【发布时间】:2021-12-08 14:49:47 【问题描述】:

我在 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;
    


【问题讨论】:

【参考方案1】:

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

Frid​​a 使用 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 还是方法载体。

结论如果您想使用 Frida 在 Android 应用程序中访问 Java 类实例的字段,推荐的方式是

this._carrier.value

所以要写一个字段值,你应该调用

this._carrier.value = ...

阅读方式也一样。

参考 Frida 帮助页面

Frid​​a 页面上也对此进行了描述,例如here:

请注意,我们使用 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;
    ;
);

【讨论】:

以上是关于使用 Frida 在当前类中设置成员的主要内容,如果未能解决你的问题,请参考以下文章

如何在类外设置结构值?

如何在restful控制器的返回对象中设置成员变量[重复]

成员函数指针作为构造函数参数

如何在 DatePicker 中设置当前日期?

如何通过函数在 C++ 中设置私有静态数组?

如何在 DecisionTreeClassifier 中设置类权重以进行多类设置