灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2093回复:0

Loader简介----2

楼主#
更多 发布于:2012-09-06 12:31


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.PointerToRawData)
            continue;
        //判断目标指针的合法性
        pDst = pRealImageBase + pSectionHeader.VirtualAddress;
        pSrc = pImage + pSectionHeader.PointerToRawData;
        CopySize = pSectionHeader.SizeOfRawData;
        if(pDst + CopySize >= pRealImageBase + SizeOfImage)
            return FALSE;
        RtlCopyMemory(pDst, pSrc, CopySize);
    }
    return TRUE;
}


喜欢0 评分0
游客

返回顶部