C#/C++ : Launch an application and handle its I/O calls to the system

标签 c# c++ io filesystems

我需要启动其他应用程序并处理它的 I/O 操作。因此,当它尝试读取/写入文件时,我需要捕获它并更改路径。

这应该是可能的,因为有程序可以做这样的事情(比如 ModOrganizer)。

问题是我不想使用文件系统过滤驱动程序。我不想让我的应用程序的用户安装这样的东西。

如我所见,ModOrganizer 通过多种方式实现了这一目的,包括 proxy.dllhooks 等。不知何故,它实现了几乎任何程序都可以从它启动的目标,并且 ModOrganizer 将处理对特定目录的请求。

github 上有源代码,但我真的不明白。这就是我在这里问这个问题的原因。

同样,ModOrganizer 实现了这一点无需反编译每个可能的程序以了解注入(inject)位置。而且它不使用系统过滤器。

(请解释你的缺点。否则我将来如何改进我的问题?)

最佳答案

你需要的是修改进程中每个模块的导入表。

看起来您提到的程序使用的技术类似于此处描述的技术:https://www.codeproject.com/Articles/2082/API-hooking-revealed在“使用 CreateRemoteThread() API 函数注入(inject) DLL”部分下。但是它不是使用远程线程,而是强制主程序线程完成它的工作(参见函数 injectDLL):

https://github.com/TanninOne/modorganizer/blob/4a582e524dd012ed9d5fdb4f9c97aab22c8dac85/src/spawn.cpp

请注意,有一个标志 CREATE_SUSPENDED 传递给 CreateProcess 函数 - 这有助于它在主线程能够执行任何操作之前 stub 所有函数。

它没有修补导入表,而是插入了用程序集编写的 stub (请参阅函数 injectDLL):

https://github.com/TanninOne/modorganizer/blob/4a582e524dd012ed9d5fdb4f9c97aab22c8dac85/src/shared/inject.cpp

Jeffrey Richter 在他的书“Windows via C/C++”中有一个关于如何修补导入表的很好的例子。您可以尝试查找并阅读一本完整的书,或者您可以在此处查看代码:https://github.com/lattesir/WindowsViaCPP/blob/master/22-LastMsgBoxInfoLib/APIHook.cpp

但是对于任何防病毒软件来说,您的程序都可能看起来像病毒。

关于C#/C++ : Launch an application and handle its I/O calls to the system,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46859352/

相关文章:

c# - 双向冒泡排序 C#

c++ - OpenThread 和关闭多个线程句柄

c++ - 为什么创建大于内存的一维数组失败,但创建大于内存的二维数组没有问题?

c++ - `std::istream::operator>>()` 可以接受像 stdio 的 %i 格式说明符这样的整数基数前缀吗?

c++ - 在 C++ 中读\写结构化二进制文件

c# - 是否有 DataServiceContext.SaveChanges() 的任何事件或 Hook

c# - List.Except 不起作用

c# - 从 X509 Cert pfx 文件中获取字符串

java - 单元测试文件 IO java

c++ - 如何避免 cin.operator>> 和 getline 之间的冲突?