• exe解析


    IMAGE_DOS_HEADER      size   0x40

    e_lfanew                           0xe0

     

    当中有0xA0的间隔数据。

     

    IMAGE_NT_HEADERS        size  0xf8

     

    Section Header紧接着NT_HEADERS

     

    通过IMAGE_NT_HEADERS结构中的Section Number,解析所有的Section Header

    每个Section Header中记录了Section Data的真实文件偏移与Section Data Size

     

    这里有一个奇怪的问题,按道理来说,Section Header后紧接着就是Section Data,但在我的测试文件中,却不是,Section Header完成后文件偏移为0x2f0,而最开始有数据的Section Data起始偏移是在0x400,这中间差了不少了,具体存放了什么数据,没有找到说明。

     

    不过分析Section Data的偏移以及大小发现,Section Data数据后没有其它数据了,SectionData是文件最后的数据。

     

    现在总结下,问题就两个:

    1 Section HeaderSection Data中间的数据是什么?

    2 Section Data数据如何解析?

     

    整理下最终的exe文件结构布局

     

    IMAGE_DOS_HEADER

    空闲部分

    IMAGE_NT_HEADERS                    地址为 IMAGE_DOS_HEADERe_lfanew字段值

    IMAGE_SECTION_HEADER

    IMAGE_SECTION_HEADER

    IMAGE_SECTION_HEADER              Section Header数量通过IMAGE_NT_HEADERS 中的FileHeader.NumberOfSections确定

    未知

    SectionData

    Section Data                                     这里的数据通过IMAGE_SECTION_HEADER记录的文件指针偏移以及大小读取

     

    示例C代码:

    #include<iostream>

    #include<Windows.h>

    #include<vector>

     

    int main(intargc,char** argv)

    {

    FILE*fp = fopen(argv[1],"rb");

    if(!fp)

    {

    std::cerr<<"Readfile error! ";

    return-1;

    }

     

    fseek(fp,0,SEEK_END);

    intiLen = ftell(fp)+1;

    fseek(fp,0,SEEK_SET);

     

    char*pC = new char[iLen];

    intiRead = fread(pC,1,iLen,fp);

    fclose(fp);

     

    //解析

    IMAGE_DOS_HEADER*                m_pDOSHeader= (IMAGE_DOS_HEADER*)(pC);

    intiDosHeaderSize = sizeof(IMAGE_DOS_HEADER);

     

    IMAGE_NT_HEADERS*                m_pNTHeaders32= (IMAGE_NT_HEADERS *) ((BYTE*)m_pDOSHeader +

    m_pDOSHeader->e_lfanew);

    intiNTHeaderSize = sizeof(IMAGE_NT_HEADERS);

     

    intiSectionStart = m_pDOSHeader->e_lfanew + iNTHeaderSize;

     

    std::vector<IMAGE_SECTION_HEADER*>vecSectionHeaders;

    for(inti=0; i<m_pNTHeaders32->FileHeader.NumberOfSections; i++)

    {

    IMAGE_SECTION_HEADER*pSectionHeader = (IMAGE_SECTION_HEADER*)((BYTE*)m_pDOSHeader +

    iSectionStart+ i*sizeof(IMAGE_SECTION_HEADER));

     

    vecSectionHeaders.push_back(pSectionHeader);

    }

     

    intiCurPos = iSectionStart +m_pNTHeaders32->FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER);

     

    return0;

    }

  • 相关阅读:
    物理机异常断电,linux虚拟机系统磁盘mount失败,导致无法启动; kubectl 连接失败
    [Docker] 制作并运行 Nginx 镜像
    [Docker] 在CentOS6.8 安装 Docker
    47.DOM例题
    46.脚本化css2
    44 脚本化操作css
    43.操作标签属性
    42回顾
    41:例题、知识点复习
    40.数组字符串例题
  • 原文地址:https://www.cnblogs.com/pangblog/p/3296995.html
Copyright © 2020-2023  润新知