【问题标题】:Interposing of OS X system calls插入 OS X 系统调用
【发布时间】:2012-07-16 15:11:46
【问题描述】:

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

最好,最终的解决方案可以在 10.5(豹)和更新版本下工作,但如果参数足够强,我可能能够要求 10.6(雪豹)。

生成的解决方案最好是可执行文件,但我可能会接受脚本。

最好,即使在目标应用程序运行之后,生成的解决方案也能够插入 ("steal the vectors"),但我可以满足于必须在应用程序运行时注入自身的技术正在加载。

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

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

1) DTrace 脚本,它教会了我很多,但 D 语言的局限性(有限的流控制等)我在做什么,更不用说结果将是一个脚本,它不像我正在拍摄的那样整洁和独立。

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

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

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

【问题讨论】:

    标签: macos dtrace function-interposition interposing library-interposition


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你说得对,我正在寻找解决方案而不是教化,尽管学习(通常)很有趣。
    • 我会试试 mach_star。很抱歉,我还没有足够的声望来支持你!
    • 好吧,正如我所说,Mach 注入比 POSIX 级别的链接加载器插入更有趣(如果不那么便携),而且 mach_star 是一个现成的工作示例代码启动源,所以即使如果您主要是在寻找启迪,那么它仍然是一个不错的起点。 :) 无论如何,我认为您可能可以接受您的问题的答案,即使您不能投票,这将提高您的统计数据以及我的统计数据,因此您可能想要这样做。 (老实说,一旦我获得了足够的代表来编辑我的 cmets,我就不再关心获得更多……)
    • 我的开始很糟糕,甚至无法运行 DisposeWindow+Beep 示例。我在想,对于当前的 mach_star 代码库,或者对于像我这样的 OS X 开发新手来说,使用 Xcode 4.3.3 在 Lion 下拍摄 64 位版本可能有点过分。
    • 我可能要到周末才能认真看待它......但我会尽可能地这样做。 (正如我所说,我从 10.3 或 10.4 天开始就没有使用它。)同时,您可能要考虑直接到 mach_star 社区寻求帮助,因为它是一个很小的社区,我不认为Rentzsch 在这里参加……
    猜你喜欢
    • 2012-07-28
    • 2016-01-16
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多