初学PE文件的一些总结

作者在 2008-08-14 16:56:47 发布以下内容
初学PE文件,总结一些经验。
1、为什么在PE文件中有DOS文件头和DOS块?
    因为,防止PE文件在DOS系统下执行。PE文件是在Windows系统下的可执行文件格式。如果在DOS系统下执行,就会显示一句:This program cannot be run in DOS mode .这句话是在DOS块中的。当然,你也可以在DOS块中安排一个16位汇编的程序,使得PE文件在DOS系统下也有一定的功能。

2、Windows装载器装载PE文件的第一步简要过程是怎样的?
    首先,要读取文件头的前两个字节4D 5A,从而知道这是DOS文件头(标记是MZ);遍历DOS文件头的结构IMAGE_DOS_HEADER ,在结构中找到最后一个结构成员e_lfanew ,里面有PE文件头的入口地址。一旦找到,就跳过DOS块,直接从PE文件头开始执行。
 
3、数据结构的嵌套:
    PE文件头是一个数据结构:IMAGE_NT_HEADERS;里面有3个成员:Signature(PE文件标识“PE”,0,0)、FileHeader、OptionalHeader.后两个成员是数据结构!(第一层嵌套了)分别是:IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER.
    IMAGE_FILE_HEADER中没有下一层嵌套;但IMAGE_OPTIONAL_HEADER中又嵌套着一个数据结构数组:IMAGE_DATA_DIRECTORY(共16个元素);这已经是第二层嵌套了。
    以上的数据结构嵌套组成了PE文件头。
 
4、PE文件头之后就是节表和各节数据。节表中是由一个个的IMAGE_SECTION_HEADER结构组成的,每一个结构和每一节相对应,有多少个结构,就有多少个节。
 
5、文件装入内存后,如何从一个RVA(下称:目标RVA)得到磁盘上的静态PE文件中的相应的数据?
    思路:从文件头(线性地址)开始,得到PE文件头的位置;PE文件头的位置加上文件头的长度,得到节表的位置(首先得到的是第一个IMAGE_SECTION_HEADER);@@根据本节的大小(SizeOfRawData字段)得到本节的实际大小,即本节的结束RVA ;然后,用目标RVA去判断,它是否在本节的开始RVA和结束RVA内。是,则转到第6点说明;不是,则开始RVA递增一个IMAGE_SECTION_HEADER,即到了第二个IMAGE_SECTION_HEADER(以下类推),重复@@ .
 
6、如果确定了目标RVA在某一节内,则用目标RVA减去本节的开始RVA,得到相对于本节开始RVA的RVA(下称相对RVA),相对RVA加上PointerToRawData(本节在文件中的偏移),即可得到真正要查询的数据的位置。
文章评论,共1条
ONEPROBLEM(作者)
2008-08-23 23:16
1
7、导入表是每个PE文件必须具备的;而导出表却不是每个PE文件一定要有的。
游客请输入验证码