Перехват WinAPI CreateFileW в Блокноте - PullRequest
0 голосов
/ 02 декабря 2018

Я сделал DLL, которая должна перехватить CreateFileW из Блокнота, но, тем не менее, он завис.После отладки я обнаружил, что это вызывает переполнение стека в первой строке функции HookedCreateFile:

Screenshot

(говорят, что это вызываетошибка исключения по адресу ...)

стек вызовов в точке исключения:

Callstack?

Мой код:

typedef HANDLE(WINAPI * CreateFileFn)(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile);

CreateFileFn oCreateFile = (CreateFileFn)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateFileW");

HANDLE WINAPI HookedCreateFile(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile)
{
    //std::cout << "Hello!" << std::endl;

    return oCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

Я использую DetourFunction от Microsoft. Detours:

DetourFunction((PBYTE)oCreateFile, (PBYTE)HookedCreateFile);

1 Ответ

0 голосов
/ 02 декабря 2018

Во-первых, DetourFunction() старый, его заменили на DetourAttach().Вы должны обновить свой код, чтобы использовать новую версию библиотеки Detours.См. Вики Microsoft на Использование обходных путей .

Во-вторых, когда вы отклоняете функцию, вы заменяете первые несколько инструкций этой функции переходом к функции перехвата.DetourFunction() возвращает батут , который вы ДОЛЖНЫ использовать для вызова функции original .Батут выполняет инструкции, которые были заменены, и затем переходит к оставшемуся отцепленному коду оригинальной функции.

Но ваш хук вообще не использует батут, поэтому каждый развызывает oCreateFile, в конечном итоге он перезванивает сам себе снова и снова в бесконечном рекурсивном цикле.Именно это вызывает ошибку переполнения стека, поскольку каждый вызов помещает в стек вызовов еще одну копию входных параметров.В конце концов, стеку вызовов не хватает свободного места.

Попробуйте вместо этого:

CreateFileFn origCreateFile = (CreateFileFn) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateFileW");
CreateFileFn trampCreateFile;

HANDLE WINAPI HookedCreateFile(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile)
{
    //std::cout << "Hello!" << std::endl;
    return trampCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

...

trampCreateFile = (CreateFileFn) DetourFunction((PBYTE)origCreateFile, (PBYTE)HookedCreateFile);
...