Заполните таблицу импорта DLL вручную: поле имени IMAGE_IMPORT_DESCRIPTOR хранит 0x0000FFFF

Моя цель - заполнить таблицу импорта Dll вручную, чтобы перехватить внутренние вызовы LoadLibrary (когда вы загружаете библиотеку, она может загрузить другую библиотеку внутри своего DllMain).

Вот мой код, который рекурсивно заполняет таблицу импорта для каждой DLL в иерархии зависимостей, и он работает нормально, за исключением некоторых DLL (API-мс-беспроигрышная элт-локали l1-1-0.dll в этом случае).

void PEUtility::fillImportTable(HMODULE loadedModule, FillImportFlag flag, std::function<void(HMODULE&)> callback)
{
    std::stack<HMODULE> modules;
    modules.push(loadedModule);

    while (modules.size())
    {
        auto module = modules.top();
        modules.pop();

        auto imageBase = (DWORD_PTR)module;

        auto header = ImageNtHeader(module);
        auto importTable = (PIMAGE_IMPORT_DESCRIPTOR)(DWORD_PTR)(header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + imageBase);

        while (importTable->OriginalFirstThunk)
        {
// !!!
// HERE I've got an error: importTable->Name stores 0x0000FFFF instead dll name
// !!!
            auto importedModuleName = (char*)(DWORD_PTR)(importTable->Name + imageBase);
            auto importedModule = GetModuleHandleA(importedModuleName);
            if (!importedModule)
            {
                importedModule = LoadLibraryExA(importedModuleName, 0, DONT_RESOLVE_DLL_REFERENCES);
                if (flag == FillImportFlag::Recursive)
                    modules.push(importedModule);
            }

            auto nameAddressPtr = (PIMAGE_THUNK_DATA)(DWORD_PTR)(importTable->OriginalFirstThunk + imageBase); //Import Lookup Table address (functions names)
            auto functionAddressPtr = (PIMAGE_THUNK_DATA)(DWORD_PTR)(importTable->FirstThunk + imageBase); //Import Address Table (IAT) address (functions addresses)

            while (nameAddressPtr->u1.Function)
            {
                FARPROC importedFunctionPtr = NULL;
                if (nameAddressPtr->u1.Ordinal & IMAGE_ORDINAL_FLAG)
                {
                    importedFunctionPtr = GetProcAddress(importedModule, MAKEINTRESOURCEA(nameAddressPtr->u1.Ordinal));
                }
                else
                {
                    auto impotByNameImage = (PIMAGE_IMPORT_BY_NAME)(DWORD_PTR)(nameAddressPtr->u1.AddressOfData + imageBase);
                    importedFunctionPtr = GetProcAddress(importedModule, (char*)impotByNameImage->Name);
                }

                if (importedFunctionPtr)
                {
                    auto oldProt = 0ul;
                    VirtualProtect(functionAddressPtr, sizeof(IMAGE_THUNK_DATA), PAGE_EXECUTE_READWRITE, &oldProt);
                    functionAddressPtr->u1.Function = (DWORD_PTR)importedFunctionPtr;
                }

                nameAddressPtr++;
                functionAddressPtr++;
            }

            importTable++;
        }

// HERE in callback I hook LoadLibrary & RegQueryVAlue calls if 'module' has such dependencies
        callback(module);
    }
}

Проблема в том, чтоName полеIMAGE_IMPORT_DESCRIPTOR структура магазинов0x0000FFFF вместо имени Dll.

Итак, мой вопрос, как я могу это исправить? Что значит0x0000FFFF имею в виду? Может быть, это какой-то «специальный» модуль (см.API-мс-беспроигрышная элт-локали l1-1-0.dll ниже на скриншоте)?

Вот скриншот из моего сеанса отладки.

ОБНОВИТЬ:

Может быть, 0x0000FFFF означает, что у dll нет зависимостей?

Я смотрелAPI-мс-беспроигрышная элт-локали l1-1-0.dll Зависимости в Dependency Walker и, кажется, эта DLL не имеет ничего для импорта.

Ответы на вопрос(1)

Ваш ответ на вопрос