首页
社区
课程
招聘
[旧帖] [求助]内存映射PE文件的问题 0.00雪花
发表于: 2012-2-19 16:26 1648

[旧帖] [求助]内存映射PE文件的问题 0.00雪花

2012-2-19 16:26
1648
http://bbs.pediy.com/showthread.php?t=64036
看雪上这个帖子说
内存映射文件和PE装载虽然都是将PE文件装入内存,不过,PE装载器将PE文件装入内存虽然没有改变PE文件的结构,但装载器对文件进行过对齐操作,每个PE节区以1000为对齐,改变各个节区的偏移地址,这一点和内存映射不同,内存映射并不对PE文件进行PE节区对齐。其文件内容偏移和磁盘文件里是一样的。而IAT所保存的地址是PE装载后对齐了节区之后的偏移,和磁盘文件的偏移不同,所以需要进行RavToOffset的转换。  
这个地方是这样的吗?
为什么我映射后就是按节对齐了啊?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 153
活跃值: (29)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
搞不懂怎么还有一个内存映射文件?是不是指用winhex之类的查看pe文件的时候?
如果是这样的话,那么内存映射的文件查看到的不就是文件在硬盘上的样子咯?
2012-2-19 17:05
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
createfilemapping呀
2012-2-19 17:37
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主你想吓死我啊。。。

我还以为我以前的知识是错的呢。

去试了下,我其实没错。

实际上,PE文件里面对节的对齐是强制的,必须对齐到页边界4096字节处。

RVA没有对齐的,运行的时候会提示不是有效的win32执行文件,至少在我win7 32bit上是这样

实际上楼主你的那个说法只是在强调内存映射不需要作对齐而已。

顺便说下,基地址不止要在4096字节边界对齐,还必须按64k对齐。
2012-2-19 18:07
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那到底是跟磁盘文件一样还是按区段对齐对齐的额
恕我愚钝
2012-2-19 22:52
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
意思就是说PE文件的映射是预先对齐的,不需要Windows再去做对齐了。

没有预先对齐的文件被认为是无效的。
2012-2-19 23:03
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大概看明白了。。

这个问题真是越来越混乱。建议楼主不要看你引用的那段话了。

说不上是误人子弟,但是是自己在绕圈子。有点谭浩强的风格。。

原话是“内存映射并不对PE文件进行PE节区对齐".

它这里说的是自己做文件映射。
文件映射是一个通用的机制,方便你以一种特殊的风格操纵文件的,而且充分利用了内存分页因此效率很高。

文件映射可以映射任何文件,而且没有对齐的要求。

这里的意思是,对任何文件的映射,都没有对齐的要求。
好吧。。PE文件也是文件对吧。没错,PE文件映射的时候自然也没有对齐
上面红字是完完全全的废话。这有必要专门说一次么?

如果楼主对C\C++\Delphi这样的本地语言有经验的话,可以去学学利用内存映射来操纵文件
比较有趣一点的例子就是利用内存映射来在2个不同进程间交换大量信息。

这样等楼主清晰的明白了内存映射本身之后,就不会再被这句话迷惑了。
2012-2-19 23:11
0
游客
登录 | 注册 方可回帖
返回
//