4

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

最好,得到的解决方案可以在 10.5(Leopard)和更新版本下工作,但如果论点足够强,我可能需要 10.6(Snow Leopard)。

最好是生成的解决方案是一个可执行文件,但我可能会选择一个脚本。

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

最好用 C 或 C++ 开发最终的解决方案,但我可以满足于 Objective-C 或其他东西。

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

1) DTrace脚本,它教会了我很多东西,但是 D 语言的局限性(有限的流量控制等)使它成为我正在做的事情的主要痛苦,更不用说结果将是一个脚本,这不像我所追求的那样整洁和独立。

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

我最新的想法是尝试mach_star ( https://github.com/rentzsch/mach_star ),但我先在这里停下来,询问 Stack Overflow 社区,它总是比我知道的更多......

...接下来我应该看看除了 mach_star 之外的东西吗?

4

1 回答 1

3

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

如果您真的想了解 darwin 链接加载器的工作原理等,我会花更多时间来解决您的 DYLD 插入问题。但显然您正在寻找一种快速的解决方案,而不是一种深入的学习体验。而且我怀疑任何人都能够在无法访问您的项目的情况下找出您遇到的问题。所以,这很可能是一个死胡同。此外,无论如何,马赫覆盖和注入更有趣。

Mach 注入的基础知识实际上并没有那么难,但是有很多事情你必须做对,其中大部分都没有很好的记录。在你得到可以在你的系统上运行的东西之前,你会出错 11 件事,然后它不会在你尝试的下一个函数上运行,然后它不会在 10.5 或 10.8 上运行,并且…… mach_star 库为你包装了所有这些东西。那么,为什么不使用它呢?

我应该提一下,自从英特尔之前的日子以来,我就没有使用过 mach_star。但看起来它仍在定期更新,x86_64 和 10.7 以及 Xcode 4 等都有变化。

于 2012-07-17T20:54:32.367 回答