SEH in ASM 研究(一)

SEH不起作用的问题跟踪 关建词 _except_handler4、_except_handler3、_ValidateEH3RN 问题: 写了一个程序(shell,你懂的),发现SEH捕捉不到异常,网上搜了一下没找到相关内容,下面的代码是为了写文章简单写的例子代码 __try { _asm int 3; } __except(1) { printf("except\r\n"); } 阅读详情
 
SEH  in ASM 研究(一)
                                            By Hume/冷雨飘心

为什么老调重弹:
    SEH出现已绝非一日,但很多人可能还不彻底了解Seh的运行机制;有关seh的知识资料不是很多,asm级的详细资料就
更少!seh不仅可以简化程序错误处理,使你的程序更加健壮,还被广泛应用于反跟踪以及加解密中,因此,了解seh非常必要,
但遗憾的是关于seh详细介绍的中文资料非常少,在实践的基础上,把自己学习的一点笔记奉献给大家,希望对喜欢ASM的朋
友有所帮助.如有错误,请高手不吝指正.

                                    PART  I  简单接触

一、SEH背景知识
SEH("Structured Exception Handling"),即结构化异常处理.是操作系统提供给程序设计者的强有力的处理程序错
误或异常的武器.在VISUAL C++中你或许已经熟悉了_try{} _finally{} 和_try{} _except {} 结构,这些并不是
编译程序本身所固有的,本质上只不过是对windows内在提供的结构化异常处理的包装,不用这些高级语言编译器所提供
的包装 ,照样可以利用系统提供的强大seh处理功能,在后面你将可以看到,用系统本身提供seh结构和规则以及ASM语言,
我们将对SEH的机制以及实现有一个彻底的了解.

发生异常时系统的处理顺序(by Jeremy Gordon):

    1.系统首先判断异常是否应发送给目标程序的异常处理例程,如果决定应该发送,并且目标程序正在被调试,则系统
    挂起程序并向调试器发送EXCEPTION_DEBUG_EVENT消息.呵呵,这不是正好可以用来探测调试器的存在吗?

    2.如果你的程序没有被调试或者调试器未能处理异常,系统就会继续查找你是否安装了线程相关的异常处理例程,如果
    你安装了线程相关的异常处理例程,系统就把异常发送给你的程序seh处理例程,交由其处理.

    3.每个线程相关的异常处理例程可以处理或者不处理这个异常,如果他不处理并且安装了多个线程相关的异常处理例程,
        可交由链起来的其他例程处理.

    4.如果这些例程均选择不处理异常,如果程序处于被调试状态,操作系统仍会再次挂起程序通知debugger.

    5.如果程序未处于被调试状态或者debugger没有能够处理,并且你调用SetUnhandledExceptionFilter安装了最后异
    常处理例程的话,系统转向对它的调用.

    6.如果你没有安装最后异常处理例程或者他没有处理这个异常,系统会调用默认的系统处理程序,通常显示一个对话框,
    你可以选择关闭或者最后将其附加到调试器上的调试按钮.如果没有调试器能被附加于其上或者调试器也处理不了,系统
    就调用ExitProcess终结程序.

    7.不过在终结之前,系统仍然对发生异常的线程异常处理句柄来一次展开,这是线程异常处理例程最后清理的机会.

如果你看了上面的步骤一头雾水的话,别着急,化点时间慢慢理解或者进入下一部分实例操作.

二.初步实战演习:

  安装异常处理句柄.
 
  有两种类型的异常处理句柄,一种是final型的,这是在你的异常未能得到线程相关处理例程处理操作系统在即将关闭程序之前会
  回调的例程,这个例程是进程相关的而不是线程相关的,因此无论是哪个线程发生异常未能被处理,都会调用这个例程.
    I. 见下面的例子1:
