现在的位置: 首页 > 综合 > 正文

exe解析

2013年06月27日 ⁄ 综合 ⁄ 共 1900字 ⁄ 字号 评论关闭

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!\n";

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;

}

抱歉!评论已关闭.