android Frida SharedPreferences挂钩问题-我如何获得文件名和路径

dpiehjr4  于 2023-04-10  发布在  Android
关注(0)|答案(1)|浏览(149)

我有一个应用程序,我想用Frida分析。该应用程序有超过20个不同的共享首选项XML文件。我正在挂钩共享首选项的put方法,如以下代码片段所示:

var sp = Java.use("android.app.SharedPreferencesImpl$EditorImpl");
sp.putString.implementation = function(var0, var1) {
console.log(var0 + " " + var1 + "\n");
return this.putString(var0, var1);
}

这个类没有类似getPath()或类似的方法。我如何在这个挂钩方法中添加代码,以接收正确的xml文件?当我从 android.content.ContextWrapper 使用 getSharedPreferences 时,它不起作用,因为应用使用了太多的xml文件,我无法分辨所写的信息属于哪里。
我尝试从SharedPreferencesImpl中挂钩变量和方法。我试图获取mfile,它是一个java.io.File对象,但我无法使它从file对象调用getPath()方法。我还尝试在SharedPreferencesImpl中挂钩几个方法,但它不起作用。我也不确定这是否是正确的方法。

tv6aics1

tv6aics11#

您可以简单地获取字符串写入的文件名,并以这种方式应用:

var sp = Java.use("android.app.SharedPreferencesImpl$EditorImpl");
sp.putString.implementation = function (key, value) {
    console.log(`putString("${key}", "${value}")`);

    let outer = this.this$0.value; // SharedPreferencesImpl 
    console.log("pref file: " + outer.mFile.value);

    return this.putString(key, value);
}

如何构建此代码

android.app.SharedPreferencesImpl$EditorImplandroid.app.SharedPreferencesImpl的非静态内部类。这意味着每个$EditorImpl示例都有一个对其外部类SharedPreferencesImpl的引用。
你不会在source code of those classes中看到这个字段,因为它是编译器生成的隐式引用。因此,当编译Java代码时,编译器会向内部类的所有构造函数添加一个参数,并生成一个值,以将该值保存在内部类的一个特殊字段中。
您可以通过执行以下两个命令在frida控制台中获取EditorImpl的所有字段的列表:

var sp = Java.use("android.app.SharedPreferencesImpl$EditorImpl");
sp.class.getDeclaredFields().forEach(f => console.log(f))

您将获得一个字段列表,包括以下字段:

final android.app.SharedPreferencesImpl android.app.SharedPreferencesImpl$EditorImpl.this$0

所以我们现在知道外部类的字段名是this$0-如果我们在putString的Frida hooking代码中,我们可以通过阅读this.this$0.value来获得外部类。
从这里到mFile的值,其中File存储在我们感兴趣的地方,这只是一小步:

this.this$0.value.mFile.value;

相关问题