只是出于试验和玩耍的目的,我编写了以下简短的 x64 汇编程序:
.code
AsmFun proc
mov rax, MyLabel
mov byte ptr [rax], 0C3h ; C3 is x64 machine code for "ret"
MyLabel:
mov rax, 239847 ; This isn't "ret"
AsmFun endp
end
(然后我从 C 调用代码。)
它编译/组装/链接很好,但是当我浏览程序时,Visual Studio 抱怨已经引发了一个未处理的异常:“访问写入冲突为 [MyLabel]。”,当然它实际上并没有说“[MyLabel]”,而是恰好在内存中的地址。
为什么会这样?是为了避免安全漏洞而实施的 Windows 系统吗?