安全中国首页 > 文章中心 > 编释语言
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

《加密解密 技术内幕》4.32 关于异常处理的嵌套和堆栈展开

更新时间:2008-3-18 0:29:49
责任编辑:阿loosen
热 点:

 

@unwind2:

        invoke    MessageBox,0,CTEXT("hmmm... unwinding in xhandler2..."),addr sztit,40h

@cantdo2:

        popad

        MOV     EAX,ExceptionContinueSearch

RET

per_xHandler2 ENDP

;-----------------------------------------

 

per_xHandler3 PROC C pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD

pushad

        MOV     ESI,pExcept

ASSUME  ESI:PTR EXCEPTION_RECORD

        MOV     EDI,pContext

ASSUME  EDI:PTR CONTEXT       

 

        TEST    [ESI].ExceptionFlags,1

        JNZ     @cantdo3

        TEST    [ESI].ExceptionFlags,6

        JNZ     @unwind3

        ;-----------------------------------------

                                                    

        push    ecx

        mov     ecx,cs

        xor     cl,cl

        jecxz   win2k_Xp        

 win9X: 

        pop     ecx

        CMP     [ESI].ExceptionCode,0C000001DH       ;非法指令异常,与2K/XP下的不一致

        JNZ     @cantdo3

        jmp     ok_here

win2k_Xp:

        pop     ecx                                  ;注意,只有在9X下才可以

        CMP     [ESI].ExceptionCode,0C000001EH       ;非法指令异常->2K/XP

        JNZ     @cantdo3                             ;sMc不成

 

        mov     [edi].regEip,offset safereturn

        popad

        mov     eax,0

        ret

        

        

        

        push    ebx

        push    esi

        push    edi       

comment $Content$nbsp;调用RtlUnwind展开堆栈        

        lea     ebx,unwindback

        invoke    RtlUnwind,Expt3_frm,ebx,esi,0

        $

        mov     dword ptr [esi+4],2               ;置展开标志,准备展开,这里是

                                               ;手动代码

        mov     ebx,fs:[0]

        

 

selfun:

        ;mov     eax,Expt2_frm                 ;这里显示了ASM手动展开的灵活性

        mov     eax,Expt3_frm                       

        cmp     ebx,eax                    ;按照Jeremy Gordon的好像不大对头

        ;cmp     dword ptr [ebx],-1         ;这样好像有问题,只好如上,请教答案           

        jz      unwindback

        push    ebx

        push    esi                    ; 压入Err和Exeption_registration结构

        call    dword ptr[ebx+4]

        add     esp,8

        mov     ebx,[ebx]

        jmp     selfun

 

unwindback:

        invoke    MessageBox,0,CTEXT("I am Back!"),addr sztit,40h

        pop     edi

        pop     esi

        pop     ebx                              ;一定要保存这三个寄存器!

 

        MOV     EAX,[EDI].regEip

        MOV     DWORD PTR[EAX],90909090H  ;改为nop指令...SMC? 很简单吧

                                               ;SMC注意连接/section:RWE

        popad

        MOV  EAX, ExceptionContinueExecution

        RET

上一页 1 2 3 4 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画