SEH处理异常

Win32为每个线程定义了一个线程信息块,其中保存了线程的一些属性数据,线程信息块的属性被定义为NT_TIB结构

typedef struct _NT_TIB {

    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;

    PVOID StackBase;

    PVOID StackLimit;

    PVOID SubSystemTib;

    union {

        PVOID FiberData;

        ULONG Version;

    };

    PVOID ArbitraryUserPointer;

    struct _NT_TIB *Self;

} NT_TIB;

ExceptionList指向一个EXCEPTION_REGISTRATION结构-也就是SEH链的入口地址

 

EXCEPTION_REGISTRATION STRUCT

  prev           dd       ?                       ;前一个EXCEPTION_REGISTRATION结构的地址

 handler     dd       ?                        ;异常处理回调函数的地址

EXCEPTION_REGISTRATION ends

 所以  一系列的EXCEPTION_REGISTRATION结构  就组成了一个SEH链...

 

TIB是放在fs段寄存器指向的数据段的0偏移处  所以 fs;[0]指向TIB结构的ExceptionList字段,由于同一个进程中 有不同的线程,所以不同线程中的fs段寄存器可以使用不同的值,这种特性使得每个线程都可以设置不同的回调函数

 

如果内存是从高到低构建...栈则也是从高到低构建....那么对于栈而言

push offset _Handler           ;异常处理程序的回调函数地址

push fs:[0]                               ;上一个EXCEPTION_REGISTRATION结构的地址

mov   fs:[0],esp                       ;设置当前EXCEPTION_REGISTRATION结构的地址

esp此时 正好指向你构建的EXCEPTION_REGISTRATION结构体

 

SEH异常处理回调函数的参数定义与筛选器器的回调函数的参数定义有所不同,其定义如下,其调用约定为C格式,

_Handler proc C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext

_lpExceptionRecord  指向EXCEPTION_RECORD结构(保存异常的相关信息)

_lpContext                   指向一个Thread Context结构-保存线程上下文

_lpSEH                         指向注册回调函数时EXCEPTION_REGISTRATION结构的首地址--利用这个字段可以用栈来传递一些自定义数据如SafeCode地址

 

回调函数的返回值:

ExceptionContinueExecution(等于0):回调函数返回后,系统将线程环境设置为_lpContext参数指定的CONTEXT结构并继续执行

ExceptionContinueSearch(等于1):回调函数拒绝处理这个异常,系统将通过 EXCEPTION_REGISTRATION结构的prev字段得到前一个回调函数的地址并调用他

ExceptionNestedException(等于2):回调函数执行过程中,又发生了新的异常,即触发了嵌套异常

ExceptionCollidedUnwind(等于3):发生了嵌套展开操作

 

代码:

<span style="font-family:Microsoft YaHei;font-size:13px;">		.386.model flat,stdcalloption casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include	windows.inc
include	user32.inc
includelib	user32.lib
include	kernel32.inc
includelib	kernel32.libL macro var:VARARGLOCAL @lbl.const@lbl db var,0.codeexitm <offset @lbl>
endm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Code Segment
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;SEH Handler
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Handler proc C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContextLOCAL	@szBuffer[256]:BYTEpushadmov	esi,_lpExceptionRecordmov	edi,_lpContextassume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXTinvoke	wsprintf,addr @szBuffer,L("异常位置:%08x,异常代码:%08x,异常标志:%08x"),[edi].regEip,[esi].ExceptionCode,[esi].ExceptionFlagsinvoke	MessageBox,NULL,addr @szBuffer,L("---"),MB_OKmov		eax,_lpSEHpush		[eax + 8]pop		[edi].regEippush		[eax + 0ch]pop		[edi].regEsp					;这个是属于当前线程的-而不是当前的栈指针assume esi:nothing,edi:nothingpopadmov	eax,ExceptionContinueExecution		;这个会先返回到内核里面去ret_Handler endp
start:assume fs:nothingpush		ebp						;添加的自定义数据push		offset _SafePlace			;添加的自定义数据......push		offset _Handlerpush		fs:[0]mov		fs:[0],espxor		eax,eaxmov		dword ptr [eax],0_SafePlace:invoke	MessageBox,NULL,L("----"),L("----"),MB_OKpop 		fs:[0]add		esp,0ch					;恢复栈平衡invoke	ExitProcess,NULL
end start
</span>


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asp.net MVC 4新项目中创建area的后续操作

Asp.net MVC 4新项目中创建area后&#xff0c;往往HomeController与area的HomeController路由发生混淆&#xff0c;需要手工设置一些地方避免mvc无法识别默认路由的状况。 无废话具体步骤&#xff1a; 1. 检查早Global.asax和\App_Start\RouteConfig.cs中是否已经自动添加了Are…

55-混沌操作法之我见:一、逆势操作.(2015.2.7)

混沌操作法之我见&#xff1a;一、逆势操作 首先谈谈&#xff0c;均线以及鳄鱼线。单独的市场价格表达了t时刻价格的个体情况&#xff0c;均线表达了一段时间内价格的综合情况。t时刻的价格与均线的比较&#xff0c;表达了考虑了过去以及当前综合价格的比较情况&#xff0c;即t…

SEH链和展开操作

每次我们定义了一个新的SEH异常处理回调函数,EXCEPTION_REGISTRATION结构的prev字段都被要求填写上一个EXCEPTION_REGISTRATION结构的地址,随着应用程序对模块的调用一层层深入下去的时候,那么最后回调函数会形成一个SEH链 当程序中有多个线程在运行的时候,每个线程中都会存在各…

spring的基本知识

