我试图使用以下代码搞乱内存,但更改值不会影响系统操作。
byte obj = 0;
byte* pointer = &obj;
for (int i = 0; i < 2000; i++)
{
pointer[i] = 0;
// or
// *(pointer++) = 0;
Console.WriteLine(i);
}
程序打印所有i
但在上一次迭代中停止工作。有时它会在迭代中间抛出访问冲突异常。
我不是想创造病毒或任何东西。很长一段时间,我脑子里都有关于指针和记忆的问题。我只想更好地了解它是如何运作的。
答案 0 :(得分:3)
指针[0]后的值是多少。内存的真实内容?
是的,确实如此。好吧,这些日子就像记忆一样真实。
当你指向一个局部变量时,它将是堆栈中的内存。您将覆盖局部变量,然后是方法的返回地址,然后堆栈中的数据用于降低方法。这就是为什么当你试图离开这个方法时崩溃的原因。
为什么将所有字节设置为0不会影响系统操作?
因为每个应用程序都位于完全独立的虚拟内存空间中。您无法在操作系统内存中写入内容,因为它不存在于应用程序的虚拟内存空间中。
是什么保护内存不被更改?(这会抛出Access 违反)。
您的应用程序在虚拟内存空间中的区域有限,可以访问内存。当您尝试访问该区域之外的内存时,系统将扩展虚拟空间或不允许它,具体取决于您访问的内存。
如果它是一个进程或线程(违反访问权限),那么它应该 存储在内存中。那怎么能保护自己呢?
该过程无法完全受到保护,因为您必须能够访问某些内存才能使用。您可以破坏自己的进程,但是您不能破坏其他进程,因为它们位于自己的虚拟内存空间中。
答案 1 :(得分:2)
操作系统(与MMU一起)可防止进程访问属于其他进程的内存。你需要像WriteProcessMemory这样的东西来搞乱其他进程的记忆。
答案 2 :(得分:1)
您正在将零写入obj
而非内存地址0的地址。
obj
很可能是CLR堆中的某个地方。