剧集

访问冲突C0000005 - 读取或写入

当应用程序尝试从无效的内存地址读取或写入内存时,会发生读取或写入访问冲突。 若要有效,内存页必须具有有效的状态保护和类型

内存必须处于MEM_COMMIT 状态

内存可以是任何类型的;MEM_IMAGE、MEM_MAPPED或MEM_PRIVATE。

对于读取操作,必须对内存的保护PAGE_READONLY、PAGE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_WRITECOPY。

对于写入操作,必须PAGE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_WRITECOPY保护内存。

若要查看地址的状态保护和类型,请使用 !address address <地址>

  • 请务必引用当前值;不是分配值
  • 每个内存页区域(最小 4K)都会跟踪分配时的初始保护值,以及由 VirtualProtect 系列函数设置的当前保护值。

由于以下常见方案之一,内存地址可能无效:

  • NULL 指针 - 0x0 和 0x10000 (64K) 之间的地址 - 例如通常返回的指针返回 NULL 的函数(0x0),并且该指针未经验证访问
  • 内存损坏 - 地址被错误或恶意覆盖 - 通常通过缓冲区溢出(或不足)
  • Use-After-Free - 地址有效,但在释放地址后即会访问该地址(数据)
  • 位翻转 - RAM(硬件)问题:一个或多个位已翻转(罕见)

其他资源:

想提供反馈? 在此处提交问题