for菜鸟文章 pe文件格式 qduwg翻译 转载

上传人:小** 文档编号:89124459 上传时间:2019-05-18 格式:DOC 页数:18 大小:45KB
返回 下载 相关 举报
for菜鸟文章 pe文件格式 qduwg翻译 转载_第1页
第1页 / 共18页
for菜鸟文章 pe文件格式 qduwg翻译 转载_第2页
第2页 / 共18页
for菜鸟文章 pe文件格式 qduwg翻译 转载_第3页
第3页 / 共18页
for菜鸟文章 pe文件格式 qduwg翻译 转载_第4页
第4页 / 共18页
for菜鸟文章 pe文件格式 qduwg翻译 转载_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《for菜鸟文章 pe文件格式 qduwg翻译 转载》由会员分享,可在线阅读,更多相关《for菜鸟文章 pe文件格式 qduwg翻译 转载(18页珍藏版)》请在金锄头文库上搜索。

1、For菜鸟文章 PE文件格式 qduwg翻译转载For菜鸟文章:PE文件格式,qduwg翻译(转载)【2】2010年09月24日节目录Section directories - 节包含2个部分:节头IMAGE_SECTION_HEADER,节数据。在数据目录之后,我们看到一个具有NumberOfSections个节头成员的数组,按RVA排序。 节头包括: IMAGE_SECTION_HEADER STRUCT Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?) union Misc PhysicalAddress dd ? VirtualSize dd ? ends

2、 VirtualAddress dd ? SizeOfRawData dd ? PointerToRawData dd ? PointerToRelocations dd ? PointerToLinenumbers dd ? NumberOfRelocations dw ? NumberOfLinenumbers dw ? Characteristics dd ? IMAGE_SECTION_HEADER ENDS IMAGE_SIZEOF_SHORT_NAME(8)个字节的数组,组成节的名字。如果所有8个字节被用掉,没有0做为结尾。典型的名字如.data或者.text或者.bss. 没有必

3、要前导.,可以是是CODE或 IAT .注意名字不全部跟节内容有关。一个.code节可能或没有可能包括可执行代码,可能只包括输入地址表。可能包含代码和地址表和初始化数据。要找到在节内的信息,必须通过可选头内的数据目录查找他们。不要依赖名字,不要假定节的原始数据起始于节的开始。 下面一个成员是PhysicalAddress和VirtualSize的32位联合体. 在目标文件,该地址是内容被重定位的地址,在可执行文件内是内容的尺寸。实际上该域好像没有被使用,有的链接器填入尺寸有的链接器填入地址,有的链接器填入0。 下一个成员是VirtualAddress,32位,保存当节的数据加载入内存时的RVA

4、。 然后是32位SizeOfRawData,是四舍五入到下个FileAlignment倍数的大小。 下一个是PointerToRawData,32位,它是从文件起始到节数据的偏移量。如果是0,节数据不包含在文件内,在加载时被确定。 然后是PointerToRelocations,32位,和PointerToLinenumbers,32位,NumberOfRelocations,16位,NumberOfLinenumbers,16位.所有这些信息仅仅用于目标文件。可执行文件有一个特殊的基准重定位目录,如果存在行号信息,一般包含在特殊目的的调试段或其他。 最后一个是32位的Characterist

5、ics,它是一组标志描述如何处理节的内存。 bit 5 (IMAGE_SCN_CNT_CODE),置1,节内包含可执行代码。 bit 6 (IMAGE_SCN_CNT_INITIALIZED_DATA)置1,节内包含的数据在执行前是确定的。 bit 7 (IMAGE_SCN_CNT_UNINITIALIZED_DATA) 置1,本节包含未初始化的数据,执行前即将被初始化为0。一般是BSS. bit 9 (IMAGE_SCN_LNK_INFO) 置1,节内不包含映象数据除了注释,描述或者其他文档外,是一个目标文件的一部分,可能是针对链接器的信息。比如哪个库被需要。 bit 11 (IMAGE_S

6、CN_LNK_REMOVE) 置1,在可执行文件链接后,作为文件一部分的数据被清除。 bit 12 (IMAGE_SCN_LNK_COMDAT) 置1,节包含公共块数据,是某个顺序的打包的函数。 bit 15 (IMAGE_SCN_MEM_FARDATA) 置1,不确定。 bit 17 (IMAGE_SCN_MEM_PURGEABLE) 置1,节的数据是可清除的。 bit 18 (IMAGE_SCN_MEM_LOCKED) 置1,节不可以在内存内移动。 bit 19 (IMAGE_SCN_MEM_PRELOAD)置1, 节必须在执行开始前调入。 Bits 20 to 23指定对齐。一般是库文件

