DLL总是具有相同的基址吗?

Nag*_*agi 9 c windows

我正在研究windows和DLL的东西,我对它有一些疑问.:)

我做了一个加载我自己的DLL的简单程序.这个DLL只有简单的函数,加上减号.

这是一个问题:如果我加载一些DLL(例如text.dll),这个DLL是否总是具有相同的基址?或者重新启动时它会改变吗?我可以保存DLL的基地址吗?

当我测试它时,它总是有相同的基地址,但我想我需要做的时候,我必须对DLL基地址做一些例外.

Mik*_*kis 12

操作系统会将您的DLL加载到它喜欢的任何基址中.你可以指定一个"首选"基地址,但是如果它不可用,(无论出于什么原因,这可能完全超出你的控制范围),你的DLL将被操作系统重新定位到操作的任何地址系统认为合适.

  • 此外,现代版本的Windows采用一种方案(ASLR),其中DLL被映射到"随机"地址,以便通过"返回基于libc"的攻击来利用安全漏洞更加困难. (3认同)

vcs*_*nes 5

我加载一些DLL(例如,text.dll),这个DLL总是有相同的基地址吗?

不,这是一个首选的基地址.如果已经在该地址加载了某些内容,则加载程序将对其进行重新绑定并修复所有地址.

其他一些事情,如地址空间布局随机化可能会导致每次进程开始时它都不同.