c++ - crear - formato dll
Complete la tabla de importaciĆ³n DLL manualmente: el campo Nombre de IMAGE_IMPORT_DESCRIPTOR almacena 0x0000FFFF (1)
Mi objetivo es completar manualmente la tabla de importación de Dll para conectar las llamadas internas LoadLibrary (cuando carga la biblioteca puede cargar otra biblioteca dentro de su DllMain).
Aquí está mi código que completa la tabla Importar recursivamente 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 el campo Name
de la estructura 0x0000FFFF
almacena 0x0000FFFF
lugar del nombre Dll.
Entonces mi pregunta es ¿cómo puedo solucionar eso? ¿Qué significa 0x0000FFFF
? Tal vez este es un módulo "especial" (ver api-ms-win-crt-locale-l1-1-0.dll a continuación en la captura de pantalla)?
Aquí está la captura de pantalla de mi sesión de depuración.
ACTUALIZAR:
¿Tal vez 0x0000FFFF significa que dll no tiene dependencias?
He buscado dependencias api-ms-win-crt-locale-l1-1-0.dll en Dependency Walker y parece que este dll no tiene nada que importar.
desde su vista de captura de pantalla clara que importTable
apunte a imageBase
(es decir, IMAGE_DOS_HEADER
). esto sucede cuando header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0
- no se verifica esta condición, como resultado y error
api-ms-win-crt-locale-l1-1-0.dll
simplemente no tiene importación - DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
es cero. necesita verificación: la importación existe antes de procesarla