是否可以在Mac OS上挂钩API调用?

问题描述 投票:16回答:1

在Windows上有一些库允许您拦截对DLL的调用:

http://www.codeproject.com/kb/system/hooksys.aspx

可以在Mac OS上执行此操作吗?如果是这样,它是如何完成的?

macos
1个回答
23
投票

答案取决于您是想在自己的应用程序中还是在系统范围内执行此操作。在您自己的应用程序中,它非常简单;动态链接器提供DYLD_INSERT_LIBRARIES等功能。如果您正在进行调试/检测,请查看DTrace。

您可以使用方法调配替换Objective-C方法实现,例如JRSwizzle或Apple的method_exchangeImplementations(10.5+)。

如果要在系统范围内修改库行为,则需要加载到其他进程的地址空间。

  • 最初设计用于其他目的的两种加载机制(input managersscripting additions)通常被滥用于此目的,但我不会真正推荐它们。
  • mach_inject/mach_override是一个开源的库集,分别用于加载代码和替换函数实现;但是,您负责编写自己的使用库的应用程序。 (另外,请查看this answer;您需要特殊权限才能将代码注入其他进程。)

请记住,Apple强烈建议不要进行非调试用途的应用程序修补/代码注入,并且一些Mac用户(和开发人员)对此做法非常挑剔。这些批评很多都没有得到充分的了解,但是有很多合法写得不好的“插件”(特别是修补Safari的插件)与应用程序崩溃和问题有关。代码防守。

(免责声明:我是(免费)APE模块的作者和使用mach_inject的应用程序。)

© www.soinside.com 2019 - 2024. All rights reserved.