Loader简介----2

来源:岁月联盟 编辑:猪蛋儿 时间:2012-05-16

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; 

 


摘自 云淡风轻

图片内容