首页
社区
课程
招聘
[讨论]EXE的重定位问题
发表于: 2008-11-11 14:07 6483

[讨论]EXE的重定位问题

2008-11-11 14:07
6483
很多书上讲EXE是不会被重定位的(也许这句话我说的不是绝对的,因为书上好象也没有这样绝对的说过)。

但是我发现了一点点问题。

我写了一个简单的程序,我的程序对一个EXE用CreateFile()、CreateMapping()、MapViewOfFile()三个函数进行操作,也就是对一个EXE文件进行映射。然后对这个被映射的EXE文件进行PE定位,也就是想得到指向NT头的指针的。

然后得到的指针是:003900D8,这个00390000想必是映射的基地址,因为000000D8我知道在磁盘文件上是DOS头中e_lfanew的值的。但是我对这个基地址为什么会是00390000有点疑虑。我就用OD进行跟踪,跟踪到MapViewOfFile()这个API的下一条指令后,我看了一下eax寄存器,eax的值为003B0000。而得到的NT头的指针可想而知的就是003B00D8了。

我是想知道。为什么OD跟踪到的MapViewOfFile得到的基地址和直接执行得到的基地址不同。这个也算是对EXE的基地址进行重定位了,但为什么DLL重定位就需要有.reloc节,而不能向EXE这样?

我是个菜鸟,也许问题问的比较简单,也比较可笑。但真心希望高手指点一二。谢谢了!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 175
活跃值: (64)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
不好意思,浪费了看雪的一个宝贵的地方,问了一个这么没有价值的问题。问完这个问题刚好在QQ上看到“玩命”大哥,便向他请教了一下。

玩命大哥如是说:

这个不叫做重定位 也不叫做映射

这是正常的

你有一个概念的混淆

一般说的映射 是指的 PE加载器加载PE文件到内存中 要执行这个过程叫做映射 当然不会进行重定位 DLL会。。。
但是你这个映射 是指的 把文件打开读取到内存中 其实就像是CreateFile ReadFile -> Buf 这个过程一样的。 此映射和彼映射不一样

我的对玩命大哥话的理解:
意思是,我说的这个映射只是读到自己的进程空间里了,而没有像PE装载器那样把它新放到一个进程空间中。
因此说,用MapViewOfFile映射的概念跟windows装载器的概念完全是两个概念。

玩命大哥后来的话:
不过也一样 也不一样 呵呵 如果你自己写PE加载器的话 也可以用这个函数。。。 PE装载器转载的时候也要先把文件读入到内存中 不过要按照PE头的一些字段对内存进行修改。。。
如果你自己写虚拟机等 可以这样做。。。 都是一样的
只不过是你概念上不同。。。

最后还是感谢玩命大哥的帮助呀~!~!
看来是我有时概念混淆~!~!
2008-11-11 14:28
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
EXE可能也有重定位表的,不能绝对地说都没有。大部分EXE没有重定位表是因为:EXE作为独立的可执行程序,它初始化时系统会给它分配独立的进程内存空间,这个刚分配的内存空间肯定是可以分配一块与EXE的ImageBase相同地址的内存来装载EXE本身,因此通常不需要重定位。而DLL没有独立的进程空间,必须依附于某个EXE,如果两个DLL的映像基址都是0x10000000,第一个可以加载到这个位置,后加载的肯定得换个位置,这时就得进行重定位,因此必须要准备重定位表。MapViewOfFile映射到内存后的文件与硬盘上的组织方式是一样的,而LoadLibrary才是真正的按PE格式加载到内存。具体怎么进行重定位,可以参考我博客上的一篇文章。http://hi.baidu.com/_achillis
2008-11-11 14:43
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
手机打字太慢了,打完了发现我的沙发没了,呵呵
2008-11-11 14:45
0
雪    币: 175
活跃值: (64)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
感谢感谢~!~!
用手机都能回帖,精神可佳呀!!
2008-11-11 14:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
dll映射到4G的exel平坦的进程空间,ImageBase可以修改的
2008-11-11 17:00
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7

应该说是加载的基址可以修改
2008-11-11 18:34
0
游客
登录 | 注册 方可回帖
返回
//