【问题标题】:Write to file in use by another program写入另一个程序正在使用的文件
【发布时间】:2021-11-13 14:51:16
【问题描述】:

我正在创建一个程序(目标并不重要,但它恰好是纯粹为了搞砸并了解有关 Windows 的更多信息),它读取和写入另一个程序正在使用的文件(例如记事本)或单词)。

显然我在删除它时遇到了麻烦,因为我收到了拒绝访问错误,因为该文件正在使用中。

我的第一个想法是我应该使用CloseHandle (kernel32.dll) 来关闭该文件的句柄,但我不知道如何首先找到该句柄。

有什么想法吗?我在 Rust 中这样做,所以如果有任何特定于语言的建议最好,但如果没有,那也很好。

另一方面,关闭句柄后程序会发生什么? word 或记事本是否仍然可以编辑它,或者后续保存会删除我的程序所做的更改,或者它甚至不会保存?

【问题讨论】:

  • 表现良好的程序等到文件被解锁后再对它做任何事情,而不是试图从另一个进程中劫持它。
  • @Kaihaku 这不应该是一个表现良好的程序,我正在尝试模拟“恶意软件”类程序的操作。
  • 那么没有正确的方法可以做到这一点。杀死锁定文件的进程当然是最简单的。
  • @Kaihaku 是的,这让我想到了,但我认为这有点懒惰,我想探索一下是否可以不必终止进程:D
  • 您可能会发现 Microsoft's Volume Shadow Copy Service 感兴趣。

标签: windows file rust io internals


【解决方案1】:

您观察到的这种行为与 Rust 或任何其他编程语言无关,因为这是特定于系统的。 由于其第三个参数 (dwShareMode),CreateFileA() win32 call 提供了一种明确指定打开文件如何进行共享的方法。 不幸的是(对你来说)这个调用是由你试图劫持的 other 程序预先执行的,而不是你的;你的程序什么也做不了,一旦打开文件就太迟了。

并不是说在 UNIX 上情况有所不同,因为文件系统中文件的路径只是对该文件内容的引用,就像 open() 操作一样。 因此,如果您删除 (rm) 此路径指示的文件,您只需删除引用 (unlink()),但如果打开的文件描述符仍引用它,则不会删除其实际内容。 文件内容的实际删除只有在不再存在对其的引用时才会发生。

【讨论】:

  • 我明白了!如果我在创建文件开始时试图拦截其他程序完成的CreateFileA() 以更改dwShareMode 参数怎么办?我猜这需要内核级代码吗?或者我可以通过在进程中注入代码来做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2020-04-20
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多