在Windows上有一些库允许您拦截对DLL的调用:
http://www.codeproject.com/kb/system/hooksys.aspx
可以在Mac OS上执行此操作吗?如果是这样,它是如何完成的?
答案 0 :(得分:23)
答案取决于您是想在自己的应用程序中还是在系统范围内执行此操作。在您自己的应用程序中,它非常简单;动态链接器提供DYLD_INSERT_LIBRARIES
等功能。如果您是为调试/检测目的而做的,也请查看DTrace。
您可以使用方法调配替换Objective-C方法实现,例如JRSwizzle或Apple的method_exchangeImplementations
(10.5 +)。
如果要在系统范围内修改库行为,则需要加载到其他进程的地址空间。
mach_inject/mach_override
是一组开源的库,分别用于加载代码和替换函数实现;但是,您负责编写自己的使用库的应用程序。 (另外,请查看this answer;您需要特殊权限才能将代码注入其他进程。)请注意,Apple不强烈建议不要进行非调试用途的应用程序修补/代码注入,而且一些Mac用户(和开发人员)对此做法非常挑剔。这些批评很多都没有得到充分的了解,但是有很多合法写得不好的“插件”(特别是修补Safari的插件)与应用程序崩溃和问题有关。代码防守。
(免责声明:我是(免费)APE模块的作者和使用mach_inject
的应用程序。)