2
void
CopySections(const unsigned char *data, PIMAGE_NT_HEADERS old_headers, PMEMORYMODULE module)
{
    int i, size;
    unsigned char *codeBase = module->codeBase;
    unsigned char *dest;
    PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers);
    for (i=0; i<module->headers->FileHeader.NumberOfSections; i++, section++) {
        if (section->SizeOfRawData == 0) {
            // section doesn't contain data in the dll itself, but may define
            // uninitialized data
            size = old_headers->OptionalHeader.SectionAlignment;
            if (size > 0) {
                dest = (unsigned char *)VirtualAlloc(codeBase + section->VirtualAddress,
                    size,
                    MEM_COMMIT,
                    PAGE_READWRITE);

                section->Misc.PhysicalAddress = (DWORD) (POINTER_TYPE) dest;
                memset(dest, 0, size);
            }

            // section is empty
            continue;
        }

        // commit memory block and copy data from dll
        dest = (unsigned char *)VirtualAlloc(codeBase + section->VirtualAddress,
                            section->SizeOfRawData,
                            MEM_COMMIT,
                            PAGE_READWRITE);
        memcpy(dest, data + section->PointerToRawData, section->SizeOfRawData);
        section->Misc.PhysicalAddress = (DWORD) (POINTER_TYPE) dest;
    }
}

メモリから dll ファイルをロードしたいのですが、上記のコードはhttp://www.joachim-bauch.de/tutorials/loading-a-dll-from-memoryにあります。

また、著者が次のように述べていることもわかりました:「ファイル内にデータのないセクション (使用される変数のデータ セクションなど) の SizeOfRawData は 0 であるため、OptionalHeader の SizeOfInitializedData または SizeOfUninitializedData を使用できます。ビットに応じてどちらを選択する必要がありますか?セクションの特性で設定できるフラグ IMAGE_SCN_CNT_INITIALIZED_DATA および IMAGE_SCN_CNT_UNINITIALIZED_DATA です。"

しかし、SizeOfRawData がゼロの場合、コミットされたメモリのサイズが SectionAlignment であり、SizeOfInitializedData でも SizeOfUninitializedData でもない理由を理解できません。

4

1 に答える 1