SEH IN ASM 研究(1)

PE文件病毒感染示例 ;本程序修改自hume的代码,其版权信息如下:CopyRight              db "The SoftWare WAS OFFERRED by Hume[AfO]",0dh,0ah                       db "        Thx for using it!",0dh,0ah                       db "Contact: Hume 阅读详情

为什么老调重弹:


    SEH出现已绝非一日,但很多人可能还不彻底了解Seh的运行机制;有关seh的知识资料不是很多,asm级的详细资料就更少!seh不仅可以简化程序错误处理,使你的程序更加健壮,还被广泛应用于反跟踪以及加解密中,因此,了解seh非常必要,但遗憾的是关于seh详细介绍的中文资料非常少,在实践的基础上,把自己学习的一点笔记奉献给大家,希望对喜欢ASM的朋友有所帮助.如有错误,请高手不吝指正.
                       第一部分 基础篇
PART   I   简单接触
一、SEH背景知识
    SEH("Structured Exception Handling"),即结构化异常处理.是(windows)操作系统提供给程序设计者的强有力的处理程序错误或异常的武器.在VISUAL C++中你或许已经熟悉了_try{} _finally{} 和_try{} _except {} 结构,这些并不是编译程序本身所固有的,本质上只不过是对windows内在提供的结构化异常处理的包装,不用这些高级语言编译器所提供的包装 ,照样可以利用系统提供的强大seh处理功能,在后面你将可以看到,用系统本身提供seh结构和规则以及ASM语言,我们将对SEH的机制以及实现进行一番(深入?)探究.
使用windows的人对microsoft设计的非法操作对话框一定不会陌生,尤其是在9X下.这表示发生了一个错误,如果是应用程序的错误,那么windows可能要关闭应用程序,如果是系统错误,你很可能不得不reset以重新启动计算机.从程序编写的角度来看,这种异常产生的原因很多,诸如堆栈溢出,非法指令,对windows保护内存的读写权限不够等等.幸运的是windows通过she机制给了应用程序一个机会来修补错误,事实上windows内部也广泛采用seh来除错.让我们先来看看如果一个应用程序发生错误后windows是怎么处理的.
程序发生异常时系统的处理顺序(most by Jeremy Gordon):
    1.因为有很多种异常,系统首先判断异常是否应发送给目标程序的异常处理例程,如果决定应该发送,并且目标程序正处于被调试状态,则系统挂起程序并向调试器发送EXCEPTION_DEBUG_EVENT消息.剩下的事情就由调试器全权负责.如果系统级调试器存在,对于int 1,int 3这样的异常在faults on时一般是会选择处理的,因而如果你的异常处理程序由他们来进入,则不会得到执行,呵呵,这不是正好可以用来探测调试器的存在吗?
    2.如果你的程序没有被调试或者调试器未能处理异常(/错误),系统就会继续查找你是否安装了线程相关的异常处理例程,如果你安装了线程相关的异常处理例程,系统就把异常发送给你程序的线程相关的seh处理例程,交由其处理.
    3.每个线程相关的异常处理例程可以处理或者不处理这个异常,如果他不处理并且安装了多个线程相关的异常处理例程,可交由链起来的其他例程处理.
    4.如果这些例程均选择不处理异常,如果程序处于被调试状态,操作系统仍会再次挂起程序通知debugger.
    5.如果程序未处于被调试状态或者debugger没有能够处理,并且你调用SetUnhandledExceptionFilter安装了final型异常处理例程的话,系统转向对它的调用.
    6.如果你没有安装最后异常处理例程或者他没有处理这个异常,系统会调用默认的系统处理程序,通常显示一个对话框,    你可以选择关闭或者最后将其附加到调试器上的调试按钮.如果没有调试器能被附加于其上或者调试器也处理不了,系统就调用ExitProcess终结程序.
    7.不过在终结之前,系统仍然对发生异常的线程异常处理句柄来一次展开,这是线程异常处理例程最后清理的机会.
以上大致描述了异常/错误发生时系统的逻辑处理顺序,如果你看了一头雾水的话,别着急,化点时间慢慢理解或者进入下一部分实例操作.作几个例子后你也许就会慢慢理解了.
    你要有一个最基本的观念就是She只不过是系统在终结你应用程序之前给你的一个最后处理错误的机会,从程序设计的角度来说就是给你自己设计的一个回调函数执行的机会.
