为了试验和玩耍,我编写了以下简短的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?
答案 0 :(得分:0)
我住在Linux世界,但也许你可以调整我发现的东西。
如果内存页面具有执行权限,则它们通常是只读的。我是如何解决这个问题的方法是使用mmap()和mprotect()......我确信在Windows中有类似的东西。这是一个很好的选择,Mono源代码可以提供一些亮点。
我使用mmap()来分配一个具有写访问权限的新页面(但不是读取或执行)。我填充它,然后调用mprotect()将其更改为只读和可执行。
不要忘记......有些寄存器要避免垃圾。有关详细信息,请参阅ABI文档。