我正在尝试学习如何在使用MASM64编译的64位Windows可执行文件中使用结构化异常处理(SEH)。
到目前为止,让我们举一个简单的例子。我的测试目标是抑制此函数中的无效操作异常:
.data
holdPrevRSP QWORD ?
.code
ExceptionFrm PROC
; Exception handler?
mov rsp, [holdPrevRSP]
; int 3 ; tried to invoke debugger manually
add rsp, 100h
pop r15
pop r14
pop r13
pop r12
pop rsi
pop rsi
pop rbp
pop rbx
ret
ExceptionFrm ENDP
TestFunc PROC FRAME:ExceptionFrm
; Define prolog:
; Need to save:
; RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15
push rbx
.pushreg rbx
push rbp
.pushreg rbp
push rdi
.pushreg rdi
push rsi
.pushreg rsi
push r12
.pushreg r12
push r13
.pushreg r13
push r14
.pushreg r14
push r15
.pushreg r15
.ENDPROLOG
; really primitive way to restore RSP
; i know it's not multi-threaded safe!
; It's just for this test...
mov [holdPrevRSP], rsp
; define home stack for this function
sub rsp, 100h
db 62h, 0, 0, 0, 0, 0 ; should raise invalid opcode exception
; Epilog
add rsp, 100h
pop r15
pop r14
pop r13
pop r12
pop rsi
pop rsi
pop rbp
pop rbx
ret
TestFunc ENDP
END
我想我的问题是我不完全了解FRAME:
关键字的作用。
我正在使用Visual Studio 2017来运行此测试。当我使用调试器浏览此代码时,当我遍历invalid opcode
时,该过程将在该过程中其他不相关的位置引发调试器异常。
然后,我尝试在ExceptionFrm
内放置一个断点,但是它从未被调用。
那我在做什么错了?