assembly 如何修改Windows/MASM中处理程序函数的指令指针?

gdrx4gfi  于 2023-03-30  发布在  Windows
关注(0)|答案(1)|浏览(132)

我想使用一个来自汇编的异常/陷阱处理程序,但我不知道如何实际修改违规帧的上下文。
我的代码:

_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函数(在其他地方实现),然后在完全相同的位置继续执行,从而创建一个无限循环。

nafvub8i

nafvub8i1#

MyHandlerFRAME:ehandler-address 中的函数)这是所谓的特定于语言的处理程序。因此它必须具有签名:

EXCEPTION_DISPOSITION __cdecl MyHandler(
    _In_ PEXCEPTION_RECORD ExceptionRecord,
    _In_ void * EstablisherFrame,
    _Inout_ PCONTEXT ContextRecord,
    _Inout_ PDISPATCHER_CONTEXT DispatcherContext
    );

如果你想继续执行-你必须返回ExceptionContinueExecution修改ContextRecord-的Rip(说Rip += 2跳过ud2).在printout可能返回0,但你不修复Rip的结果ud2再次执行.绝对最低,演示代码

CONTEXT STRUCT 16
    _P1Home DQ ?;
    _P2Home DQ ?;
    _P3Home DQ ?;
    _P4Home DQ ?;
    _P5Home DQ ?;
    _P6Home DQ ?;

    ;
    ; Control flags.
    ;

    _ContextFlags DD ?;
    _MxCsr DD ?;

    ;
    ; Segment Registers and processor flags.
    ;

    _SegCs DW ?;
    _SegDs DW ?;
    _SegEs DW ?;
    _SegFs DW ?;
    _SegGs DW ?;
    _SegSs DW ?;
    _EFlags DD ?;

    ;
    ; Debug registers
    ;

    _Dr0 DQ ?;
    _Dr1 DQ ?;
    _Dr2 DQ ?;
    _Dr3 DQ ?;
    _Dr6 DQ ?;
    _Dr7 DQ ?;

    ;
    ; Integer registers.
    ;

    _Rax DQ ?;
    _Rcx DQ ?;
    _Rdx DQ ?;
    _Rbx DQ ?;
    _Rsp DQ ?;
    _Rbp DQ ?;
    _Rsi DQ ?;
    _Rdi DQ ?;
    _R8 DQ ?;
    _R9 DQ ?;
    _R10 DQ ?;
    _R11 DQ ?;
    _R12 DQ ?;
    _R13 DQ ?;
    _R14 DQ ?;
    _R15 DQ ?;

    ;
    ; Program counter.
    ;

    _Rip DQ ?;
CONTEXT ENDS

.code
MyHandler proc
    add [r8][CONTEXT._Rip],2
    xor eax,eax
    ret
MyHandler endp

SyntaxTest proc frame:MyHandler
    .endprolog
    ud2
    .beginepilog
    ret
SyntaxTest endp
end

当然在真实的的代码中需要分析exeption的来源,并在此基础上选择需要做的事情。但不要硬编码rip += 2并继续。

相关问题