二.初步实战演习:
你在自己程序里可以设计两种异常处理例程,一种是通过SetUnhandledExceptionFilter API设置的,姑且称之为final型的,他是进程相关的,也就是说在线程相关的异常处理部分不能处理的异常才会到达final处理例程.
另外一种是线程相关的,他一般用来监视处理进程中某个线程的异常情况.他比较灵活,可选择监视线程中的某一小段代码.姑且称之为thread型的.
下面看看如何设计一个最简单的异常处理程序.
挂接异常处理例程:
   I. final型的异常处理  
    对于final型的,在你的异常未能得到调试器以及线程相关处理例程处理操作系统在即将关闭程序之前会回调的例程,这个例程是进程相关的而不是线程相关的,因此无论是哪个线程发生异常未能被处理,都会调用这个例程.
    见下面的例子1:
;==========================================
; ex. 1,by Hume,2001 演示final型异常处理
;==========================================
.586p
.model flat, stdcall
option casemap :none   ; case sensitive
include c:/hd/hd.h      ;头部包含文件
include c:/hd/mac.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
        .code
_start:
       push     offset Final_Handler
       call     SetUnhandledExceptionFilter      
;调用SetUnhandledExceptionFilter来安装final SEH
                           ;原型很简单SetUnhandledExceptionFilter proto
                           ;pTopLevelExceptionFilter:DWORD
        xor      ecx,ecx
        mov     eax,200  
        cdq
        div ecx                                ;除0错误
                                               ;以下永远不会被执行
        invoke  MessageBox,0,addr szMsgERR1,addr szCap,30h+1000h  
        invoke  ExitProcess,0                    ;30h=MB_ICONEXCLAMATION
                                              ;1000h=MB_SYSTEMMODAL
        ;-----------------------------------------
Final_Handler:
    invoke  MessageBox,0,addr szMsgOK,addr szCap,30h
    mov eax,EXCEPTION_EXECUTE_HANDLER    
;==1 这时不出现非法操作的讨厌对话框
    ;mov    eax,EXCEPTION_CONTINUE_SEARCH    
                                   ;==0 出现,这时是调用系统默认的异常
;处理过程,程序被终结了
        ;mov    eax,EXCEPTION_CONTINUE_EXECUTION
;==-1 不断出现对话框,你将陷入死循环,可
;别怪我
        ret 4
end _start
  简单来解释几句,windows根据你的异常处理程序的返回值来决定如何进一步处理
    EXCEPTION_EXECUTE_HANDLER  equ 1    表示我已经处理了异常,可以优雅地结束了
    EXCEPTION_CONTINUE_SEARCH  equ 0    表示我不处理,其他人来吧,于是windows调用默认的处理程序,显示一个除错对话框,并结束
EXCEPTION_CONTINUE_EXECUTION         equ -1   表示错误已经被修复,请从 异常发生处继续执行
    你可以试着让程序返回0和-1然后编译程序,就会理解我所有苍白无力的语言...
II.线程相关的异常处理.
通常每个线程初始化准备好运行时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]换成指向他的指针,当然最常用的是堆栈,如果你非要用静态内存区也可以,
    把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
.code
_start:
   ASSUME FS:NOTHING        ;否则Masm编译报错
        push    offset perThread_Handler
        push    fs:[0]      
        mov     fs:[0],esp            ;建立SEH的基本ERR结构,如果
;不明白,就仔细研究一下前面所述
        xor     ecx,ecx                          
        mov     eax,200  
        cdq
        div ecx
                                                  ;以下永远不会被执行
        invoke  MessageBox,0,addr szMsgERR1,addr szCap,10h+1000h
        pop     fs:[0]              ;清除seh链表
        add     esp,4
        invoke  ExitProcess,0        
;============================
perThread_Handler:
        invoke  MessageBox,NULL,addr szMsgOK,addr szCap, 40h+1000h
        mov     eax,1         ;ExceptionContinueSearch,不处理,由其他例程或系统处理
        ;mov    eax,0         ;ExceptionContinueExecution,表示已经修复CONTEXT,可
;从异常发生处继续执行
        ret                    ;这里如果返回0,你会陷入死循环,不断跳出对话框....
