1.将硬盘上的PE文件写入内存

从硬盘映射PE到内存

从硬盘直接读取的PE文件头名为**RawData

PointerToRawData 字段记录的是该节在 PE 文件中的起始偏移量(以字节为单位)。也就是说,通过这个偏移量,我们可以在磁盘上的 PE 文件中准确找到该节的原始数据。

所以通过以下代码可以将硬盘中的pe文件放到内存中的pe结构中,模拟了windows从硬盘加载PE文件的过程:

// 给PE文件分配内存
	if ((pPeBaseAddress = VirtualAlloc(NULL, pPeHdrs->pImgNtHdrs->OptionalHeader.SizeOfImage, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)) == NULL) {
		PRINT_WINAPI_ERR("VirtualAlloc");
		return FALSE;
	}

	// Copying PE headers - IOC
	// memcpy(pPeBaseAddress, pPeHdrs->pFileBuffer, pPeHdrs->pImgNtHdrs->OptionalHeader.SizeOfHeaders);

	for (int i = 0; i < pPeHdrs->pImgNtHdrs->FileHeader.NumberOfSections; i++) {
		memcpy(
			(PVOID)(pPeBaseAddress + pPeHdrs->pImgSecHdr[i].VirtualAddress),//目的地址:内存地址+RVA
			(PVOID)((ULONG_PTR)pPeHdrs->pFileBuffer + pPeHdrs->pImgSecHdr[i].PointerToRawData),//源地址:硬盘地址+RVA
			pPeHdrs->pImgSecHdr[i].SizeOfRawData
		);
	}