2016-04-21 95 views
0

基本上我想知道的是,如果我想在程序執行之間保存RAM中的數據;因爲如果我寫下RAM中我要保存的內容,那麼在程序結束後我可以將信息存儲在RAM中。我可以這樣做:即使程序關閉,是否可以將程序數據保存在RAM中?

int *p = 10; 
send_to_database(p); // Send the location in memory to some server 
p = null_ptr; 
del p; 

The program finishes running 

The program starts running again 
int *p; 
p = get_from_db(user_token); 

我想我真的想知道的是我可以故意泄漏內存,但稍後再回來嗎?它不會被任何類型的垃圾收集處理,因爲現在我們會簡單地忘記它的位置。然後下一次我運行這個程序時,我會查看我在RAM中存儲了什麼東西,然後將它重新加載回來。

只是沒有人會感到震驚,這是一個純粹的理論問題。我想到,你可以做一些非常時髦的用戶身份驗證,只要計算機沒有關閉,它只會持續登錄。由於身份驗證令牌會保存到每個人的計算機上的不同位置,這讓我覺得在程序關閉時難以搜索到身份驗證令牌的位置。

+0

程序關閉後操作系統是否會清除所有分配的內存(包括泄漏的內存)?請注意,我不知道這一點,但這是我看到我自己的內存泄漏(Visual Studio + Windows 7) – DrDonut

+0

@DDDonut我認爲,當VS運行的東西,它可以跟蹤內存使用更好比操作系統通常會。儘管我可以完全做到這一點。我不確定是否新版操作系統會對每個程序進行沙盒處理,或者它們是否允許您寫入任何可用內存。 –

+0

這可能是,我不知道。另外一點:一旦我試圖讓一個程序寫入另一個程序的內存空間作爲共享數據的手段,這就使用了gcc和Windows XP。我無法得到這個工作,但看看這個:http://doc.qt.io/qt-5/qtcore-ipc-sharedmemory-example.html – DrDonut

回答

0

假設我們正在談論你的普通日常電腦:不,這是不可能的。

首先,您的程序正在從C++內存管理器分配內存,而C++內存管理器依次從操作系統分配內存。
當進程退出時,操作系統回收進程正在使用的所有內存。

此外,您的程序正在分配的內存駐留在虛擬內存 - 每個進程都有自己的相同地址空間。
它被操作系統和硬件映射到物理內存中的位置。
實際上,甚至沒有任何保證,即在同一執行過程中,每次訪問程序時,程序中的地址都將映射到相同的物理RAM位置。

此外,攻擊者找出令牌的位置是微不足道的(ish)。
(找出一個方法作爲練習)

0

簡答題號碼。當進程存在時,一個進程的內存被擦除,當一個進程開始時,它從頭開始。否則你會有一個重大的安全問題。

那麼你想做什麼,是存儲什麼p指向。當您重新啓動時,您的malloc()大小相同,並從存儲中讀回內容。請注意,您不能將指針存儲在磁盤上,並希望在將它們加載回新的會話時它們確實有效。

相關問題