返回

鱼钩的使用及其钩原理- iOS逆向

IOS

fishhook 的使用

fishhook 的使用非常简单,只需要以下几个步骤:

  1. 导入fishhook库。
  2. 使用 rebind_symbols() 函数重新绑定符号。
  3. 调用 fishhook_apply() 函数应用更改。

以下是一个使用 fishhook 的示例代码:

#import <fishhook/fishhook.h>

static void my_write(int fd, const void *buf, size_t nbyte) {
  NSLog(@"my_write(%d, %s, %zu)", fd, buf, nbyte);
  // 调用原始的 write 函数
  write(fd, buf, nbyte);
}

int main() {
  // 重新绑定 write 函数
  rebind_symbols((struct rebinding[1]) {
    {"write", my_write},
  }, 1);

  // 应用更改
  fishhook_apply();

  // 调用 write 函数
  write(1, "Hello, world!\n", 13);

  return 0;
}

当您运行这段代码时,您将看到以下输出:

my_write(1, Hello, world!, 13)

这表明 write() 函数已经被成功地重新绑定到了 my_write() 函数。

fishhook 的钩原理

fishhook 通过修改 Mach-O 二进制文件的符号表来实现函数重新绑定。符号表是 Mach-O 文件中的一块数据结构,它包含了所有符号的地址和名称。当程序运行时,符号表会被加载到内存中,以便程序能够找到它所需要的函数。

fishhook 通过修改符号表,将要重新绑定的函数的地址替换成新的函数的地址。这样,当程序调用要重新绑定的函数时,它实际上会调用新的函数。

fishhook 的钩原理非常简单,但它却非常强大。它可以用来重新绑定任何系统静态 C 函数,这使得它成为一种非常有用的逆向工程工具。

fishhook 的示例

fishhook 可以用来实现各种各样的功能,例如:

  • 监控函数调用。
  • 劫持函数调用。
  • 修改函数的返回值。
  • 注入代码。

以下是一些使用 fishhook 的示例:

  • 您可以在 open() 函数中注入代码来记录打开的文件。
  • 您可以在 read() 函数中注入代码来记录读取的文件内容。
  • 您可以在 write() 函数中注入代码来记录写入的文件内容。
  • 您可以在 close() 函数中注入代码来记录关闭的文件。

这些只是 fishhook 的一些示例,您还可以使用 fishhook 来实现更多有趣的功能。

结论

fishhook 是一款非常强大的工具,它可以用来实现各种各样的功能。如果您有兴趣了解 iOS 逆向工程,那么 fishhook 是您必须掌握的工具之一。