返回
探索 Runtime 的奥秘:通过 fishhook 揭开 iOS 逆向的面纱
IOS
2024-02-05 19:43:55
使用 fishhook 探索 iOS Runtime 的奥秘
在 iOS 逆向领域,Runtime 是一个至关重要的概念,它为 Objective-C 对象和方法提供底层支持。而 fishhook 则是一个强大的工具,它能让我们通过 Hook 系统函数来修改 Runtime 行为,从而获得深入的洞察。
了解 Runtime
Runtime 是 Objective-C 中负责管理内存布局、对象分配和方法调用的动态库。它提供了一系列方法来创建和操作对象,例如:
objc_msgSend
:向对象发送消息objc_getClass
:获取类的元数据objc_allocateClassPair
:创建新类
fishhook 简介
fishhook 是一个由 Cydia Substrate 维护的库,它允许我们 Hook 系统函数。它通过修改函数的指令指针来实现,从而在函数执行前或执行后插入我们的代码。fishhook 在 iOS 逆向中广泛应用,因为它具有以下优点:
- 可以 Hook 任意系统函数
- 使用相对简单
- 不会影响应用程序稳定性
Hook 系统函数
使用 fishhook Hook 系统函数非常简单,以下是步骤:
- 导入 fishhook 头文件
- 定义 Hook 函数
- 使用
fishhook_rebind_symbols
将 Hook 函数与目标函数关联
#include <fishhook/fishhook.h>
static void my_hook_function() {
// 这里放置我们想要执行的代码
}
int main() {
fishhook_rebind_symbols((struct rebinding[]) {
{ "target_function", my_hook_function },
{ NULL, NULL }
}, 1);
// 这里放置使用目标函数的代码
}
探索 Runtime 的奥秘
有了 Hook 系统函数的能力,我们可以深入探索 Runtime 的奥秘。例如,我们可以 Hook objc_msgSend
函数,以了解哪些方法被调用以及它们的的参数是什么。
static void my_hook_objc_msgSend(objc_msgSendFunc original, id self, SEL selector, ...) {
// 在这里,我们可以打印方法名称和参数
// 调用原始函数继续执行
original(self, selector, ...);
}
int main() {
fishhook_rebind_symbols((struct rebinding[]) {
{ "objc_msgSend", my_hook_objc_msgSend },
{ NULL, NULL }
}, 1);
// 这里放置使用 Objective-C 方法的代码
}
使用 fishhook 进行 iOS 逆向
fishhook 在 iOS 逆向中非常有用。它允许我们:
- 绕过代码签名验证: 通过 Hook
_dyld_get_image_name
函数,我们可以欺骗应用程序使其加载未签名的代码。 - 调试正在运行的应用程序: 通过 Hook
ptrace
函数,我们可以将正在运行的应用程序附加到调试器中。 - 修改函数的返回值: 通过 Hook 函数的返回地址,我们可以修改函数返回的值。
结论
fishhook 是一个功能强大的工具,它使我们能够深入探索 iOS Runtime。通过 Hook 系统函数,我们可以理解应用程序的内部工作原理,绕过安全限制,并进行各种逆向分析。对于 iOS 安全研究员、逆向工程师和开发人员来说,它都是一个必备工具。
常见问题解答
- 什么是 Runtime?
Runtime 是一个负责管理内存布局、对象分配和方法调用的动态库。 - 什么是 fishhook?
fishhook 是一个库,它允许我们通过修改函数的指令指针来 Hook 系统函数。 - 如何使用 fishhook Hook 系统函数?
要 Hook 系统函数,需要导入 fishhook 头文件,定义 Hook 函数,并使用fishhook_rebind_symbols
将 Hook 函数与目标函数关联。 - fishhook 有什么优势?
fishhook 可以在不影响应用程序稳定性的情况下 Hook 任意系统函数。 - fishhook 在 iOS 逆向中有哪些用途?
fishhook 可用于绕过代码签名验证、调试正在运行的应用程序和修改函数的返回值。