剧集
访问冲突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(硬件)问题:一个或多个位已翻转(罕见)
其他资源:
当应用程序尝试从无效的内存地址执行代码时,将发生“执行访问冲突”。 若要有效,内存页必须具有有效的状态、保护和类型。
内存必须处于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(硬件)问题:一个或多个位已翻转(罕见)
其他资源: