Я создаю 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 обрабатывают звук.
Процесс аварийно завершает работу с исключением нарушения прав доступа, говоря, что он не может выполнить расположение на снимке экрана стека вызовов.
Это создает впечатление, что обход каким-то образом повреждает приложение, вызывая сбой некоторого кода, зависящего от функции. Однако, вероятно, гораздо более вероятно, что я что-то неправильно понимаю или пытаюсь сделать что-то не так. :)
Любая помощь или руководство будут высоко оценены!