para formato crear biblioteca archivo c++ dll hook dllimport portable-executable

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