有没有办法在 .NET 中使用重定向文件路径运行进程,类似于 Sandboxie 和 DropboxPortableAHK 所做的?
例如,如果进程想要在 处写入文件C:\file.txt
,我希望我的应用程序让进程写入C:\Sandbox\file.txt
。
由于 .NET 迟早会将调用重定向到底层操作系统,因此您确实可以附加一个挂钩并替换类似 CreateFile() 的例程来修改路径。
Detours Library可能是您所需要的。它有一些许可问题,尤其是在 64 位模式下,所以寻找像这样的免费替代品:DetourXS。
此处给出了挂钩 CreateFile/WriteFile/ReadFile 的确切说明:CodingTheWheel。
您只需使用以下过程编写 DLL:
// Our custom version of the CreateFile Windows API, having the same parameters,
// return type, and calling convention as the version of CreateFile provided by the OS.
HANDLE WINAPI Mine_CreateFile(LPCWSTR lpFileName,DWORD dwDesiredAccess,
DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecAttr,
DWORD dwCreateDisp, DWORD dwFlagsAttr,HANDLE hTemplate)
{
// First, call the original CreateFile provided by the operating system.
HANDLE hFile = Real_CreateFile(lpFileName,dwDesiredAccess,dwShareMode,lpSecAttr,
dwCreateDisp,dwFlagsAttr,hTemplate);
// Now, do whatever we want with the filename (lpFileName)
/// e.g., redirect C:\test.txt to C:\MyApp\test.txt
// Now, do whatever we want with the file handle (hFile)
// Call the original CreateFile
// Return the same value returned to us by the original API
return hFile;
}
这一点都不简单,但基本上你需要用本机代码(例如 C++)创建一个 DLL。此 DLL 挂钩文件和注册表 IO 并将其重定向到您的沙箱目录。然后,将此 DLL 注入沙盒进程。然后,DLL 将挂钩此进程的活动。
这是基本的想法。