使用 LD_PRELOAD 替换 Linux 系统调用时出现问题
我正在尝试编写一个程序,允许运行二进制文件,在请求时用另一个文件替换某个文件。 它是一个对系统调用函数进行简单替换的库,与 LD_PRELOAD 一起使用。 问题是它捕获打开以供读取(而是读取替代文件),但写入总是返回到实际的指定文件。 还有其他我应该了解的“开放”系统调用吗?
I am trying to write a program that allows a binary to be run, substituting a certain file when requested with another. It is a library with simple replacements for the system call functions, that is used with LD_PRELOAD. The problem is that it catches opens for reading (the substitute file is read instead), but writes always go back to the actual, specified file. Are there any other "open" system calls I should know about?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
没关系——愚蠢的错误。
没有检查绝对路径和相对路径...
Nevermind -- stupid mistake.
Wasn't checking both absolute and relative paths...
我不确定你的问题的原因是什么,但是在你的程序上使用 strace 可能会给一些洞察力。 它应该是任何正常的 Linux 发行版的一部分。
I am not sure what the cause of your problem is, but using strace on your program might give some insight. It should be part of any sane Linux distribution.
如果它开放供写入,则很可能会通过
creat
函数(我猜测fopen
会将您重定向到那里)。 检查您的fcntl.h
以获得完整列表。If it's open for writing, it's most likely going through the
creat
function (I'm guessingfopen
would be redirecting you there). Check yourfcntl.h
for a complete list.听起来好像您只检查输入文件(您按文件名检查吗?)。 您还需要检查并替换输出文件。
如果您的输出转到标准输出之一,那么您需要在分叉到可执行文件之前关闭并使用输出替代项重新打开它们。
要查找可执行文件发出的所有系统调用,您可以使用 strace。
要查找可执行文件进行的所有库调用,您可以使用 ltrace。
Sounds like you check only for the input file (do you check by filename?). You need to check and substitute the output file, too.
If you output goes to one of the standard outputs, then you need to close and reopen them with your output substitute) before you fork into the executable.
To find all system calls that your executable makes you can use strace.
To find all library calls that your executable makes you can use ltrace.