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

《加密解密 技术内幕》4.31 传递给异常处理例程的参数

更新时间:2008-3-18 0:28:20
责任编辑:阿loosen
热 点:
SEH IN ASM 研究

第二部分提高篇

                                        By Hume[AfO]/冷雨飘心

PART II   继续深入

 

三、传递给异常处理例程的参数

 

    I、传递给final型的参数,只有一个即指向EXCEPTION_POINTERS结构的指针, EXCEPTION_POINTERS定义如下:

       EXCEPTION_POINTERS STRUCT

        pExceptionRecord  DWORD      ?               

       ContextRecord     DWORD      ?

      EXCEPTION_POINTERS ENDS

 

    执行时堆栈结构如下:

                 esp    -> ptEXCEPTION_POINTERS 

                然后执行call _Final_Handler

注意堆栈中的参数是指向EXCEPTION_POINTERS 的指针,而不是指向pExceptionRecord的指针

                 

                 

以下是EXCEPTION_POINTERS两个成员的详细结构

        EXCEPTION_RECORD STRUCT

          ExceptionCode         DWORD      ?       ;异常码

          ExceptionFlags        DWORD      ?       ;异常标志

          PExceptionRecord     DWORD      ?      ;指向另外一个EXCEPTION_RECORD的指针

          ExceptionAddress      DWORD      ?       ;异常发生的地址

          NumberParameters      DWORD      ?       ;下面ExceptionInformation所含有的dword数目

          ExceptionInformation  DWORD EXCEPTION_MAXIMUM_PARAMETERS dup(?)

        EXCEPTION_RECORD ENDS                      ;EXCEPTION_MAXIMUM_PARAMETERS ==15

 

;================具体参数解释========================================

ExceptionCode 异常类型,SDK里面有很多类型,但你最可能遇到的几种类型如下:

              C0000005h----读写内存冲突

              C0000094h----非法除0

              C00000FDh----堆栈溢出或者说越界

              80000001h----由Virtual Alloc建立起来的属性页冲突

              C0000025h----不可持续异常,程序无法恢复执行,异常处理例程不应处理这个异常

              C0000026h----在异常处理过程中系统使用的代码,如果系统从某个例程莫名奇妙的返回,则出现此代码,例如调用RtlUnwind时没有Exception Record参数时产生的异常填入的就是这个代码

              80000003h----调试时因代码中int3中断

              80000004h----处于被单步调试状态

              注:也可以自己定义异常代码,遵循如下规则:

              _____________________________________________________________________+

 

      位:       31~30            29~28           27~16          15~0

              _____________________________________________________________________+

    含义:     严重程度          29位            功能代码        异常代码

              0==成功         0==Mcrosoft     MICROSOFT定义   用户定义

              1==通知         1==客户

              2==警告          28位

              3==错误         被保留必须为0

ExceptionFlags 异常标志

              0----可修复异常

              1----不可修复异常

              2----正在展开,不要试图修复什么,需要的话,释放必要的资源

pExceptionRecord 如果程序本身导致异常,指向那个异常结构

ExceptionAddress 发生异常的eip地址

ExceptionInformation 附加消息,在调用RaiseException可指定或者在异常号为C0000005h即内存异常时(ExceptionCode=C0000005h) 的含义如下,其他情况下一般没有意义

              第一个dword 0==读冲突 1==写冲突

第二个dword 读写冲突地址

 

;==========CONTEXT具体结构含义================================

 

        CONTEXT STRUCT                     ; _                  

          ContextFlags  DWORD      ?       ;  |---------------  +00

          iDr0          DWORD      ?       ;  |                 +04

          iDr1          DWORD      ?       ;  |                 +08

          iDr2          DWORD      ?       ;   >调试寄存器       +0C

          iDr3          DWORD      ?       ;  |                 +10

          iDr6          DWORD      ?       ;  |                 +14

          iDr7          DWORD      ?       ; _|                 +18

          FloatSave     FLOATING_SAVE_AREA <>  ;浮点寄存器区      +1C~~+88

          regGs         DWORD      ?       ;--|                 +8C

          regFs         DWORD      ?       ;  |\段寄存器         +90        

          regEs         DWORD      ?       ;  |/                +94

          regDs         DWORD      ?       ;--|                 +98

          regEdi        DWORD      ?       ;____________        +9C 

          regEsi        DWORD      ?       ;       |  通用      +A0   

          regEbx        DWORD      ?       ;       |   寄       +A4

          regEdx        DWORD      ?       ;       |   存       +A8

          regEcx        DWORD      ?       ;       |   器       +AC

          regEax        DWORD      ?       ;_______|___组_      +B0    

          regEbp        DWORD      ?       ;++++++++++++++++    +B4

          regEip        DWORD      ?       ;    |控制           +B8

          regCs         DWORD      ?       ;    |寄存           +BC

          regFlag       DWORD      ?       ;    |器组            +C0

          regEsp        DWORD      ?       ;    |               +C4  

          regSs         DWORD      ?       ;+++++++++++++++++   +C8

          ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)

        CONTEXT ENDS

1 2 3 4 下一页

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