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 でもない理由を理解できません。