Обход Хук FindNextFileW Hang - PullRequest
       11

Обход Хук FindNextFileW Hang

0 голосов
/ 12 июня 2018

При подключении FindNextFileW к Detours я не могу изменить возвращенную запись без зависания процесса.Я пытаюсь создать оболочку, которая представляет архив как папку в файловой системе.

То же самое происходит, когда я устанавливаю LPWIN32_FIND_DATAW->dwFileAttributes в FILE_ATTRIBUTE_DIRECTORY или использую логическую операцию или операцию.Атрибуты файла обычно FILE_ATTRIBUTE_ARCHIVE, когда ловушка вызывается с архивом.

Вот код, который я использую для этого, обработка ошибок и ведение журнала удалены для краткости.

#include <stdio.h>
#include <Windows.h>
#include <detours.h>

#define true TRUE
#define false FALSE
#define null NULL

static BOOL endsWithWide(WCHAR* text, WCHAR* key) {
    BOOL endsWith = true;
    size_t size = wcslen(text);
    size_t keySize = wcslen(key);
    for (int i = 0; i < 4; i++) {
        if (text[size - i - 1] != key[keySize - i - 1]) {
            endsWith = false;
            break;
        }
    }
    return endsWith;
}

static BOOL(WINAPI* realFindNextFileW)(
    _In_ HANDLE hFindFile,
    _Out_ LPWIN32_FIND_DATAW lpFindFileData
    ) = FindNextFileW;
static BOOL WINAPI ourFindNextFileW(
    _In_ HANDLE hFindFile,
    _Out_ LPWIN32_FIND_DATAW lpFindFileData
) {
    BOOL result = realFindNextFileW(
        hFindFile,
        lpFindFileData
    );

    if (result) {
        if (endsWithWide(lpFindFileData->cFileName, (WCHAR*)L".zip")) {
            lpFindFileData->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
            lpFindFileData->nFileSizeHigh = 0;
            lpFindFileData->nFileSizeLow = 0;
        }
    }

    return result;
}

BOOL WINAPI /*APIENTRY*/ DllMain(
    HMODULE module,
    DWORD  reason,
    LPVOID reserved
){
    if (DetourIsHelperProcess()) {
        return true;
    }

    if (reason  == DLL_PROCESS_ATTACH) {
        DetourRestoreAfterWith();

        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());

        DetourAttach(&(PVOID&)realFindNextFileW, ourFindNextFileW);

        DetourTransactionCommit();
    }
    else if (reason == DLL_PROCESS_DETACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());

        DetourDetach(&(PVOID&)realFindNextFileW, ourFindNextFileW);

        DetourTransactionCommit();
    }

    return true;
}

Я уверен, что перехватываются вызовы, так как я могу вывести информацию в свой лог-файл, когда у меня это включено.

...