在没有 GetModuleInformation 的情况下 DLL 注入后获取 DLL 模块大小

Get DLL Module size after DLL injection without GetModuleInformation

我手动映射 dll,但我无法使用 GetModuleInformation 获取它的工作区域的 MODULEINFO(它总是用 "Unable to obtain module" 回答我)?发生这种情况是因为该函数试图从进程环境块中的模块列表中获取数据。但是手动映射的 dll 通常不会链接到该列表中,除非您当然手动添加新的列表条目。 它不使用来自 header 的信息(或者至少不直接使用)。 所以我已经有了 dllBase,它是 hModule。所以现在我只需要得到它的大小。 有什么方法可以不用 GetModuleInformation 来获取它?

static void someFunc(HINSTANCE hModule)
{
    // all the vars we need for the GetModuleInformation call
    MODULEINFO modInfo;
    HANDLE hProcess = GetCurrentProcess();

    if (GetModuleInformation(hProcess, hModule, &modInfo, sizeof(MODULEINFO)))
    {
        // some work
    }
    else {
        std::cout << "Unable to obtain module" << std::endl;
    }
}

如果我们想在自身进程中获取映射图像的图像大小 - 我们可以从 IMAGE_OPTIONAL_HEADERSizeOfImage 成员读取它 - 这是内存中映射为图像图像的大小(不是大小在磁盘上)

ULONG GetImageSize(PVOID ImageBase = &__ImageBase)
{
    if (PIMAGE_NT_HEADERS pinth = RtlImageNtHeader(ImageBase))
    {
        return pinth->OptionalHeader.SizeOfImage;
    }

    return 0;
}