;//================================例子1---final型的异常处理=================
;// ex. 1,by Hume,2001,just copy make your own hd.h and compile&link
;//========================================================================
.386
.model flat, stdcall
option casemap :none  ; case sensitive
include hd.h          ;//相关的头文件,你自己维护一个吧
;//============================
.data
szCap    db "By Hume[AfO],2001...",0
szMsgOK db "OK,the exceptoin was handled by final handler!",0
szMsgERR1 db "It would never Get here!",0
buff    db 200 dup(0)

.code
_start:
;//========prog begin====================
    lea    eax,Final_Handler
    invoke    SetUnhandledExceptionFilter,eax  ;//调用SetUnhandledExceptionFilter来安装final SEH
                                                  ;//原型很简单SetUnhandledExceptionFilter proto
                                                  ;//pTopLevelExceptionFilter:DWORD
        xor    ecx,ecx
        mov    eax,200    
        cdq
    div    ecx
                                                  ;//以下永远不会被执行
        invoke    MessageBox,NULL,addr szMsgERR1,addr szCap,MB_OK+MB_ICONEXCLAMATION
        invoke    ExitProcess,NULL
       

;//============================
Final_Handler:
    invoke    MessageBox,NULL,addr szMsgOK,addr szCap,MB_OK+MB_ICONEXCLAMATION
    mov    eax,EXCEPTION_EXECUTE_HANDLER        ;//==1 这时不出现非法操作的讨厌对话框
    ;mov    eax,EXCEPTION_CONTINUE_SEARCH    ;//==0 出现,这时是调用系统默认的异常处理过程,程序被终结了
    ;mov    eax,EXCEPTION_CONTINUE_EXECUTION  ;//==-1 不断出现对话框,你将陷入死循环,可别怪我
    ret                                      ;因为我们并没有修复ecx,所以不断产生异常,然后不断调用这个例程

;//=============================Prog Ends==============
end _start
COMMENT $
  简单来解释几句,windows根据你的异常处理程序的返回值来决定如何进一步处理
        EXCEPTION_EXECUTE_HANDLER            equ 1    表示我已经处理了异常,可以优雅地结束了
        EXCEPTION_CONTINUE_SEARCH            equ 0    表示我不处理,其他人来吧,于是windows调用默认的处理程序
                                                      显示一个错误框,并结束
        EXCEPTION_CONTINUE_EXECUTION        equ -1  表示错误已经被修复,请从异常发生处继续执行
        你可以试着让程序返回0和-1然后编译程序,就会理解我所有苍白无力的语言...
$

;//========================================================================

    II.另一种是per_Thread Exception Handler->线程相关的异常处理,通常每个线程初始化准备好运行时fs指向一个TIB结构
    (THREAD INFORMATION BLOCK),这个结构的第一个元素fs:[0]指向一个_EXCEPTION_REGISTRATION结构
    后面_EXCEPTION_REGISTRATION为了简化,用ERR来代替这个结构...不要说没见过啊...
    fs:[0]->
    _EXCEPTION_REGISTRATION struc
    prev dd ?                      ;前一个_EXCEPTION_REGISTRATION结构
    handler dd ?                  ;异常处理例程入口....呵呵,现在明白该怎么作了吧
    _EXCEPTION_REGISTRATION ends
    我们可以建立一个ERR结构然后将fs:[0]换成指向他的指针,当然最常用的是堆栈,如果你用静态内存区也可以,没有人阻止你
    在asm世界,放心地干吧,除了多S几次之外,通常不会有更大的损失
    把handler域换成你的程序入口,就可以在发生异常时调用你的代码了,好马上实践一下,见例子2
;//========================================================================
;// ex. 2,by Hume,2001  线程相关的异常处理
;//========================================================================
.386
.model flat, stdcall
option casemap :none  ; case sensitive
include hd.h          ;//相关的头文件,你自己维护一个吧
;//============================
.data
szCap    db "By Hume[AfO],2001...",0
szMsgOK db "It's now in the Per_Thread handler!",0
szMsgERR1 db "It would never Get here!",0
buff    db 200 dup(0)

