如何为嵌套类函数编写 Frida 钩子?

use*_*658 2 android frida

安卓 v 6.0.1

弗里达 v 12.2.19

我是 Frida 的新手,不知道如何解决这个问题。我的目标函数是在路径 com -> appname -> 文件夹 -> xyz.class

在 xyz.class 中,类是这样嵌套的:

public abstract class abc
{
    public string dosomething()
    {
        StringBuilder localStringBuilder = new StringBuilder();
        localStringBuilder.append(getClass().getSimpleName());
        localStringBuilder.append("Value 1=");
        localStringBuilder.append(this.value1);
        localStringBuilder.append("Value 2=");
        localStringBuilder.append(this.value2);
        return localStringBuilder.dosomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

我写了这个钩子来尝试将 value1 和 value2 打印到控制台。

custom_script.js:

setImmediate(function() {
console.log("[*] Starting script");

    Java.perform(function () {
        var Activity = Java.use("com.appname.folder.xyz$");
        Activity.dosomething.overload().implementation = function () {
            var datastring = localStringBuilder.dosomething();
            console.log(datastring);
            return datastring;
        };
    });

})
Run Code Online (Sandbox Code Playgroud)

我不确定如何在 Java.use() 函数中定义路径,是否需要放置 xyz.class 或 xyz$ 或 xyz.class.abc$。

Error: java.lang.ClassNotFoundException: Didn't find class "com.appname.folder.xyz$" on path... etc.
Run Code Online (Sandbox Code Playgroud)

如果我将路径指定为 com.appname.folder.xyz.class.abc$,我只会收到“进程终止”错误。

我在终端上使用的 Frida 命令是

frida -U -f com.appname -l custom_script.js --no-pause
Run Code Online (Sandbox Code Playgroud)

我的脚本出了什么问题?

编辑:在标题中添加了单词

Rob*_*ert 5

类名永远不会以$. 之后有一个匿名内部类的编号或abc您的案例中的内部类的名称。

因此类名是最有可能的com.appname.folder.xyz$abc

然而,有时类名会出乎意料地不同。在这种情况下,列出 Frida 已知的所有类名并过滤某个包是有意义的:

Java.enumerateLoadedClasses({
    onMatch: function(className) {
        if (className.startsWith("com.appname.folder.xyz")) {
            console.log(className);
        }
    },
    onComplete: function() {}
});  
Run Code Online (Sandbox Code Playgroud)

它打印下面的类列表com.appname.folder.xyz。只需看看它并选择正确的。