c++ - मैन्युअल रूप से डीएलएल आयात तालिका भरें: IMAGE_IMPORT_DESCRIPTOR का नाम फ़ील्ड स्टोर 0x0000FFFF



dll hook (1)

अपने स्क्रीनशॉट से स्पष्ट रूप से देखें कि importTable imageBase (यानी IMAGE_DOS_HEADER ) को इंगित करें। यह तब होता है जब header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress == 0 - परिणाम और त्रुटि के रूप में आप इस स्थिति की जांच नहीं करते हैं

api-ms-win-crt-locale-l1-1-0.dll DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] api-ms-win-crt-locale-l1-1-0.dll DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] कोई आयात नहीं है - DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] शून्य है। जांच की ज़रूरत है - यह प्रक्रिया से पहले मौजूद हैं

मेरा लक्ष्य है कि आंतरिक लोड लाइबरी कॉल्स को हुकाने के लिए मैन्युअल रूप से डीएलएल की आयात तालिका को भरना है (जब आप लाइब्रेरी लोड करते हैं तो यह एक अन्य लाइब्रेरी को अपने DllMain के अंदर लोड कर सकता है)।

यह मेरा कोड है जो निर्भरता पदानुक्रम में प्रत्येक डीएलएल के लिए बार-बार आयात तालिका भरता है और यह कुछ डीएलएस ( एपीआई-एमएस-जीत-सीआरटी-लोकेल- एल 1-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);
    }
}

समस्या यह है कि IMAGE_IMPORT_DESCRIPTOR संरचना का Name फ़ील्ड 0x0000FFFF बजाय Dll नाम की दुकान 0x0000FFFF

तो मेरा सवाल है कि मैं इसे कैसे ठीक कर सकता हूं? 0x0000FFFF क्या मतलब है? हो सकता है कि यह कुछ "विशेष" मॉड्यूल (स्क्रीनशॉट पर एपीआई-एमएस-जीत- CRT-locale-l1-1-0.dll नीचे देखें)?

मेरे डिबग सत्र से यह स्क्रीनशॉट है

अद्यतन करें:

शायद 0x0000FFFF का मतलब है कि डीएलएल में निर्भरता नहीं है?

मैंने अपी-एमएस-जीत-सीआरटी-लोकेल-एल 1-1-0 डीएलएल निर्भरता वॉकर में निर्भरता देखा है और लगता है कि इस डीएलएल को आयात करने के लिए कुछ नहीं है।