程序监控程序的读/写路径?

时间:2011-04-02 13:30:20

标签: c++ io ptrace

我正在尝试为大学项目制作一个程序,但我对此感到困惑:

如何监控程序写入或读取的文件? 我希望得到他们的路径名称。

为了使问题更加清晰,以下是一个例子:

考虑我们希望监视的程序是a.exe,并且a.exe首先打开一个名为“a1”的文件,该文件与a.exe位于同一文件夹中,然后打开另一个名为“a2”的文件。

程序必须给出“a1”和“a2”文件的相对或绝对路径,而不管它们是否被打开进行读/写..

如何在C ++中实现它?

编辑:是否可以将a1和a2文件的调用转移到另一个路径? EDIT2:好的,让我这样说吧:我已经将firefox.exe从C:\ program files移动到D:\,现在当我运行firefox.exe它不会工作因为它适用于C中的许多文件:\ program files,firefox.exe将使用相对路径来访问文件。我打算做的是捕获firefox.exe工作的文件的调用,然后将调用定向到程序文件文件夹。如果我已经说清楚了,请告诉我。

2 个答案:

答案 0 :(得分:1)

在linux上,您可以使用'strace'输出应用程序执行的不同系统调用。如果你需要实现一个与strace输出相同类型的输出的程序,快速实现可以包含一个简单的shell程序,它会影响strace的输出。否则,查看strace代码是一个良好的开端。

在Windows上,来自Sysinternals套件的“进程监视器”可能会帮助您。

答案 1 :(得分:0)

如果您想修改 open(2)creat(2)truncate(2)等参数,那么您可以使用Linux {{3}在执行调用之前拦截系统调用并替换文件名字符串。

ptrace(2)是黑魔法,所以除非它是高级课程,否则它可能不是你教授的意图。 (如果下一个讲座是关于编写像gdb(1)这样的调试器,那么这完全是教授的意图。)

您可以使用的另一种机制,可能更便携,是库或函数ptrace(2) - 您可以在库中的特定函数周围编写小包装器,并通过使用LD_PRELOAD加载库环境变量(有关影响库加载的环境变量的详细信息,请参阅ld.so(8)联机帮助页),将调用您的函数而不是标准函数。

图书馆介入是灰色魔法;它的记录比ptrace(2)更好,但仍然很容易搞砸。