You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frida Hook SharedPreferences问题:如何获取对应XML文件路径与文件名

解决Frida Hook SharedPreferences Editor时获取对应XML文件路径的问题

直接通过EditorImpl内部持有的外部类实例,就能拿到对应的SP文件路径,以下是可行的Hook代码:

// 先获取SharedPreferencesImpl和它的内部类EditorImpl
var SharedPreferencesImpl = Java.use("android.app.SharedPreferencesImpl");
var EditorImpl = Java.use("android.app.SharedPreferencesImpl$EditorImpl");

EditorImpl.putString.implementation = function(key, value) {
    // 从EditorImpl实例中获取外部类SharedPreferencesImpl的引用
    // 大部分Android版本中,这个字段名为mSharedPreferences
    var spInstance = this.mSharedPreferences.value;
    // 转成SharedPreferencesImpl类型(可选,但能避免类型问题)
    var spImpl = Java.cast(spInstance, SharedPreferencesImpl);
    // 获取SP对应的File对象并拿到路径
    var spFilePath = spImpl.mFile.value.getPath();

    // 打印信息
    console.log(`[SP文件路径] ${spFilePath}`);
    console.log(`[写入内容] 键: ${key},值: ${value}\n`);

    // 调用原方法,不影响原有逻辑
    return this.putString(key, value);
};

可能的适配调整

如果遇到mSharedPreferences字段不存在的情况(不同Android版本可能有字段名差异),可以先运行以下脚本枚举EditorImpl的所有字段,找到指向SharedPreferencesImpl的字段:

Java.enumerateLoadedClasses({
    onMatch: function(className) {
        if (className === "android.app.SharedPreferencesImpl$EditorImpl") {
            var cls = Java.use(className);
            console.log("=== EditorImpl 所有字段 ===");
            cls.class.getDeclaredFields().forEach(function(field) {
                console.log(`${field.getName()} -> ${field.getType().getName()}`);
            });
        }
    },
    onComplete: function() {}
});

比如某些版本可能字段名为mSp,把代码里的this.mSharedPreferences.value替换成this.mSp.value即可。

为什么之前获取mFile失败?

你之前的问题大概率是没正确拿到EditorImpl对应的外部SharedPreferencesImpl实例,或者在Frida中访问字段时没加.value(Frida中访问对象的成员字段必须通过.value获取实际值)。

内容的提问来源于stack exchange,提问作者Christian8675

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:25:16