end _start
    嘿嘿,这个简单吧,我们由于没有足够的资料,暂时还不能修复ecx的值使之从异常发生处继续执行,只是简单显示一个MSG,然后让系统处理,自然跳出讨厌的对话框了....
    注意化5分钟研究和final返回值的含义不同...windows也是根据返回值来决定下一步的动作的.
好像到此为止,我们并没有从异常处理中得到任何好处,除了在异常发生后可以执行一点我们微不足道的代码,事实上SEH可以修复这些异常或者干我们想干的任何事情然后从希望的地方继续执行,嘿嘿,很爽吧,可惜我们没有足够的信息,那里找到我们所需要的信息?
HUME 立即下载

相关推荐

LVGL8.x 实体按键与Keypad驱动的无缝对接实战

本文详细解析了LVGL8.x中实体按键与Keypad驱动的两种对接方案:坐标映射的Button方式与事件驱动的Keypad方式。重点阐述了如何模块化裁剪lv_port_indev.c模板文件,并深入讲解了Keypad驱动与Group焦点管理系统的核心协作机制,为无触摸屏的嵌入式设备提供流畅的UI交互解决方案。

weixin_29164497的博客 449

计算机病毒分析与对抗————3、PE文件型病毒

病毒如何感染PE文件?首先,判断文件是否是PE文件,接下来添加节:主要涉及到的技术如下:1、病毒感染重定位技术重定位的过程可以通过以下步骤进行:用CALL指令跳转到下一条指令,使下一条指令感染后在内存中的实际地址进栈。用POP指令取出栈顶的内容,这样就可以得到感染后下一条指令在内存中的实际地址感染后变量的地址=步骤(2)的地址-偏移地址代码如下:call test pop eax sub ea...

Fly_鹏程万里 3428

逆向分析第一步:如何从HEX文件‘还原’出单片机的原始程序与数据?

本文详细解析了如何从HEX文件逆向分析出单片机的原始程序与数据,涵盖了固件逆向的底层逻辑与实践。通过介绍HEX文件的结构、内存映像重建技术以及专业工具链的使用,帮助读者掌握从十六进制数据到可执行代码的完整流程,适用于嵌入式系统开发和逆向工程领域。

weixin_29745609的博客 317

SEH IN ASM 研究(3)

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

Matrix_Designer的专栏 909

PaddleOCR 3.x 最新版使用教程(2025)——从安装到实战身份证识别,一步到位!

本文针对PaddleOCR 3.x大版本更新带来的参数变化和兼容性问题,提供从环境配置到实际应用的全流程解决方案。

qq_58607032的博客 9790

界面上下固定_基于ANSYS的胶粘结构界面开裂有限元计算

引言:目前工程上主要有螺栓,过盈,焊接和胶粘四种常用的连接方式,本文基于ANSYS Workbench环境,引入内聚力模型来实现对胶粘结构界面开裂失效的计算,文中的界面失效参数为随意给定,不是工程实际测试数据,仅起到演示作用!1.问题的描述如图所示给出了胶粘结构的三维模型,该胶粘结构由上下钢板组成,中间通过胶粘接到一起。(胶不需要建模,其影响主要通过内聚力模型实现)上下板的材料为结构钢,...

weixin_29473667的博客 1万+

SEH in ASM研究

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

weixin_30786617的博客 318

零基础学会制作 基于STM32/51单片机的智能血压表设计/血压表/血压计

本系统是以单片机为主控,传感器模快、显示模块、人机交互、无线传输等组成的智能血压表设计。传感器用于测量血压和脉搏,主控电路板用于处理数据和控制设备,显示屏则用于显示测量结果。通过软件设计,完成测量数据的处理,其中血压和脉搏的测量、数据的分析和处理等。

weixin_55654459的博客 2473

SEH in ASM 研究

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

vbsourcecode的专栏 1333

基于OpenCV C++实现工业级形状模板匹配:仿Halcon SBM算法全解析

在计算机视觉和工业自动化领域,模板匹配是一项基础且关键的技术,用于在图像中定位已知目标。其核心原理是通过计算图像区域与预设模板之间的相似度来识别目标位置。传统的基于灰度值的匹配方法对光照变化敏感,鲁棒性不足。而基于边缘梯度方向的形状匹配技术,通过计算轮廓梯度方向的一致性进行相似度度量,从根本上提升了对光照变化的鲁棒性,并支持目标的旋转与缩放,技术价值显著。这项技术广泛应用于工业视觉检测、机器人引导、PCB定位等对精度和稳定性要求极高的场景。本文聚焦于使用开源OpenCV库,从底层仿照Halcon的Shape

