繁体   English   中英

即使程序终止,Windows 是否也会存储变量的地址?

[英]Does Windows store the the address of a variable even when the program terminates?

在 Windows 中,我正在运行一个 C 程序,该程序使用 MinGW 打印在主 function 中声明的局部变量的地址。

int main(void){
   int a;
   printf("%p\n",&a);
   return 0;
}

我编译了一次......并多次运行可执行文件(a.exe)。

0061FF1C
0061FF1C
.
.

我已经在 Linux 以及在线编译器上检查了相同的程序。 它在那里工作正常。 为什么Windows存储的是局部变量的地址? 即使它正在存储变量,它如何解释哪个变量存储在该位置?

首先,windows 没有存储局部变量的地址。 它使用相同的 memory 地址来运行程序。

如果您阅读这篇文章: https://www.mandiant.com/resources/six-facts-about-address-space-layout-randomization-on-windows

“在 ASLR 的 Linux 实现中使用的 ELF 映像可以在共享库中使用与位置无关的可执行文件和与位置无关的代码,以便在每次启动时为主程序及其所有库提供新的随机地址空间——共享同一台机器即使在不同地址加载多个进程之间的代码。Windows ASLR 不能以这种方式工作。相反,每个 DLL 或 EXE 映像都由 Z50484C19F1AFDAF3841A0D821ED3841A0D821ED393DZ 的第一次使用的附加实例分配一个随机加载地址DLL 或 EXE 被加载,它们接收到相同的加载地址。如果一个映像的所有实例都被卸载并且随后再次加载该映像,则该映像可能会或可能不会收到相同的基地址;见事实 4。只有重新启动才能保证新鲜系统范围内所有图像的基地址。”

这就是 windows 管理 ASLR 的方式。 现在,当您重新运行程序时,它将显示相同的 memory 地址。 因为它使用相同的地址。 现在,如果您重新启动 PC 并重新运行程序,这次 ASLR 将更改地址。 所以你会看到不同的地址。

这与 windows 的安全性有关。 Linux 以不同的方式实现 ASLR,因此它显示不同的地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM