Если вы знаете, где код в процессе, который собирается открыть файл, вы можете написать процесс-обертку вокруг него, который действует как отладчик, перехватить вызов, проверить, существует ли он сам, и если нет, замените имя файла другим.
Что-то вроде:
CreateProcess(bla bla, DEBUG_ONLY_THIS_PROCESS, bla bla);
SetBreakPoint(address of code to set breakpoint)
{
ReadProcessMemory to save off byte for breakpoint
WriteProcessMemory 0xCC to set breakpoint
FlushInstructionCache
}
while (TRUE == bContinue)
{
bContinue = WaitForDebugEvent(&debugEvent);
switch (dwDebugEventCode)
{
case EXCEPTION_BREAKPOINT:
// Read the file name from memory, check if it exists, if not, replace it with
// new file name using the same length in memory :)
// Replace your code byte you read out when you set the breakpoint
}
}
Другой метод - перезаписать таблицу вызовов функций собственным вызовом CreateFile (или чем-либо, что они используют в рассматриваемом приложении). Посмотрите перехват API, или даже инъекция Dll может помочь вам здесь.
У Microsoft есть пакет Detours , который может вам помочь, а у CodePlex есть EasyHook , который выглядит довольно интересно.