Я делаю DLL, которая перехватывает определенные функции Windows API с помощью Microsoft Detours, чтобы выполнить некоторый анализ.DLL добавляется в таблицу импорта сторонней игры, чтобы запустить функцию DllMain и применить хуки.
Я столкнулся с проблемами при попытке подключить функцию GetFileSize.Когда я делаю обход, даже простой, игра почти сразу вылетает, за исключением нарушения прав доступа.Мне кажется, что обходной путь каким-то образом портит приложение.Вот самый простой код, который вызывает проблему в моем случае:
static DWORD(WINAPI * TrueGetFileSize) (
HANDLE hFile,
LPDWORD lpFileSizeHigh
) = GetFileSize;
DWORD GetFileSizeDetour(HANDLE hFile, LPDWORD lpFileSizeHigh) {
return TrueGetFileSize(hFile, lpFileSizeHigh);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
if (DetourIsHelperProcess()) {
return TRUE;
}
if (dwReason == DLL_PROCESS_ATTACH) {
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueGetFileSize, GetFileSizeDetour);
DetourTransactionCommit();
}
else if (dwReason == DLL_PROCESS_DETACH) {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)TrueGetFileSize, GetFileSizeDetour);
DetourTransactionCommit();
}
return TRUE;
}
Когда я отлаживаю игру, с добавленной DLL, обходной путь на самом деле удаляется один раз, но когда я продолжаю выполнение, происходит сбой.Вот скриншот окна стека вызовов в Visual Studio, когда происходит сбой процесса:
Кажется, проблема возникает во время инициализации CRT с помощью dsound.DLL, что я думаю, как игры для Windows обрабатывают звук.
Процесс завершается с исключением из-за нарушения прав доступа, говоря, что он не может выполнить местоположение в скриншоте стека вызовов.
Это создает впечатление, что обходной путь каким-то образом повреждает приложение, что приводит к сбою некоторого кода, зависящего от функции.Однако, вероятно, гораздо более вероятно, что я что-то неправильно понимаю или пытаюсь сделать что-то неправильно.:)
Любая помощь или руководство будет высоко ценится!