PE 文件格式学习

以前总在网上看看介绍pe文件格式的文章,看的时候看到一大堆的结构体就蛋疼了,想想现在我这个居然都不清楚以后咋装bi呢安静

今天下了个PEview边看变学了

先自己随便写个控制台程序,然后加进去就有了,让后我们可以看看这个文件到底是怎么组成的。


从这个树形结构我们能很清楚的理解这个文件的整体构成,在网上有很多pe文件格式的图找一张对照看:

 第一个IMAGE_DOS_HEADER DOS头 为啥要有 就是为了兼容DOS

第二个MOS-DOS Stub Program DOS实模式残余程序

第三个IMAGE_NT_HEADERS pe文件头,这个里面分几个部分,第一个是标志描述文件格式;


下一个是真pe的文件头,记录了一些这个文件是什么机器编出来的这些东西。可以看一下。


第三个名字叫可选pe可选头,蛋疼。。。。它其实都在的。。。

这个里面的内容比较重要,记录的相信值得研究,什么程序入口都在这里面。东西很多没必要都看,自己点点看下,发现还是有几个感兴趣的字段。

DataDirectory 可以看下。


第四部分就是段头,这些段头用来描述段的一些属性,段头的格式大小是固定的。通过段头就能找到对应段。


这里面RVA指定装载这个段的虚拟内存地址(要加个基址) Virtual Size 表示段的大小。

最下面就是各种段

.edata段包含了应用程序或DLL的导出数据。在这个段出现的时候,它会包含一个到达导出信息的导出目录。

.text段Windows 3.1和Windows NT之间的一个区别就是Windows NT默认的做法是将所有的代码段(正如它们在Windows 3.1中所提到的那样)组成了一个单独的段,名为“.text”。既然Windows NT使用了基于页面的虚拟内存管理系统,那么将分开的代码放入不同的段之中的做法就不太明智了。因此,拥有一个大的代码段对于操作系统和应用程序开发者来说,都是十分方便的。

.text段也包含了早先提到过的入口点。IAT亦存在于.text段之中的模块入口点之前。(IAT在.text段之中的存在非常有意义,因为这个表事实上是一系列的跳转指令,并且它们的跳转目标位置是已固定的地址。)当Windows NT的可执行映像装载入进程的地址空间时,IAT就和每一个导入函数的物理地址一同确定了。要在.text段之中查找IAT,装载器只用将模块的入口点定位,而IAT恰恰出现于入口点之前。既然每个入口拥有相同的尺寸,那么向后退查找这个表的起始位置就很容易了。(copy来的)

.idata段是导入数据,包括导入库和导入地址名称表。虽然定义了IMAGE_DIRECTORY_ENTRY_IMPORT,但是WINNT.H之中并无相应的导入目录结构。作为代替,其中有若干其它的结构,名为IMAGE_IMPORT_BY_NAME、IMAGE_THUNK_DATA与IMAGE_IMPORT_DESCRIPTOR。在我个人看来,我实在不知道这些结构是如何和.idata段发生关联的,所以我花了若干个小时来破译.idata段实体并且得到了一个更简单的结构,我名之为IMAGE_IMPORT_MODULE_DIRECTORY。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值