OS X系统调用的插入



我需要插入(调用我的函数而不是原始函数)一些OSX系统调用来克服一个封闭源代码软件中的缺陷。

优选地,所得到的解决方案将在10.5(Leopard)及更新版本下工作,但如果论点足够有力,I可能需要10.6(Snow Leopad)。

最好,得到的解决方案是一个可执行文件,但我可能会接受一个脚本。

最好,即使在目标应用程序运行之后,最终的解决方案也能够插入("窃取向量"),但我可以接受一种必须在应用程序加载时注入自身的技术。

最好是用C或C++开发得到的解决方案,但我可以接受Objective-C或其他东西。

到目前为止,我已经试验过:

1) DTrace脚本,它教会了我很多,但D语言的局限性(有限的流控制等)使我所做的工作非常痛苦,更不用说结果会是一个脚本,它不像我拍摄的那样整洁和独立。

2) DYLD_INSERT_LIBRARIES插入,在很多方面都很流畅,但可能是由于命名空间扁平化(我不会假装深入理解这意味着什么),它可以很好地对抗更简单的可执行文件,但会使我的目标应用程序窒息,即使我构建了一个实际上不插入任何调用的无所事事的库。

我的最新想法是用mach_star进行实验(https://github.com/rentzsch/mach_star),但我先停在这里,询问Stack Overflow社区,他们总是比我知道的更多…

我接下来应该看看除了mach_star之外的什么吗?

我认为您在mach_star上做出了正确的选择。

如果你真的想了解达尔文链接加载程序是如何工作的,等等,我会花更多的时间在你的DYLD插入问题上。但很明显,你想要的是一个快速的解决方案,而不是深入的学习体验。我怀疑任何人都无法在没有访问你的项目的情况下解决你所面临的问题。所以,这可能是一条死胡同。此外,无论如何,Mach重写和注入都更有趣。

马赫注入的基本原理实际上并没有那么难,但有很多事情你必须做对,其中大多数都没有很好的记录。在你得到在你的系统上有效的东西之前,你会遇到11个错误,然后它对你尝试的下一个函数不起作用,然后它在10.5或10.8上不起作用…mach_star库为你完成了所有这些东西。那么,为什么不使用它呢?

我应该提一下,自从英特尔问世之前,我就没有使用过mach_star。但它看起来仍然在定期更新,对x86_64和10.7以及Xcode 4等进行了更改

最新更新