gpt4 book ai didi

ios - mach_override 和 fishhook 之间的技术差异?

转载 作者:可可西里 更新时间:2023-11-01 04:14:18 24 4
gpt4 key购买 nike

今天第一次接触fishhook库https://github.com/facebook/fishhook可用于动态重新绑定(bind) Mach-O 二进制文件中的符号(他们说适用于 iOS,但我猜代码也适用于 OS X)。

到目前为止,我只知道并使用过 mach_override https://github.com/rentzsch/mach_override它旨在实现类似的目标(即用另一个函数替换一个函数的实现),但重写了函数开头的汇编程序语句以跳转到不同的位置。

fishhook 方法看起来简单得多,但由于它“仅”重写了符号表,我直觉认为它不如 mach_override 方法通用。

有人可以就一个项目优先于另一个项目的情况(即一种方法行不通但另一种方法行得通的情况)提供一些硬性技术事实吗?

最佳答案

这两种方法使用不同的方法:

A) 如您所述,fishhook 作用于符号表中的符号。这意味着,如果符号由 dylib 或框架导出,并且您可以修补导入表,则可以将其重定向到您的实现。

B) mach_override 使用 OS X(和 iOS)的 Mach VM API 来修补已经加载的函数——即已经在内存中。它通过对函数实现的开头进行二进制修补以跳转到另一个地址(您的实现)然后跳回来实现。

Fishhook 更稳定,因为它是 (i) 更容易实现的操作和 (ii) 一旦进程被 dyld 加载并且符号被链接后无缝连接。但是,它不适用于可执行文件未直接加载的符号。换句话说,例如,如果您想修补 printf(3),它只会对从您的可执行文件调用 printf 起作用,而不对从 libSystem 或其他库发出的调用起作用。然而,Mach_override 并不是那么稳定,因为它依赖于某些可以被覆盖的函数序言 - 大约 90% 的时间,但不是 100%。

虽然 yiding 关于 iOS 页面是只读的是正确的,但在某些情况下可能可以解决这个问题(如果您修补可执行文件,您还可以修补 LC_SEGMENT 和部分命令),并且您可以使用 mach VM apis取消保护页面(仅当设备越狱时)。

关于ios - mach_override 和 fishhook 之间的技术差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17832031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com