用指针改变内存的内容
本文关键字:内存 指针 改变 | 更新日期: 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堆的某处