如何使用 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,因为它会在那里得到更好的报道,我偶然发现了这个!)
我正在尝试使用 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,因为它会在那里得到更好的报道,我偶然发现了这个!)