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

Loader简介----1

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


做完文件校验后将映像映射到内存当中。

[cpp]
/*
* 将文件内容按虚拟地址信息映射到地址空间,返回模块的基地址
*/
char* LdrLayoutPe(char*pImage, Dword FileSize)
{
    PIMAGE_FILE_HEADER pFileHeader;
    PIMAGE_SECTION_HEADER pSectionHeader;
    char* pOptionalHeader;
    char* pImageBase;
    char* pRealImageBase;
    Dword SizeOfImage;
    word Magic;
    Dword i;

    if(!LdrValidateImage(pImage, FileSize))
        return NULL;
    pFileHeader = _GetFileHeaderFromPe(pImage);
    pSectionHeader = _GetSectionHeaderFromPe(pFileHeader);
    pOptionalHeader = (char*)pFileHeader + sizeof(IMAGE_FILE_HEADER);
    Magic = *(word*)pOptionalHeader;
    pImageBase = _GetImageBaseFromPe(pFileHeader);
    SizeOfImage = *(Dword*)(pOptionalHeader + 0x38);
    pRealImageBase = (char*)VirtualAlloc(pImageBase, SizeOfImage, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    if(!pRealImageBase){
        pRealImageBase = (char*)VirtualAlloc(NULL, SizeOfImage, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
        if(!pRealImageBase)
            return FALSE;
    }
    //拷贝文件头信息
    RtlCopyMemory(pRealImageBase, pImage, (char*)pSectionHeader - pImage + pFileHeader->NumberOfSections*sizeof(PIMAGE_SECTION_HEADER));
    //拷贝节信息到内存
    for(i = 0; i < pFileHeader->NumberOfSections; i++){
        if(!pSectionHeader.PointerToRawData)
            continue;
        RtlCopyMemory(pRealImageBase + pSectionHeader.VirtualAddress,
            pImage + pSectionHeader.PointerToRawData, pSectionHeader.SizeOfRawData);
    }
    return pRealImageBase;
}


喜欢0 评分0
游客

返回顶部