自修改程序:为什么会引发异常?

时间:2013-08-14 04:47:43

标签: exception assembly x86 64-bit x86-64

为了试验和玩耍,我编写了以下简短的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?

1 个答案:

答案 0 :(得分:0)

我住在Linux世界,但也许你可以调整我发现的东西。

如果内存页面具有执行权限,则它们通常是只读的。我是如何解决这个问题的方法是使用mmap()和mprotect()......我确信在Windows中有类似的东西。这是一个很好的选择,Mono源代码可以提供一些亮点。

我使用mmap()来分配一个具有写访问权限的新页面(但不是读取或执行)。我填充它,然后调用mprotect()将其更改为只读和可执行。

不要忘记......有些寄存器要避免垃圾。有关详细信息,请参阅ABI文档。