Frida Hook SharedPreferences问题:如何获取对应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
相关产品推荐
相关产品推荐

