当前位置: 代码迷 >> 汇编语言 >> pe结构求教!该怎么解决
  详细解决方案

pe结构求教!该怎么解决

热度:1825   发布时间:2013-02-26 00:00:00.0
pe结构求教!!
虚拟内存中的节填充后是紧密放置的吗??
有一个例子是:
第三个节 3.data virtualaddress是00024000 raw data size是00004000
第四个节 4.idata virtualaddress是0002A000 
节按1000h填充的
这是为什么啊啊?
我觉得的是第四个节的virtualaddress应该是00028000
那00028000到0002A000这中间可能是什么东西呢?? 



------解决方案--------------------------------------------------------
这个,还要看 Virtual Size 吧;也不一定是紧密放置的。而且,这些 size 和 address ,在实际载入时,还可能会被调整。刚才对比个程序文件和内存里的映像,就发现有个节的大小增大了,导致后续节的起始地址都跟着变了,否则就和占了前一节的空间了。
------解决方案--------------------------------------------------------

文件头、各种段 在磁盘和内存中都需要对齐边界

一般在磁盘中为 200h (bytes) = 0.5 Kb
一般在内存中为1000h (bytes) = 4 Kb

为什么说一般呢?
因为 文件对齐 和 内存对齐 是PE文件 可选头(IMAGE_OPTIONAL_HEADER32)中的两个字段
IMAGE_OPTIONAL_HEADER32.SectionAlignment (内存对齐颗粒)
IMAGE_OPTIONAL_HEADER32.FileAlignment (文件对齐颗粒)

详细信息请看《Windows PE 权威指南》
------解决方案--------------------------------------------------------
virtualsize是随便设置的,只要对齐就行.

如果比rawsize大,那比rawsize大的内存是存在的,但一般没有用(这取决于你自己的程序).

了解pe文件结构,最好读下windows泄漏的源码 看看windows对pe文件的校验.很多畸形的pe文件,不严格符合pe格式,但windows也能执行. 楼主说的算是很正常的了.
------解决方案--------------------------------------------------------
VirtualAddress(Offset)对应VirtualSize
Raw data Offset才对应Raw data size

比如某两节
.text VOffset=0x1000,VSize=0x51639,ROffset=0x400,RSize=0x51800
.data VOffset=0x53000,VSize=0x1725A,ROffset=0x51C00,RSize=0x17400

可以看出
VOffset1 + VSize1 = 0x52639 != VOffset2, 因为内存是按页分配的, 所以VOffset2取0x53000
ROffset1 + RSize1 = 0x51C00 == ROffset2, 地址是连续的, 为什么呢?因为已经对齐了,PE文件中有时你会发现一大段0就是这个原因。
------解决方案--------------------------------------------------------
那个raw data size是存储在文件磁盘上的大小
你说的那个4.idata virtualaddress是0002A000 这是映射到内存之后的偏移
一个文件的一个内存的不能这样加法运算
  相关解决方案