我需要插入(调用我的函数而不是原始函数)一些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之外的东西吗?
答案 0 :(得分:3)
我认为你在选择mach_star时做出了正确的选择。
如果您真的想了解darwin链接加载器的工作原理等,我会花更多时间来解决您的DYLD插入问题。但显然你正在寻找一个快速的解决方案,而不是一个深入的学习经验。而且我怀疑任何人都能够在没有访问你的项目的情况下找出你遇到的问题。所以,这可能是一个死胡同。此外,马赫超越和注射更有趣。
马赫注射的基础知识实际上并不那么难,但是你必须要做的事情很多,其中大部分都没有很好的记录。在你得到适用于你的系统的东西之前,你会得到11个错误的东西,然后它对你尝试的下一个函数不起作用,然后它将无法在10.5或10.8上运行,并且...... mach_star库为你包装所有这些东西。那么,为什么不使用呢?
我应该提到自从英特尔之前的日子以来我没有使用过mach_star。但看起来它仍在定期更新,包括x86_64和10.7以及Xcode 4等的更改。