如何使用 Frida 拦截 Swift class 的构造函数?

How do I intercept the constructor for a Swift class using Frida?

我正在尝试使用 Frida 内置的 frida swift 桥接功能来挂钩 Swift class 的构造函数。我是 运行 我的代码,命令是:

frida --no-pause -U -l swift_cooperia.js -f com.example.myapp

swift_cooperia.js 的内容为:

Swift.Interceptor.attach(Swift.classes.hooked_class.init, {
    onEnter: function (args) {
        console.log("obj instantiated");
    }
});

我正在尝试使用 Swift.Interceptor.Attach 函数,但我不太确定第一个参数(我正在尝试挂钩的函数)使用什么。在我见过的拦截器的所有示例中,我 应该 使用类似 Swift.classes.hooked_class.init 的东西(我现在在我的 swift_cooperia.js 文件中正在做的事情) 对于我的第一个参数,但这会引发以下错误:

Error: missing argument
    at T (frida/node_modules/frida-swift-bridge/dist/lib/macho.js:144)
    at F (frida/node_modules/frida-swift-bridge/dist/lib/macho.js:155)
    at <anonymous> (frida/node_modules/frida-swift-bridge/dist/lib/interceptor.js:23)
    at <eval> (/swift_cooperia.js:5)

我也尝试过使用 Swift.classes.hooked_class.init() 但是这个错误是:

TypeError: not a function
    at <eval> (/swift_cooperia.js:1)

我也试过 Swift.classes.hooked_class.init.implementation which errors with:

TypeError: cannot read property 'implementation' of undefined
    at <eval> (/swift_cooperia.js:1)

当我在 frida 会话期间(不在此脚本执行中)使用 Swift.class.hooked_class 查看 class 的 $methods 属性时,我得到以下信息:

"$methods": [
        {
            "address": "0x1008e37b8",
            "type": "Method"
        },
        {
            "address": "0x1008e3b90",
            "type": "Method"
        },
        {
            "address": "0x1008e5998",
            "type": "Method"
        },
        {
            "address": "0x1008e5e30",
            "type": "Method"
        },
        {
            "address": "0x1008e5e50",
            "type": "Method"
        }
    ]

其中没有简单的构造函数或初始化方法。其中一个可能是 init 方法,但我不知道如何嗅出哪个是(如果有的话),然后如何将它用作 Swift 拦截器的第一个参数。 我是 Frida 的新手,如有任何帮助,我们将不胜感激。

Frida Swift 桥梁作者在这里。您尝试挂钩的方法未被符号化,这就是桥无法拦截它的原因,来自 docs:

A major caveat is that the function at target has to have a Swift symbol or either we bail. The symbol is required for the parsing of argument and return types.

不过 API 应该会返回一个更有用的错误,所以我会修复它。

(也可以随意打开一个 issue on GitHub,因为它会在那里得到更好的报道,我偶然发现了这个!)