问题:

写了一个壳xp下运行正常,但在w7下运行没有任何提示程序就退出了,用od载入单步运行出错说是

然后看了一下原来是载入的地址不是程序的原地址0x400000,变为

但我确信在处理引导程序时我已经将重定位表擦除了,迷茫中。。。。。。。

用od重新载入发现基址又变了,好在由此可以肯定程序不能在w7下运行是因为在w7下每次载入程序时的基址是变化的。

解决:

用od载入我的引导程序发现他在w7下地址也是不停的变化的,然后在google上搜索了一下找到了看雪上的这个文章:

http://bbs.pediy.com/showthread.php?t=117096原来是连接器的问题:

将这个值改为”否”编译后用od载入发现文件的基址不再变化了,但问题也随之而来—–重定位表没了,这个引导程序必须有重定位表,因为要引导不同的程序必须重定位自身。

然后用lordpe对比了一下随机地址和固定基址的程序发现

这个值不同,用c32载入改40 81 为00 81发现程序有重定位表的时候基址也不会变化了。

 

自己的程序 链接选项里别选动态基址
别人的程序的话
pe头里Characteristics位0置1,表示没有重定位
或者DLLCharacteristics位6置0,表示不支持aslr技术
重新加载 基址一般就固定了

1

2