返回

iOS逆向 - 巧用Logos Hook,精准调试业务逻辑

IOS

前言

在 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 函数,打印出每次打印的内容。

步骤:

  1. 导入 Logos 头文件。
  2. 定义 Hook 函数。
  3. 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

步骤:

  1. 查找 viewDidLoad 方法的偏移量。
  2. 使用偏移量 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 类的指针。

步骤:

  1. 使用 Logos 的 enumerateBytes 函数遍历内存。
  2. 检查每个指针是否指向 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 逆向中如鱼得水。