1

我试图为一个大学项目制作一个程序,但我陷入了困境:

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

为了让问题更清楚,这里有一个例子:

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

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

如何在 C++ 中实现它?

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

4

2 回答 2

1

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

在 Sysinternals 套件的 Windows '进程监视器' 上可以帮助你。

于 2011-04-02T13:53:40.877 回答
0

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

ptrace(2)是黑魔法,所以除非它是一门高级课程,否则它可能不是你教授的意图。(如果下一节课是关于编写类似的调试器gdb(1),那么这正是您的教授想要的。)

您可以使用的另一种机制(可能更便于移植)是库或函数插入——您可以围绕库中的特定函数编写小包装器,并使用LD_PRELOAD环境变量加载库(有关环境变量的详细信息,请参见ld.so(8)手册页影响库加载),您的函数将被调用而不是标准函数。

库插入是灰色魔法;它比 有更好的文档记录ptrace(2),但仍然很容易搞砸。

于 2011-04-02T22:07:31.277 回答