.code
_start:
;//========prog begin====================
  ASSUME FS:NOTHING
        push    offset perThread_Handler
    push    fs:[0]     
        mov    fs:[0],esp                      ;//建立SEH的基本ERR结构,如果不明白,就仔细研究一下吧
        xor    ecx,ecx                         
        mov    eax,200    
        cdq
    div    ecx
                                                  ;//以下永远不会被执行
        invoke    MessageBox,NULL,addr szMsgERR1,addr szCap,MB_OK+MB_ICONINFORMATION
        pop    fs:[0]
        add    esp,4
        invoke    ExitProcess,NULL       

;//============================
perThread_Handler:
        invoke    MessageBox,NULL,addr szMsgOK,addr szCap,MB_OK+MB_ICONINFORMATION
        mov    eax,1          ;//ExceptionContinueSearch,不处理,由其他例程或系统处理
        ;mov    eax,0          ;//ExceptionContinueExecution,表示已经修复CONTEXT,可从异常发生处继续执行
    ret                        ;//这里如果返回0,你会陷入死循环,不断跳出对话框....

;//=============================Prog Ends==============
end _start
COMMENT $
  嘿嘿,这个简单吧,我们由于没有足够的资料,暂时还不能修复ecx的值使之从异常发生处继续执行,只是简单显示一个MSG,然后
  让系统处理,自然跳出讨厌的对话框了....
  注意和final返回值的含义不同...
$
;//==================================================================================================

好像到此为止,我们并没有从异常处理中得到任何好处,除了在异常发生后可以执行一点我们微不足道的代码,事实上SEH可以修复这些
异常或者干我们想干的事情然后从希望的地方继续执行,嘿嘿,很爽吧,可惜我们没有足够的信息,那里找到我们所需要的信息?
欲知后事如何,且看下回分解...

                     

                            PARTII    继续深入
                            ....(待续,睡个觉先)

标 题:SEH in ASM 研究(二) (6千字)
发信人:hume
时 间:2001-12-29 11:54:47
详细信息:

PART II 继续深入

三、传递给异常处理句柄的参数

      要想明白seh处理例程如何得到感兴趣的信息,首先要明白SEH的作用机制.事实上,当异常
发生时,系统给了我们一个处理异常的机会,他首先会调用我们自定义的seh处理例程,当然也包括
了相关信息,在调用之前,系统把包含这些信息结构的指针压入stack,供我们的异常处理例程调用,
传递给例程的参数通常是四个,其中只有三个有明确意义,另一个到现在为止还没有发现有什么作用,
这些参数是:pExcept:DWORD,pErr:DWORD,pContext:DWORD,pDispatch意义如下:
pExcept:  ---  EXCEPTION_RECORD结构的指针
pErr:    ---  前面ERR结构的指针
pContext: --- CONTEXT结构的指针
pDispatch:---没有发现有啥意义

    ERR结构是前面介绍的_EXCEPTION_REGISTRATION结构,往前翻翻,Dispatch省略,下面介绍
EXCEPTION_RECORD和CONTEXT结构的定义:
 
;//================================以下是两个成员的详细结构========================================

        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里面有很多类型,你可以在windows.inc里查找STATUS_来找到更多
的异常类型,下面只给出hex值,具体标识定义请查阅windows.inc,你最可能遇到的几种类型如下:

              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即内存异常时含义如下
              第一个dword 0==读冲突 1==写冲突
              第二个dword 读写冲突地址
;//================================解释结束========================================
                                                          off.
        CONTEXT STRUCT                    ; _
          ContextFlags  DWORD      ?      ;  |            +0
          iDr0          DWORD      ?      ;  |            +4
          iDr1          DWORD      ?      ;  |            +8
          iDr2          DWORD      ?      ;  >调试寄存器  +C
          iDr3          DWORD      ?      ;  |            +10
          iDr6          DWORD      ?      ;  |            +14
          iDr7          DWORD      ?      ; _|            +18
          FloatSave    FLOATING_SAVE_AREA <>  ;浮点寄存器区 +1C~~~88h
          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
