OSX / Unix特定于进程的链接

时间:2016-09-14 03:58:57

标签: macos unix command-line-interface

我希望能够运行一个过程,它“识别”一个不存在的符号链接。 (不是真正的链接,而是对目录的所有读/写都被重定向到另一个目录,从命令行运行的一个特定进程)

例如,使用〜/ Library / Internet \ Plug-Ins到〜/ Desktop / SafariPlugins的链接运行safari(/Applications/Safari.app/Contents/MacOS/Safari),因此它从〜/ Desktop加载插件/ SafariPlugins而不是第一个路径,但所有其他程序(Firefox ...)仍然能够访问〜/ Library / Internet \ Plug-ins /并且无法识别符号链接。

我还希望在其他几个实例中实现它,因此它不需要特定于Web浏览器和插件。

我希望这可以通过命令行发生,如果有必要,我有超级用户访问权限,但我认为没有理由这样做。

1 个答案:

答案 0 :(得分:1)

去过那里,做到了,发现了什么令人头痛。

基本上你要编写的是open()的系统调用包装器,如果给定一个路径将其转换为另一个路径。

我提交此问题本质上很难。 LD_PRELOAD是您加载包装器的朋友。通常在这样的包装器中我直接调用系统调用但你可能会遇到困难(gcc有时会内联它们 - 这也可能是你的撤销)。

编写这个东西的过程本质上就像编写一个基于libc的rootkit。我特别提到了这个概念,因为它有很好的文档记录,而且这项技术的记录很少。否则我只知道Valgrind和演示示例。您必须覆盖操作应用程序将要使用的文件名的所有系统调用,包括open(),creat(),rename(),unlink(),link(),symlink()和stat()。如果您的平台在加载libc时不应用LD_PRELOAD覆盖,则还必须点击fopen(),opendir(),rename()和其他一些。这很快就会痛苦。