Complete la tabla de importación de DLL manualmente: el campo Nombre de IMAGE_IMPORT_DESCRIPTOR almacena 0x0000FFFF
Mi objetivo es completar la tabla de importación de Dll manualmente para enganchar las llamadas internas de LoadLibrary (cuando carga la biblioteca, puede cargar otra biblioteca dentro de su DllMain).
Aquí está mi código que completa la tabla Importar de forma recursiva para cada dll en la jerarquía de dependencias y funciona bien, excepto algunos dlls (api-ms-win-crt-locale-l1-1-0.dll en este 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);
}
}
El problema es que elName
campo deIMAGE_IMPORT_DESCRIPTOR
estructura de tiendas0x0000FFFF
en lugar del nombre Dll.
Entonces mi pregunta es ¿cómo puedo solucionar eso? Que hace0x0000FFFF
¿media? Tal vez este es un módulo "especial" (verapi-ms-win-crt-locale-l1-1-0.dll a continuación en la captura de pantalla)?
Aquí hay una captura de pantalla de mi sesión de depuración.
¿Quizás 0x0000FFFF significa que dll no tiene dependencias?
He miradoapi-ms-win-crt-locale-l1-1-0.dll dependencias en Dependency Walker y parece que este dll no tiene nada que importar.