我想使用一个来自汇编的异常/陷阱处理程序,但我不知道如何实际修改违规帧的上下文。
我的代码:
_TEXT segment para 'CODE'
MyHandler proc
call printout
ret
MyHandler endp
public SyntaxTest
SyntaxTest proc frame:MyHandler
.endprolog
ud2
.beginepilog
ret
SyntaxTest endp
_TEXT ends
现在,当执行ud2
时,代码跳转到MyHandler
,调用printout
函数(在其他地方实现),然后在完全相同的位置继续执行,从而创建一个无限循环。
1条答案
按热度按时间nafvub8i1#
MyHandler
(FRAME:ehandler-address 中的函数)这是所谓的特定于语言的处理程序。因此它必须具有签名:如果你想继续执行-你必须返回
ExceptionContinueExecution
和修改ContextRecord
-的Rip
(说Rip += 2
跳过ud2
).在printout
可能返回0,但你不修复Rip
的结果ud2
再次执行.绝对最低,演示代码当然在真实的的代码中需要分析exeption的来源,并在此基础上选择需要做的事情。但不要硬编码
rip += 2
并继续。