返回
iOS逆向 - 巧用Logos Hook,精准调试业务逻辑
IOS
2023-10-14 06:57:02
前言
在 iOS 逆向中,Hook 技术是不可或缺的一环,它允许逆向工程师在不修改原始代码的情况下,修改函数的行为。传统的方法需要一个个手动 Hook,不仅繁琐,而且容易出错。Logos 框架的出现,为逆向工程师提供了更加优雅、高效的 Hook 解决方案。
Logos 框架简介
Logos 框架是一个开源的 iOS Hook 框架,基于 fishHook 实现。它提供了简单易用的 API,允许逆向工程师轻松地 Hook 函数。Logos 的主要特点包括:
- 轻量级和非侵入性: Logos 仅修改函数的指针,不会修改原始代码。
- 高度自动化: Logos 提供了自动化的 Hook 过程,无需手动编写汇编代码。
- 支持多种 Hook 类型: Logos 支持前置 Hook、后置 Hook 和替换 Hook。
使用 Logos Hook
安装 Logos
通过 CocoaPods 安装 Logos:
pod 'Logos'
Hook 函数
使用 Logos Hook 函数非常简单,只需要调用以下方法:
[Logos hookFunction:targetFunction withBlock:hookBlock];
其中:
targetFunction
是要 Hook 的函数。hookBlock
是 Hook 函数的实现。
Hook 类型
Logos 支持三种 Hook 类型:
- 前置 Hook: 在目标函数执行前调用 Hook 函数。
- 后置 Hook: 在目标函数执行后调用 Hook 函数。
- 替换 Hook: 直接替换目标函数,完全控制函数的执行。
真实案例:Hook 系统函数
需求: Hook printf
函数,打印出每次打印的内容。
步骤:
- 导入 Logos 头文件。
- 定义 Hook 函数。
- Hook
printf
函数。
#import <Logos/Logos.h>
void myHookPrintf(const char *format, ...) {
va_list args;
va_start(args, format);
char buffer[1024];
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
printf("Hooked printf: %s", buffer);
}
int main() {
[Logos hookFunction:printf withBlock:myHookPrintf];
printf("Hello, world!\n");
return 0;
}
偏移 Hook
有时候,目标函数的地址可能未知。Logos 提供了偏移 Hook,允许逆向工程师通过偏移量来 Hook 函数。
需求: Hook UIViewController
类的方法 viewDidLoad
。
步骤:
- 查找
viewDidLoad
方法的偏移量。 - 使用偏移量 Hook
viewDidLoad
方法。
// 查找 viewDidLoad 方法的偏移量
unsigned int offset = 0;
Dl_info info;
dladdr((void *)[UIViewController class], &info);
offset = (unsigned int)info.dli_saddr - (unsigned int)info.dli_fbase;
// 使用偏移量 Hook viewDidLoad 方法
[Logos hookOffset:offset withBlock:^(void *target, void *returnAddress) {
// Hook 逻辑
}];
内存查找
Logos 还提供了内存查找功能,可以帮助逆向工程师在内存中查找特定的值或模式。
需求: 查找内存中所有指向 UIViewController
类的指针。
步骤:
- 使用 Logos 的
enumerateBytes
函数遍历内存。 - 检查每个指针是否指向
UIViewController
类。
// 遍历内存
[Logos enumerateBytesFrom:0 to:MAX_UINT64 withBlock:^(void *address, void *context) {
// 检查指针
if (*((__unsafe_unretained id *)address) == [UIViewController class]) {
// 找到指针,存储或处理
}
}];
总结
Logos 框架为 iOS 逆向工程师提供了强大而优雅的 Hook 功能。它简化了 Hook 过程,支持多种 Hook 类型,并且提供了偏移 Hook 和内存查找等高级功能。掌握 Logos,可以极大地提高逆向工程师调试业务逻辑的效率和准确性。
本文从 Logos 框架简介到实际应用,深入浅出地介绍了 Logos Hook 的原理和用法。通过真实案例和示例代码,相信读者能够快速掌握这一利器,在 iOS 逆向中如鱼得水。