Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C DLL总是有相同的基址吗?_C_Windows - Fatal编程技术网

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

C DLL总是有相同的基址吗?,c,windows,C,Windows,我正在研究windows和DLL的内容,对此我有一些疑问。:) 我制作了一个简单的程序来加载我自己的DLL。这个DLL只有简单的函数,加、减 这就是问题:如果我加载一些DLL(例如,text.DLL),这个DLL是否总是具有相同的基址?或者当我重新启动它时它会改变?我可以保留DLL的基址吗 当我测试它时,它总是有相同的基址,但我认为当我需要这样做时,我必须对DLL基址做一些例外。操作系统将以它喜欢的任何基址加载DLL。您可以指定一个“首选”基址,但如果该基址不可用(无论出于何种原因,这可能完全超

我正在研究windows和DLL的内容,对此我有一些疑问。:)

我制作了一个简单的程序来加载我自己的DLL。这个DLL只有简单的函数,加、减

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


当我测试它时,它总是有相同的基址,但我认为当我需要这样做时,我必须对DLL基址做一些例外。

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

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

不是。它是首选的基址。如果某个地址已经加载了某个内容,加载程序将重新设置它的基址并修复所有地址


其他事情,例如,可能会导致每次进程启动时它都不一样。

这是我们在尝试解码GNAT运行时(Ada)发出的堆栈跟踪时遇到的DLL常见问题

当我们的可执行文件崩溃时,如果提供地址列表(回溯),我们就能够对给定的地址执行
addr2line
,并重建调用树而不会出现问题

在DLL上,情况并非如此(这就是为什么我高度怀疑这个问题与ASLR有关,否则可执行文件会有相同的随机移位),答案解释了“为什么”


现在要解决这个问题,您可以将给定符号(例如:
main
程序)的地址写入磁盘。在分析崩溃时,只需在映射文件中的符号地址和写入磁盘的地址之间执行差异。将此差异应用于您的地址,您将能够计算理论地址,从而计算调用堆栈。

ASLR将积极尝试将DLL放置在不同的位置。此外,现代版本的Windows采用一种方案(ASLR),将DLL映射到“随机”地址,以便通过基于“返回libc”的攻击更加困难。Bukes,这是选择性加入。但许多人忘记启用它。+1-不可能保证固定地址,但您可以通过