MS Detours Express 3.0 неправильно подключает функцию Win32 API CreateFile

Я пытаюсь подключить Win32 API-функцию «CreateFile» с помощью MS Detours, но когда я тестирую ее, открывая файл * .doc с помощью MS Word, вызов CreateFile для DLL-файлов и файлов шрифтов и каталогов, загружаемых MS Word, перенаправляется в мой обход функция, но не для этого файла * .doc, но когда я открываю файл * .txt с помощью блокнота, вызов CreateFile для этого файла * .txt приходит в мою функцию обхода.

Я использую следующий код для перехвата CreateFile:

static HANDLE (WINAPI *Real_CreateFile)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFile;

HANDLE WINAPI Routed_CreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
OutputDebugString(lpFileName);
return Real_CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
LONG Error;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:

OutputDebugString(L"Attaching MyDLL.dll");
OutputDebugString(strInfo);
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)Real_CreateFile, Routed_CreateFile);
Error = DetourTransactionCommit();

if (Error == NO_ERROR)
OutputDebugString(L"Hooked Success");
else
OutputDebugString(L"Hook Error");

break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
OutputDebugString(L"De-Attaching MyDLL.dll");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)Real_CreateFile, Routed_CreateFile);
Error = DetourTransactionCommit();

if (Error == NO_ERROR)
OutputDebugString(L"Un-Hooked Success");
else
OutputDebugString(L"Un-Hook Error");

break;
}
return TRUE;
}

Заранее спасибо.

0

Решение

Я думаю, что вам не хватает break после этого:

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;  // Not interested in thread messages
case DLL_PROCESS_DETACH:

Вы просто отсоединяете объезд, прежде чем он будет вызван? Может быть, открытие .doc создает новую тему, но .txt нет, вызывая этот путь кода.

3

Другие решения

Похоже, вы неправильно инициализируете указатель на функцию Real_CreateFile. Я предполагаю, что вы устанавливаете это для записи таблицы импорта вашего модуля для CreateFile.

Вместо этого инициализируйте его GetProcAddress(GetModuleHandle("kernel32"),"CreateFileW");

1