有没有办法监视和重定向线程或进程的文件访问?
例如,一个线程想要读取 /etc/mysql/my.cnf 并且我想更改对 ~/my.cnf 的访问权限,或者如果我运行touch /etc/test.config
我希望将文件重定向到~/somefolder/etc/test.config
.
我正在寻找适用于 Linux/Unix 的 C、C++ 库。
提前致谢
有没有办法监视和重定向线程或进程的文件访问?
例如,一个线程想要读取 /etc/mysql/my.cnf 并且我想更改对 ~/my.cnf 的访问权限,或者如果我运行touch /etc/test.config
我希望将文件重定向到~/somefolder/etc/test.config
.
我正在寻找适用于 Linux/Unix 的 C、C++ 库。
提前致谢
您可以编写一个在程序开始运行时预加载的共享对象。在 .so 中,您将重新定义 libc 函数open()
。当调用者(被愚弄的程序)作为参数传递 string/etc/mysql/my.cnf
时,您将打开~/my.cnf
并返回打开的文件描述符。来电者不知道有什么区别。
您的共享对象当然需要调用“真实”open()
来打开文件句柄;您可以使用dlsym()
.
这似乎过于复杂,但实际上并非如此,它就像一个魅力。我曾多次使用它来欺骗我没有源代码的程序;它就像发条一样工作。
如果您想查看概念证明,请查看我写的博客。快乐编码!
在 linux 中,您可以使用绑定挂载将目录或文件映射到另一个路径,并使用每个进程挂载命名空间来为特定应用程序执行此操作。
看到这个问题。
示例 1:使用根
$ proot -b ~/alternate_hosts:/etc/hosts
# echo '1.2.3.4 google.com' > /etc/hosts
# resolveip google.com
# IP address of google.com is 1.2.3.4
示例 2:使用unshare(1)
$ unshare -m
# touch foo bar
# mount -o bind foo bar
# echo hello > foo
# cat bar
hello
示例 3:使用unshare(2)
见这篇文章:http ://glandium.org/blog/?p=217 。