簡體   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