7、的对象对齐。 bit 24 (IMAGE_SCN_LNK_NRELOC_OVFL) 置1, 节包含扩展的重定位。 bit 25 (IMAGE_SCN_MEM_DISCARDABLE) 置1,进程开始后节的数据不再需要。 bit 26 (IMAGE_SCN_MEM_NOT_CACHED) 置1,节的 数据不得缓存。 bit 27 (IMAGE_SCN_MEM_NOT_PAGED) 置1,节的 数据不得交换出去。 bit 28 (IMAGE_SCN_MEM_SHARED) 置1,节的数据在所有映象例程内共享,如DLL的初始化数据。 bit 29 (IMAGE_SCN_MEM_EXECUTE) 置1

8、,进程得到执行访问节内存。 bit 30 (IMAGE_SCN_MEM_READ) 置1,进程得到读出访问节内存。 bit 31 (IMAGE_SCN_MEM_WRITE)置1,进程得到写入访问节内存。 在节头后面我们看到节自身,他们在文件内按照FileAlignment字节数对齐。即在可选头和每个节的后面将添加0。节按照他们的RVAs排序.当加载到RAM,节的对齐按照SectionAlignment。 例如:一个可选头在偏移量981处结束,文件对齐为512,第一个节起始于1024。你可以借助PointerToRawData或者VirtualAddress找到节,不必用对齐找节。(节头哪里去了

9、?此段有问题!) +-+ | DOS-stub | +-+ | file-header | +-+ | optional header | |- - - - - - - - - -| | |-+ | data directories | | | | | |(RVAs to direc- |-+ | |tories in sections)| | | | |-+ | |目录在节内的相对地址 | | | | | +-+ | | | | |-+ | | | | section headers | | | | | | (RVAs to section |-+ | | | |节边界的相对地址 | bor

10、ders) | | | | | | +-+-+ | | | | | | | -+ | | | section data 1 | | | |节数据 | | | -+ | +-+-+ | | | | | section data 2 | | | | -+ +-+ 每个节都有一个节头,每个数据目录将指向一个节(几个数据目录可能指向同一个节),有的节可能没有数据目录指向它。 节的原始数据Sections raw data - 概要- 所有的节调入内存后按照SectionAlignment对齐,FileAlignment是节在文件内对齐字节数。 节由节头内的项目来描述,可以通过PointerToRawD

11、ata在文件内找到节,在内存内通过VirtualAddress找到节,长度是SizeOfRawData. 根据他们包含的内容,有几种节。一般至少有一个数据目录指向的内容保存在一个节内。 代码节code section - 本节至少含有一个标志位IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE and IMAGE_SCN_MEM_READ的集合,并且可选头的成员AddressOfEntryPoint指向这个节内的某个地方。可选头的成员BaseOfCode将指向这个节的开始,如果把非代码放在代码之前,也有可能指向后面某个地方。一般除了可执行代码,没有其他东西,一般

12、只有一个代码节。一般的名字如:.text, .code, AUTO。 数据节data section - 本节包含初始化过的静态变量,例如 static int i = 5;.他含有这些位IMAGE_SCN_CNT_INITIALIZED_DATA,IMAGE_SCN_MEM_RE AD及IMAGE_SCN_MEM_WRITE 等.有的链接器把常量数据放在没有可写标志位的节内。如果部分数据是共享的,或者有其他特性的话,节将包含更多的特征位集。节一般在BaseOfData到BaseOfData+SizeOfInitializedData的范围内.典型名字如:.data, .idata, DATA

13、。 bss section - 还有未初始化的数据,例如static int k;该节的PointerToRawData为0,表明其内容不在文件内,特征位IMAGE_SCN_CNT_UNINITIALIZED_DATA指明所有内容必须在加载时间置0。这意味着有节头,但没有节在文件内,该节被加载器创建,并且包含全0字节。其长度是SizeOfUninitializedData.典型名字如.bss, BSS。 有的节数据没有被数据目录指向,其内容和结果被编译器支持,不是被链接器支持。堆栈段和堆段不是可执行文件的节,但是被加载器创建。其大小为optional header内的stacksize和hea

14、psize . 版权copyright - 开始于一个简单的目录IMAGE_DIRECTORY_ENTRY_COPYRIGHT.其内容是一个版权或者一个非0结尾的串,象Gonkulator control application, copyright (c) 1848 Hugendubel & Cie. 该串被使用命令行或者描述文件提供给链接器。该串不是必须的,可以被舍弃。他不是可写的,实际上程序不必访问他。链接器将找出是否有一个可以舍弃的不可写的段,创建一个名字为.descr的段。然后把串填入该段,让版权目录指针指向他。该节的特征字IMAGE_SCN_CNT_INITIALIZED_DATA 必须置1。 输出符

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号