剧集

访问冲突C0000005 - 执行

当应用程序尝试从无效的内存地址执行代码时,将发生“执行访问冲突”。 若要有效,内存页必须具有有效的状态保护和类型

内存必须处于MEM_COMMIT 状态

内存可以是任何类型的;MEM_IMAGE、MEM_MAPPED或MEM_PRIVATE。 绝大多数是MEM_IMAGE。 MEM_PRIVATE用于实时 (JIT) 代码 - 主要示例是 JavaScript。

必须PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_WRITECOPY保护内存。 绝大多数是PAGE_EXECUTE_READ。 PAGE_EXECUTE_READWRITE和PAGE_EXECUTE_WRITECOPY很少见,可以被视为危险,因为可以修改代码(注入)。

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

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

处理器通过 数据执行保护检测到冲突。

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

  • 堆栈损坏 - 调用的返回地址在堆栈上推送。 局部变量位于此位置旁边。 如果本地缓冲区溢出,则返回地址已损坏。
  • DLL 引用计数 - 地址 有效 ,但在卸载 DLL 后正在访问
  • 位翻转 - RAM(硬件)问题:一个或多个位已翻转(罕见)

其他资源:

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