Loader简介----2
Loader----1中将内存分配放在了函数里面,这样大大降低了函数的可复用性,想想如果我们想在驱动层使用了,所以做如下修改,内存布局函数仅作功能性操作,和系统相关的内存分配放到函数外面吧。
[cpp]
/*
* 将文件内容按虚拟地址信息映射到地址空间
*/
BOOL LdrLayoutPe(char*pImage, DWORD FileSize, char* pRealImageBase, DWORD SizeOfImage)
{
PIMAGE_FILE_HEADER pFileHeader;
PIMAGE_SECTION_HEADER pSectionHeader;
char* pSrc;
char* pDst;
DWORD CopySize;
DWORD i;
if(!LdrValidateImage(pImage, FileSize))
return FALSE;
pFileHeader = _GetFileHeaderFromPe(pImage);
pSectionHeader = _GetSectionHeaderFromPe(pFileHeader);
//拷贝文件头信息
pDst = pRealImageBase;
pSrc = pImage;
CopySize = (char*)pSectionHeader - pImage + pFileHeader->NumberOfSections*sizeof(PIMAGE_SECTION_HEADER);
if(pDst + CopySize >= pRealImageBase + SizeOfImage)
return FALSE;
RtlCopyMemory(pDst, pSrc, CopySize);
//拷贝节信息到内存
for(i = 0; i < pFileHeader->NumberOfSections; i++){
if(!pSectionHeader[i].PointerToRawData)
continue;
//判断目标指针的合法性
pDst = pRealImageBase + pSectionHeader[i].VirtualAddress;
pSrc = pImage + pSectionHeader[i].PointerToRawData;
CopySize = pSectionHeader[i].SizeOfRawData;
if(pDst + CopySize >= pRealImageBase + SizeOfImage)
return FALSE;
RtlCopyMemory(pDst, pSrc, CopySize);
}
return TRUE;
}
摘自 云淡风轻