首先是回顾一下spring的基本知识 1、controller 控制器&#xff08;注入服务&#xff09; 2、service 服务&#xff08;注入dao&#xff09; 3、repository dao&#xff08;实现dao访问&#xff09; 4、component &#xff08;把普通pojo实例化到spring容器中&#xff0c;相当于…

vs2010 EF4.0 访问mysql

需要安装mysql-connector-net-6.3.5 6.8.9的安装完后在dbfirst里找不到对应的提供程序 链接字符串里需要 指定下编码(如果不是gbk的话) <add name"sourceEntities" connectionString"metadatares://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;pr…

Win32ASM 变长参数的理解

C语言里面 提供了一些宏 可以使用变长参数 int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...){LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpsz…

jquery判断一个div的边界是否超出另外一个div的边界

摘要&#xff1a;本文简单介绍jquery判断一个div的边界是否超出另外一个div的边界&#xff0c;如果超出边界做出相应的处理。 1、实现效果 判断前 判断后 2、实现思路 实现类似的判断&#xff0c;主要是获取两个div在浏览器中的上下左右的四至&#xff0c;在jquery中&#xff0…

Gson解析Json格式数据

//数据定义&#xff1a;class User{ String name; String password; String getName(){}void setName(){}}Gson gsonnew Gson(); ////解析一条json数据&#xff1a;令str为[{"name":"21001","password":"21001"}] User usernew User()…

进程的细节

从今天开始,重新学习一些细节性质的东西 一.在VS开发环境中,应用程序的入口点: _tWinMain WinMainCRTStartup _tWinMain wWinMainCRTStartup _tmain mainCRTStartup _tmain wmainCRTStartup 相关的介…

maven环境快速搭建(转)

最近&#xff0c;开发中要用到maven&#xff0c;所以对maven进行了简单的学习。因为有个maven高手在身边&#xff0c;所以&#xff0c;很快就上手了&#xff0c;我这里算是自我总结吧。关于maven是什么东东&#xff0c;请参考其它文章。 ----------------准备工作-------------…

cocos2d-x3.0 相对布局(一)

2dx相对布局和Android非常类似。假设前完成Android它应该是easy入门。Size widgetSize Director::getInstance()->getWinSize();Text* alert Text::create("Layout", "fonts/Marker Felt.ttf", 30 );alert->setColor(Color3B(159, 168, 176));aler…

管理员以标准权限运行时

在XP时代,大多数用户都用一个管理员(administrator)帐号来登录Windows 利用这个账户,用户几乎能没有任何限制的访问重要的系统资源,因为该账户被授予了很高的权限,一旦用这个帐号登录了xp以及xp之前的操作系统,Windows操作系统就会创建一个安全令牌(security token).每当有代码…

HDU 4791 amp; ZOJ 3726 Alice#39;s Print Service (数学 打表)

题目链接&#xff1a; HDU:http://acm.hdu.edu.cn/showproblem.php?pid4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId5072 Problem DescriptionAlice is providing print service, while the pricing doesnt seem to be reasonable, so people using…

夺命雷公狗---ECSHOP---08---商品页的拇改成星星

<strong>用户评价&#xff1a;</strong>{*---------商品评价星星开始----------*}<img src"./images/stars{$goods.comment_rank}.gif" alt"comment rank {$goods.comment_rank}">{*---------商品评价星星结束-------*} 这里主要是要有星…

文件指针

一.移动文件指针 SetFilePointer,hFile,lDistanceToMove,lpDistanceToMoveHigh,dwMoveMethod dwMoveMethod 指明移动的模式 FILE_BEGIN 不管文件处于什么地方,总是从文件的头部开始移动,这时的位置参数相当于指定了一个绝对位置 FILE_CURRENT 从当前的文件指针处开始移…

见证下的自我变化-2014全年总结

又是一年总结季&#xff0c;回过头看看看自己的成长&#xff0c;心里真的是满满的喜悦之情…… 一年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/19632603 半年前自己的总结博客&#xff1a;http://blog.csdn.net/huo065000/article/details/…

【Linux学习篇】This virtual machine is configured for 64-bit guest operating systems.……

在学习Linux的基本操作的时候&#xff0c;安装虚拟环境则提示自己 This virtualmachine is configured for 64-bit guest operatingsystems.……起初由于各种拒绝的心理&#xff0c;所以屏蔽了这个错误&#xff0c;但是屏蔽永远也解决不了问题的&#xff0c;所以自己则尝试百度…

图解SSIS监视文件夹并自动导入数据

图解SSIS监视文件夹并自动导入数据 原文:图解SSIS监视文件夹并自动导入数据 演示案例&#xff1a;让系统自动监视文件夹&#xff0c;并把文件夹下面的excel文件导入到sql中&#xff0c;之后清空目录。这个过程以往都需要写程序来实现或者定时执行&#xff0c;现在可以用ssis来订…

DLL转Lib

在C中,为了允许操作符重载和函数重载,C编译器往往按照某种规则改写每一个入口点的符号名,以便使用同一个名字(具有不同的参数类型或者是不同的作用域)有多种不同的用法,而不会打破现有基于C的链接器,.这项技术通常被称为改编(Name Mangling)或者名称修饰(Name Decoration),许多…

WP8手机解锁时提示“请确保IPOVERUSBSVC服务正常运行”解决方法

如果你各种重启服务 卸载手机 重装驱动都试过了还不行&#xff0c;请看看你是否安装了Hyper-v或Vitualbox虚拟机&#xff0c;很有可能是虚拟交换机造成的。 我在网络连接属性里看到这个 把它卸载后&#xff0c;解锁成功。 解锁后记得重新安装卸载的那个网络服务转载于:https://…