;//================================以上是两个成员的详细结构========================================

   
        I、传递给final句柄的参数,只有两个可描述为EXCEPTION_POINTERS结构,定义如下:
            EXCEPTION_POINTERS STRUCT
              pExceptionRecord  DWORD      ?             
              ContextRecord    DWORD      ?
            EXCEPTION_POINTERS ENDS

            在call xHandler之前,堆栈结构如下:
            esp    -> *EXCEPTION_RECORD
            esp+4  -> *CONTEXT record  ;//具体结构见下面

                然后执行call _Final_Handler,这样在程序里要调用什么不轻而易举了吗?


   
    II、 传递给per_thread句柄的参数,如下:
    在call xHandler之前,在堆栈中形成如下结构
            esp    -> *EXCEPTION_RECORD
            esp+4  -> *ERR                    ;//注意这也就是fs:[0]的指向
            esp    -> *CONTEXT record          ;//point to registers
            esp    -> *Param                    ;//呵呵,没有啥意义

          然后执行 call _Per_Thread_Handler

调用handler的原型是这样
        invoke HANDLER,*EXCEPTION_RECORD,*_EXCEPTION_REGISTRATION,*CONTEXT record,*Param
        即编译代码如下:
        PUSH *Param                    ;//通常不重要,没有什么意义
        push *CONTEXT record            ;//上面的结构
        push *ERR                      ;//the struc above
        push *EXCEPTION_RECORD          ;//see above
        CALL HANDLER
        ADD ESP,10h


好现在你明白了应该如何访问具体有关系统信息的细节了吧,下一部分,让我们来看看如何应用...(待续)

标 题:一家之言,一种利用SEH技术脱壳的思路。 (699字)
发信人:idtemu
时 间:2001-12-29 17:30:24
详细信息:

利用Apihook到进程的入口,建立自己的SEH链表,在SEH的异常处理程序中建立Debuger功能,/(也就是修改Context.Eflags的TF标志,然后单步异常时重新修改该标志/),有了这个粗糙的Debuger,我们可以在让其在单步中断到SIDT指令时修改SIDT指令的结果,让其取的是自己建立的一个假的IDTR植,同时自己建立一个假的IDT表,这样程序修改的将是自己的假IDT表,如果程序想int 3或int 1来反跟踪的话,就会发生异常,我们又可以处理以下了。。。。,然后如果只是为了脱壳的话,就HOOK到某个API或则修改程序的某处代码为INT3,然后在异常处理程序中处理开始脱壳。特殊一点如果你想让利用修改IDT进入Ring0进行反跟踪的加壳的程序在NT下执行的话,也可以模拟一个它需要的环境给他吧:-)当然这中方法有一定的局限性.

SEH不仅仅是加壳者的宝刀,也是脱壳者的利箭。
六自由度机器人(机械臂)运动学建模及运动规划系列(四)——轨迹规划 本篇介绍了六轴机器人关节空间以及笛卡尔空间轨迹规划的简单方法,并给出了一种几何解法,以简化规划过程,并提供了简单的Matlab轨迹规划函数介绍。 阅读详情

相关推荐

华为eNSP与VMware虚拟机联动实战:从零搭建仿真网络环境

本文详细介绍了如何从零开始搭建华为eNSP与VMware虚拟机的联动仿真网络环境。通过环境准备、网络适配器配置、eNSP与VMware网络集成、安全策略与NAT配置等步骤,帮助读者掌握构建企业级网络实验场景的关键技术。这种组合特别适合网络工程师进阶训练和华为认证考试准备,实现低成本、高灵活性的网络仿真实验。

weixin_30415113的博客 504

脱壳基础知识入门和提高-----第二课 SEH技术

