首页
社区
课程
招聘
[求助]vc++6.0如何才能编译出可重定位的exe文件
发表于: 2012-7-15 13:00 7020

[求助]vc++6.0如何才能编译出可重定位的exe文件

2012-7-15 13:00
7020
在编译可执行文件时,如果我们把vc++6.0的“输出基地址”设置成与kernel32.dll的基地址相同,其结果是:编译链接出来的exe文件无法被运行,提示是:进程内存写错误.原因是加载器把kernel32.dll的加载地址当成了exe的加载地址,于是摸块加载地址冲突了,又因为在编译exe文件时,已经假定exe的地址是个总是可以加载的,所以vc++6.0没有对exe编译重定位信息.要怎样设置vc++6.0编译出的exe文件可以像编译dll文件一样当优先加载地址不能满足时,进行重定位加载?

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 62
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
设置基址为0即可强制编译器产生重定位信息(也可以在链接时设置为:/fixed:no)
或者直接在链接器选项中添加/base:0x10000000也可以。
比如像我这样:
上传的附件:
2012-7-15 16:41
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=凭凡;1087635]设置基址为0即可强制编译器产生重定位信息(也可以在链接时设置为:/fixed:no)
或者直接在链接器选项中添加/base:0x10000000也可以。
比如像我这样:
[/QUOTE]

如果我在链接时设置为:/fixed:no  并且把输出基地址设置为:0x7C100000(我调试时Ntdll.dll的基地址), 那么链接出来的exe文件是否可以执行?exe文件加载时会重定位吗?
2012-7-16 03:04
0
雪    币: 62
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
我在自己电脑试了一下,可以的。不过我不明白你为什么要这样做。
2012-7-16 09:42
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
5
我在链接时设置为:/fixed:no  并没有解决问题。设置输出地址为0时,程序可以正常运行。

我是在写一个壳程序,我需要把壳程序伪装在ntdll.dll内存地址运行。所以当如用: _asm eax,offset  Text000;时将会把Text000的编译地址给eax,此时壳程序的这个立即数如果是ntdll.dll的一个地址,就有妨碍调试的目地,给别人增加对壳程序的理解罢了。
2012-7-17 13:10
0
游客
登录 | 注册 方可回帖
返回
//