weixin_33691817的博客 502

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题

本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。

weixin_29197051的博客 492

SEH in ASM 研究(一)

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

小发猫 923

【大语言模型 37】知识蒸馏深度实战:大模型向小模型迁移

本文深入探讨了知识蒸馏技术在大语言模型领域的应用,详细阐述了如何将庞大复杂的大模型知识有效迁移到轻量级小模型中。文章系统介绍了知识蒸馏的理论基础、多种蒸馏损失函数设计、特征匹配与注意力迁移技术、渐进式蒸馏策略以及全面的效果评估方法。通过实战案例和完整代码实现,读者将掌握从理论到实践的知识蒸馏全流程,了解如何在保持模型性能的同时显著降低计算资源需求,实现大语言模型的高效部署与应用。

熵数实验室 1510

[转载]SEH in ASM研究

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

duhaomin的专栏 1145

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

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

SEH in ASM 研究

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

weixin_30632089的博客 116

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SEH in ASM 研究(一)

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

jbn471rd 227

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[引用]SEH原理

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

010101的思绪 3941

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

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

cuagain的专栏 932

windows内核研究(异常-VEH/SEH)

异常处理机制摘要: Windows系统提供VEH(向量化异常处理)和SEH(结构化异常处理)两种用户层异常处理机制。VEH通过全局链表实现,优先于SEH执行;SEH基于线程堆栈,仅影响当前线程。VEH处理流程包括CPU捕获异常、KiDispatchException分发、RtlDispatchException查找VEH链表等步骤。代码示例演示了如何注册VEH/SEH处理函数来捕获除零异常并修复执行流程。两种机制协同工作,VEH优先处理,未处理则转交SEH,最终实现异常捕获与程序恢复。

weixin_43754657的博客 564

Delphi - SEH研究

技术交流,DH讲解. 前几天一个朋友在弄游戏外挂想带NP调试,就像自己来捕获游戏的异常.好像就要用到SEH这方面的知识.一起研究了一下,这里看下研究 和 在网上找的资料吧.SEH就是Structure Exception Handling.结构化异常处理,具体可以看下MSDN.MSDN在手,走遍天下无敌手.哈哈.当时先自己看下Delphi 怎么实现try..except..end的吧.我们写段程序...

weixin_33889665的博客 160

Windows 系统编程初探 (四)结构化异常处理之一:SEH的基本原理与进程相关异常处理

        上面的内容只是一些基础知识,虽然简单,但有必要了解一下。现在,我将正式开始我的第一个专题:结构化异常处理(SEH)。SEH 是 Windows 系统提供的功能,跟开发工具无关。值得一提的是,VC 将 SEH 进行了封装,也就是我们平常用到的 __try{}__except(){} 和 __try{}__finally{},我没有研究过它的实现方法,这里也不进行讨论,而我将要讲述的是

xlt123的专栏 2239

学习心得----seh(4)

解读cih进入ring0的秘密   看了大家对前面几篇的评论,觉得有点怪异,看来大家对技术的追求还不是那么强烈,声明以下,我写的这些东西或许永远也不会对你的实际应用有帮助,这只是黑客们对技术的研究,如果你的愿望只是一般的编程,这篇文章不适合你。   这几天开始编一个游戏,以前没有接触过游戏编程,觉得很有意思,还有directX的编程,真得很爽,我估计也就几天的热情吧,呵呵。   还有,我知道我的老

sssa2000的专栏 1302

vc2005 seh新认识

由于生计问题,我不得不写一段关于异常处理的代码,我的程序是多线程的,我的目的是要在某个线程发生异常的时候结束本线程,保存出错信息,重新启动一个新线程增加程序稳定性,于是呼打开vs 2005就开工了,新建一个测试程序 void__stdcallSetCatchProc(void*pCProc){__asm{pushpCProcpushfs:[0]m...

weixin_34144848的博客 320
上一篇: SEH IN ASM 研究(2)
下一篇: SEH IN ASM 研究(3)
Matrix_Designer
博客等级 码龄16年 58粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值