结构化异常处理(Structured Exception Handling,SEH)是Windows操作系统处理程序错误或异常的技术。SEH是Windows操作系统的一种系统机制,与特定的程序设计语言无关。   外壳程序里大量地使用了SEH,如果不了解SEH,将会使你跟踪十分困难。  SEH in ASM 研究(一)by hume     SEH in ASM 研究(二)by hume     S

www.pingfi.com 1364

【YOLOV5-5.x 源码讲解】整体项目文件导航

前言 这个项目是github的开源项目,YOLOV5:https://github.com/ultralytics/yolov5,目前已经有14.1k个Star 和 4.9k 个Folk了,非常的火。下面我会给大家逐个的文件介绍这个项目中的所有代码,希望能帮到大家。 我下的2021年4月12日更新的v5.0版本,整个项目我做了一点点的文件位置的改变,也加了点自己在其他论文中学到的tricks,不过我没有删除它源码任何一个代码。下面我会按文件逐个函数的进行攻破,因为我本人也还是研一,肯定会有很多的不足,希望大

qq_38253797的博客 6万+

SEH in ASM 研究(一)

SEH in ASM 研究(一) 2011年02月20日   SEH in ASM 研究(一)   By Hume/冷雨飘心   为什么老调重弹:   SEH出现已绝非一日,但很多人可能还不彻底了解Seh的运行机制;有关seh的知识资料不是很多,asm级的详细   资料就更少!seh不仅可以简化程序错误处理,使你的程序更加健壮,还被广泛应用于反跟踪以及加解密中,因   此,...

jbn471rd 227

【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程【站长亲测】

MMORPG端游【蒸汽幻想台服新版商业端】2025最新整理单机一键即玩镜像端+WIN系半手工端+PC客户端+网页注册+网页管理后台+教程。

百创科技 535

路径规划 | 图解A*、Dijkstra、GBFS算法的异同(附C++/Python/Matlab仿真)

图解A*、Dijkstra、GBFS算法原理,分析三种算法异同,提供C++/Python/Matlab仿真实现

FRIGIDWINTER的博客 2万+

SEH in ASM研究

