用指针改变内存的内容

本文关键字:内存 指针 改变 | 更新日期: 2023-09-27 18:10:45

我试图用下面的代码弄乱内存,但改变值并不影响系统运行。

byte obj = 0;
byte* pointer = &obj;
for (int i = 0; i < 2000; i++)
{
    pointer[i] = 0;
    // or 
    // *(pointer++) = 0;
    Console.WriteLine(i);
}

程序打印所有i,但在最后一次迭代中停止工作。有时会在迭代过程中抛出访问冲突异常。

  • 指针[0]后面的值是多少?记忆的真实内容?
  • 为什么将所有字节设置为0不影响系统运行?
  • 什么保护内存不被更改?(这会引发访问冲突)。
  • 如果它是一个进程或线程(违反访问),那么它应该被存储在内存本身。那么它如何保护自己呢?

我不是想制造病毒什么的。我有一个关于指针和内存的问题很久了。我只是想更好地理解它是如何工作的

用指针改变内存的内容

指针[0]后面的值是什么?记忆的真实内容?

是的,它是。好吧,就像现在的记忆一样真实。

当你指向一个局部变量时,它将是堆栈中的内存。您将重写局部变量,然后是方法的返回地址,然后是堆栈上的数据。这就是为什么当你试图离开这个方法时它会崩溃的原因。

为什么将所有字节设置为0不影响系统运行?

因为每个应用程序都在一个完全独立的虚拟内存空间中。您不能在操作系统内存中写入,因为它不存在于应用程序的虚拟内存空间中。

是什么保护内存不被改变?(这会抛出Access违反)。

应用程序在虚拟内存空间中有一个有限的区域可以访问内存。当您尝试访问该区域以外的内存时,系统将扩展虚拟空间或不允许它,这取决于您访问的内存。

如果它是一个进程或线程(违反了访问),那么它应该存储在内存中。那么它如何保护自己呢?

进程不能完全保护自己,因为你必须能够访问一些内存来工作。您可以破坏自己的进程,但不能破坏其他进程,因为它们在自己的虚拟内存空间中。

操作系统(连同MMU)阻止进程访问属于其他进程的内存。您将需要像WriteProcessMemory这样的东西来混淆其他进程的内存。

您正在将0写入obj的地址,而不是内存地址0。

obj很可能在CLR堆的某处