ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 手动填写DLL导入表:IMAGE_IMPORT_DESCRIPTOR的Name字段存储0x0000FFFF

2019-10-03 12:06:02  阅读:509  来源: 互联网

标签:portable-executable c hook dll dllimport


我的目标是手动填写Dll的导入表以挂钩内部LoadLibrary调用(当您加载库时,它可能会在其DllMain中加载另一个库).

这是我的代码,它为dependecies层次结构中的每个dll递归填充Import表,除了一些dll(在这种情况下为api-ms-win-crt-locale-l1-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是什么意思?也许这是一些“特殊”模块(请参见屏幕截图下面的api-ms-win-crt-locale-l1-1-0.dll)?

这是我的调试会话的屏幕截图.
enter image description here

更新:

也许0x0000FFFF意味着dll没有依赖关系?

我在Dependency Walker中看了api-ms-win-crt-locale-l1-1-0.dll依赖项,似乎这个dll没有任何东西可以导入.

解决方法:

从你的截图清晰视图,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]为零.需要检查 – 在处理之前是否存在导入

标签:portable-executable,c,hook,dll,dllimport
来源: https://codeday.me/bug/20191003/1849340.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有