SEH in ASM研究 作者: Hume 第一部分 基础篇 PART I 简单接触 一、SEH背景知识 SEH("Structured Exception Handling"),即结构化异常处理.是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器.在VISUAL C++中你或许已经熟悉了_try{} _finally{} 和_try{} _except {...

weixin_30786617的博客 318

X书关键词协议搜索

【代码】X书关键词协议搜索。

Codeooo 博客 6379

SEH in ASM 研究

SEH in ASM 研究(一) By Hume/冷雨飘心 为什么老调重弹:  SEH出现已绝非一日,但很多人可能还不彻底了解Seh的运行机制;有关seh的知识资料不是很多,asm级的详细 资料就更少!seh不仅可以简化程序错误处理,使你的程序更加健壮,还被广泛应用于反跟踪以及加解密中,因 此,了解seh非常必要但遗憾的是关于seh详细介绍的中文资料非常少,在实践

vbsourcecode的专栏 1333

Epicor ERP 界面新增客制化字段操作方法

我发现国内对于epicor这个erp软件的教程非常少,所以录制一些我实际遇到的需求,整理了实现过程,提供给大家参考。

cqxianggang的专栏 413

产品路线图的三种模型(RICE/MoSCoW/Kano),教你如何对需求进行优先级排序

RICE/MoSCoW/Kano三种模型,教你如何对需求进行优先级排序。 也许你会让业务提供一份ROI,记得前不久参加过一场立项会评审,一位很有意思的小产品在会上讲不清楚ROI,评审们要求会后重新梳理,小产品表达不要为难业务方干一些他们不擅长的事了。这个看似笑话的经历,背后隐藏着价值判断已经流于形式。 也许你会要求业务方直接给出需求优先级列表,把任务分为P0到P5,这样的划分除了按需求本质的优先级还同时考虑了开发资源、开发难度等问题。毫不夸张地说,我曾经拿到一张全是P0级别的需求清单,如果一切任务都是高

wenyusuran的专栏 5545

异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介

              异常处理第一讲(SEH),筛选器异常,以及__asm的扩展 博客园IBinary原创 博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 一丶__Asm的扩展知识 ①丶使用关键字,解决局部变量申请问题 昨天已经介绍了__asm的基本用法,现在对其做个扩展(上一篇是32为汇编第七讲) 昨天我们写的裸函数,那么...

weixin_30443895的博客 249

几款开源的自动驾驶仿真平台项目

它被开发为一个虚幻的插件,可以简单地放到任何你想要的虚幻环境中。第一类是基于合成的数据,对环境、感知及车辆进行模拟,这里的感知大多数是图像层面的感知,这类模拟器主要用于感知、规划算法的初步开发上,Carla、AirSim、Udacity self-driving car simulator就属于这类;第二类是基于真实数据的回放,这里的真实数据包括图像、lidar、radar等各种传感器的数据,这类模拟器主要用于测试无人驾驶中信息融合算法以及车辆不同部件的性能,Apollo和Autoware就属于这类。

南七小僧的学海无涯 2850

SEH in ASM研究 一

SEH in ASM研究作者: Hume第一部分 基础篇PART I 简单接触 一、SEH背景知识SEH("Structured Exception Handling"),即结构化异常处理.是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器.在VISUAL C++中你或许已经熟悉了_try{} _finally{} 和_try{} _except {

280

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SEH IN ASM 研究(2)

PART II 继续深入 <br /> 三、传递给异常处理例程的参数 <br /> I、传递给final型的参数,只有一个即指向EXCEPTION_POINTERS结构的指针, EXCEPTION_POINTERS定义如下: <br /> EXCEPTION_POINTERS STRUCT <br /> pExceptionRecordDWORD?

Matrix_Designer的专栏 712

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[转载]SEH in ASM研究

原文地址:http://forum.eviloctal.com/thread-6883-1-32.html [转载]SEH in ASM研究 文章作者:Hume/冷雨飘心 为什么老调重弹: SEH出现已绝非一日,但很多人可能还不彻底了解Seh的运行机制;有关seh的知识资料不是很多,asm级的详细 资料就更少!seh不仅可以简化程序错误处理,使你的程序更加健壮,还被广

duhaomin的专栏 1145

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SEH IN ASM 研究(1)

<br />为什么老调重弹:<br />    SEH出现已绝非一日,但很多人可能还不彻底了解Seh的运行机制;有关seh的知识资料不是很多,asm级的详细资料就更少!seh不仅可以简化程序错误处理,使你的程序更加健壮,还被广泛应用于反跟踪以及加解密中,因此,了解seh非常必要,但遗憾的是关于seh详细介绍的中文资料非常少,在实践的基础上,把自己学习的一点笔记奉献给大家,希望对喜欢ASM的朋友有所帮助.如有错误,请高手不吝指正.<br />                       第一部分 基础篇<

Matrix_Designer的专栏 704

SEH IN ASM 研究(3)

第二部分提高篇<br />                                        By Hume[AfO]/冷雨飘心<br /><br />PART IV  关于异常处理的嵌套和堆栈展开<br />在实际程序设计过程中,不可能只有一个异常处理例程,这就产生了异常处理程序嵌套的问题,可能很多处理例程分别监视若干子程序并处理其中某种异常,另外一个监视所有子程序可能产生的共性异常,这作起来实际很容易,也方便调试.你只要依次建立异常处理框架就可以了.关于VC++异常处理可以嵌套很多人

Matrix_Designer的专栏 909

SEH in ASM 研究

SEH in ASM 研究 一、SEH背景知识 SEH("Structured Exception Handling"),即结构化异常处理.是操作系统提供给程序设计者的强有力的处理程序错误或异常的武器.在VISUAL C++中你或许已经熟悉了_try{} _finally{} 和_try{} _except {} 结构,这些并不是编译程序本身所固有的,本质上只不过是对windows内在提供的结...

weixin_30632089的博客 116

VEH和SEH

文章目录VEHKiUserExceptionDispatcher函数分析代码实现添加VEH异常处理函数VEH异常的处理流程SEHExceptionListRtlDispatchException函数的执行流程代码实现添加SEH异常处理函数SEH异常的处理流程 VEH 当用户异常产生后,内核函数KiDispatchException并不是像处理内核异常那样在0环直接处理,而是修正3环EIP为KiUs...

鬼手的博客 4811

一种通用跨平台实现SEH的解决方案(二)

摘要:本文介绍了在Windows平台上模拟SEH(结构化异常处理)的实现方法。针对MINGW编译器不支持SEH的问题,作者分别对32位和64位系统提出了解决方案。32位系统利用Windows操作系统提供的SEH服务,通过FS寄存器维护异常处理链;64位系统则采用类似非Windows平台的方法,通过注册VEH(向量化异常处理)来实现。文章详细阐述了异常处理块结构、异常过滤函数以及注册/注销机制,并提供了代码示例。该方案实现了跨平台统一的异常处理架构,支持异常修复、清理和传递等核心功能。

易水的专栏 1071

关于SEH局部展开的一点思考

最近读了Matt Pietrek的《A Crash Course on the Depths of Win32 Structured Exception Handling》,有如醍醐灌顶,尤其是编译器级的SEH,如果是SEH的初学者,推荐读一下这篇文章,不要先去看《windows核心编程》的异常处理章节,那样只会越搞越乱。如果把SEH帧链和_SCOPETABLE链这两条链搞清了基本就OK了,至于细

cuagain的专栏 932

[引用]SEH原理

原文引用自:http://hi.baidu.com/slaff/blog/item/c6d96d4c0ba180fad72afcb7.htmlSEH研究 不少菜菜在编写ASM程序时往往会不太稳定。然而一旦熟悉了WINDOWS SEH原理后,再回过头编写相应的软件后发现不再会弹出讨厌的警告框了。此外,SEH还被广泛应用于反跟踪以及加解密中。工欲善其事,必先利其器,学习SEH的重要性不言而喻了

010101的思绪 3941

SEH原理剖析

用户层数据结构 TEB TEB 第一个字段是NtTib,NtTib的第一个字段ExceptionList是一个链表的头结点的首 地址. 当产生异常,系统会通过FS:[0]找到这个链表,依次调用处理异常. typedef struct _EXCEPTION_REGISTRATION_RECORD{ struct _EXCEPTION_REGISTRATION_RECORD* next; //

mslieng1011的博客 1608

编译器扩展SEH

文章目录编译器扩展的SEH为什么需要编译器扩展的SEH编译器支持的SEH过滤表达式try_except的实现细节手动挂入链表自动挂入链表_try_except嵌套重复拓展的_EXCEPTION_REGISTRATION_RECORD结构体scopetable成员分析try_finally 编译器扩展的SEH 为什么需要编译器扩展的SEH 之前我们已经了解过SEH的异常处理流程,SEH的处理流程实...

鬼手的博客 993

SEH(结构化异常处理)

内容回顾: 当用户异常产生后,内核函数KiDispatchException并不是像处理内核异常那样在0环直接处理,而是修正3环EIP为KiUSerExceptionDispatcher函数后就结束了。 这样,当线程再次回到3环时,将会从KiUserExceptionDispatcher函数开始执行。 KiUserExceptionDispatcher会调用RtlDispatchException函数来查找并调用异常处理函数,查找的顺序: 先查全局链表:VEH 再查句柄链表:SEH 它是与线程有关的,

寻梦&之璐 6020
上一篇: 死于非命的中国亿万富翁们 1
下一篇: 旧调重弹-SetUnhandledExceptionFilter的使用问题
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值