c-即使程序终止,Windows是否存储变量的地址



在Windows中,我使用MinGW运行一个C程序,该程序打印主函数中声明的本地变量的地址。

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

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

0061FF1C
0061FF1C
.
.

我已经在Linux和在线编译器上检查了相同的程序。那里工作得很好。为什么Windows存储本地变量的地址?即使它在存储变量,它如何解释哪个变量存储在那个位置?

首先,windows不存储本地变量的地址。它使用相同的内存地址来运行程序。

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

"在ASLR的Linux实现中使用的ELF映像可以使用中的位置无关可执行文件和位置无关代码共享库,为主程序及其所有库在每次启动时共享多个进程之间的机器代码,即使在加载位置不同的地址。Windows ASLR不能以这种方式工作。相反通过内核,并作为DLL或EXE加载时,它们接收相同的加载地址。如果全部图像的实例被卸载,然后该图像被再次加载时,图像可以接收也可以不接收相同的基本地址;参见事实4。只有重新启动才能保证所有用户都有新的基地址全系统的图像">

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

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

最新更新