2016-04-21 94 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()大小相同,并从存储中读回内容。请注意,您不能将指针存储在磁盘上,并希望在将它们加载回新的会话时它们确实有效。

相关问题