1.PE文件有效性校验。
2.定位到 PE header 的起始地址。
3.从 file header 的 NumberOfSections域获取节数。
4.通过两种方法定位节表: ImageBase+SizeOfHeaders 或者 PE header的起始地址+ PE header结构大小。 (节表紧随 PE header)。如果不是使用文件映射的方法,可以用SetFilePointer 直接将文件指针定位到节表。节表的文件偏移量存放在 SizeOfHeaders域里。(SizeOfHeaders 是 IMAGE_OPTIONAL_HEADER 的结构成员)
5.处理每个 IMAGE_SECTION_HEADER 结构。
-------------------------------------------------
我持有怀疑态度的是上面的第四点,通过2种方法可以定位节表,但我对ImageBase+SizeOfHeaders表示怀疑,这个地址是内存虚拟地址,怎么能够来定位磁盘文件位置呢?拿着这个地址值能够找到什么呢?去寻址节表吗?根本不可能的。原来文件内的节都被影射进内存去了,当然影射进内存之前就必须定位节表,根据节表的信息把节影射进内存的。现在却用ImageBase+SizeOfHeaders来定位节表,我认为实在荒唐之极!上面原文说的第二种方法是可信的,PE header的起始地址+ PE header结构大小,这些都是用的文件地址,而并非虚拟地址。因为是拿着这些地址去找磁盘文件的相关内容的。
对你的研究精神表示赞赏,但对你的学习办法不敢恭维。PE文件头只不过是一个普通的数据结构,拿过来用就可以了,需要花时间去学吗?Windows操作系统像这样的结构不下几万个,比这PE结构复杂的多神秘的多的结构有的是,就我个人而言,一天PE结构也没有研究过,每天编程,拿过来使用就完了。我一只不明白就这么一个最普通的数据结构,为什么会有这么多人要去学,照这样下去,那还有几千个几万个更复杂的结构,按学PE文件头的进度和难道去度量,要多少时间?
这个结构出于微软,本来就是最普通的东西,你什么时候想使用了,到微软网站上去查一下,用就是了,需要学吗?有疑问更要到微软去查,以微软的MSDN的定义为准,值得花那么大的精力去研究?要研究,研究点有深度的东西,而不是去研究一个固定不变的数据结构。
下面是微软的权威解释:
DWORD SizeOfHeaders
The combined size of the MS-DOS header, PE headers, and section table. All of these items will occur before any code or data sections in the PE file. The value of this field is rounded up to a multiple of the file alignment.
看望了微软的定义,你觉得有必要去研究吗?
另外,对于类似的知识和理论,我希望你以后不要再看所谓第三方的专家写的东西,最好看来源的东西。
上面的观点,也是我一贯学习的方法,我一直从事汇编的开发工作,前些日子学了一下Delphi,看来看去,也就是那个F1键,我觉得足够了,一是省事,而是绝不会被误导。
最初由 gzgzlxg 发布 对你的研究精神表示赞赏,但对你的学习办法不敢恭维。PE文件头只不过是一个普通的数据结构,拿过来用就可以了,需要花时间去学吗?Windows操作系统像这样的结构不下几万个,比这PE结构复杂的多神秘的多的结构有的是,就我个人而言,一天PE结构也没有研究过,每天编程,拿过来使用就完了。我一只不明白就这么一个最普通的数据结构,为什么会有这么多人要去学,照这样下去,那还有几千个几万个更复杂的结构,按学PE文件头的进度和难道去度量,要多少时间? 这个结构出于微软,本来就是最普通的东西,你什么时候想使用了,到微软网站上去查一下,用就是了,需要学吗?有疑问更要到微软去查,以微软的MSDN的定义为准,值得花那么大的精力去研究?要研究,研究点有深度的东西,而不是去研究一个固定不变的数据结构。 下面是微软的权威解释: DWORD SizeOfHeaders The combined size of the MS-DOS header, PE headers, and section table. All of these items will occur before any code or data sections in the PE file. The value of this field is rounded up to a multiple of the file alignment. ........