Preencha a tabela de importação de DLL manualmente: o campo Nome do IMAGE_IMPORT_DESCRIPTOR armazena 0x0000FFFF

Meu objetivo é preencher a tabela de importação da DLL manualmente, a fim de ligar chamadas internas da LoadLibrary (quando você carrega a biblioteca, ela pode carregar outra biblioteca dentro do seu DllMain).

Aqui está o meu código que preenche a tabela Importar recursivamente para cada DLL na hierarquia de dependências e funciona bem, exceto algumas DLLs (api-ms-win-crt-locale-l1-1-0.dll nesse caso).

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);
    }
}

O problema é que oName Campo deIMAGE_IMPORT_DESCRIPTOR lojas de estrutura0x0000FFFF em vez do nome da DLL.

Então, minha pergunta é como posso corrigir isso? O que0x0000FFFF significar? Talvez este seja um módulo "especial" (consulteapi-ms-win-crt-locale-l1-1-0.dll abaixo na captura de tela)?

Aqui está uma captura de tela da minha sessão de depuração.

ATUALIZAR:

Talvez 0x0000FFFF signifique que a dll não tem dependências?

Eu olheiapi-ms-win-crt-locale-l1-1-0.dll dependências no Dependency Walker e parece que esta dll não tem nada para importar.

questionAnswers(1)

yourAnswerToTheQuestion