【问题标题】:program to monitor read/writes PATH of a program?监控程序的读/写路径的程序?
【发布时间】:2023-03-05 04:39:02
【问题描述】:

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

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

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

假设我们要监控的程序是 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 工作文件的调用,然后将调用定向到程序文件文件夹。如果我说清楚了,请告诉我..

【问题讨论】:

  • 你在哪个平台上工作?
  • 如果它适用于 Windows 和 linux,那就太好了。但首先是 Windows ..

标签: c++ io ptrace


【解决方案1】:

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

Sysinternals 套件在 Windows 上的“进程监视器”可能会为您提供帮助。

【讨论】:

  • 进程监视器不会只给我打开和当前“进程”的详细信息,而不是给我IO操作所需文件的详细信息吗?
  • Sysinternals 工具可以向您展示文件操作,如其在线文档/营销中所述。
  • @TarunG 我不确定是否理解您的问题:Mau 您开发的是您所谓的 IO 操作所需文件的详细信息?
  • 好的,让我这样说吧:我已将 firefox.exe 从 C:\program 文件移动到 D:\,现在当我运行 firefox.exe 时它不会工作,因为它适用于许多C:\program 文件中的文件,firefox.exe 将使用相对路径来访问文件。我打算做的是捕获对 firefox.exe 工作文件的调用,然后将调用定向到程序文件文件夹。如果我说清楚了,请告诉我..
【解决方案2】:

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

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

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

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

【讨论】:

    最近更新 更多