首页
社区
课程
招聘
[原创]SEH 在程序中的运用
发表于: 2009-11-18 20:08 7891

[原创]SEH 在程序中的运用

2009-11-18 20:08
7891

结构化异常处理
    当某一线程发生异常时,程序的控制权会立即进入Ring0异常处理程序,这是属于操作系统的部分, 如果发生的异常是如页异常之类的异常,Ring0处理程序可以处理完它后重新回到程序中执行,而被中断 过的进程可能根本就不知道发生过异常。
    但事情并不总是如此,有时进程会发生一些始料不及的异常,例如访问不存在的内存,被0除等, 这些异常Ring0处理程序不知该如何处理它,而进程本身也可能想自己处理这些情况,这是就要用到结构化异常处理(SEH)。在C/C++中也有异常处理的语句如_try,_catch等,这些语句的实现也与SEH紧密联系。
    当系统遇到一个它不知道如何处理的异常时,它就查找异常处理链表,注意每个线程都有它自己的异 常处理链表。异常链表以FS:[0]所指向的位置为链表头。
    异常处理开始时,系统把一些与当前线程和与异常有关的内容传给链头所指向的处理程序;处理程序 由用户编写或编译器生成,它的返回值可以是告诉系统:异常处理以完成,可以继续执行程序,或未处理 异常,可由链表的下一个处理程序处理等,可以一次传递下去。

  下面我以以前写的一个WinMD5程序来说明:

下面是未运用SEH链的情况下的部分关键代码:



GetMd5Thread PROC PFile:DWORD

LOCAL @FileText[MAX_PATH]:BYTE
LOCAL @TEMP[MAX_PATH]:BYTE
LOCAL @hFileRead,@hMapFile,@pMemory,@FileSize

invoke CreateFile, PFile,\
GENERIC_READ ,\
0,\
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,\
NULL
.if eax==0
jmp reterr
.endif



mov @hFileRead,eax
invoke ExtractFileName,PFile,addr @FileText ; 取短文件名

invoke CreateFileMapping,@hFileRead,NULL,PAGE_READONLY,0,0,NULL
.if eax==0
invoke CloseHandle,@hFileRead
jmp reterr
ret
.endif

mov @hMapFile,eax

invoke MapViewOfFile,@hMapFile,FILE_MAP_READ,0,0,0
.if eax==0
invoke CloseMapFile,@hMapFile,@hFileRead
jmp reterr
.endif
mov @pMemory,eax
invoke SendDlgItemMessage,hWinMain,IDC_PGB,PBM_SETPOS,1,0 ;进度开始(注意:这里并不是实时进度)
invoke GetFileSize,@hFileRead,0
mov @FileSize,eax
invoke _MD5,@pMemory,eax
invoke wsprintf ,addr @TEMP,addr szReceive, addr @FileText, @FileSize,eax
invoke SendDlgItemMessage,hWinMain,IDC_EDT_OUT,EM_REPLACESEL,0,addr @TEMP
invoke SendDlgItemMessage,hWinMain,IDC_PGB,PBM_SETPOS,100,0 ;进度结束
invoke RtlZeroMemory,addr FileName,MAX_PATH ; 清空数据
INVOKE SendDlgItemMessage,hWinMain,IDC_EDT_FILE,WM_SETTEXT,0, addr FileName
invoke UnmapViewOfFile,@pMemory
invoke CloseMapFile,@hMapFile,@hFileRead
ret

reterr:

invoke MessageBox,0,CTEXT("文件打开失败,请检查是否为有效文件!"),CTEXT("WinMd5 for ASM v1.1"),MB_ICONERROR OR MB_OK

ret

GetMd5Thread endp



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
2
居然得了格精华,没人顶吗?呵呵
2009-11-19 03:57
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
刚看到,顶顶,
很有用的技术,不顶就不厚道了
2009-11-19 07:51
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
4
虽然SEH已是老东西了, 不过有讲解有代码有bin的就应该支持

PS. 原来WinMD5是出自你之手, 很小很不错的一个工具, 以前还曾经用过一段时间.
2009-11-19 09:34
0
雪    币: 7115
活跃值: (639)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
5
昨天看这个帖子好像没发完。。。   今天过来顶~~~
2009-11-19 10:06
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
6
这个根据加密解密书上的那个MD5.h做个inc  再结合微软的那个SEH的专门介绍的文章就可以搞出来了!呼呼,,我也刚研究过这个东西,呼呼,,跟你的差不多,,
2009-11-19 10:44
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
   有技术含量,支持
2009-11-19 11:15
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
8
软件全称是WinMd5 for ASM v1.1,作者已经发在论坛上了,开源的:
http://bbs.pediy.com/showthread.php?p=382854
2009-11-19 12:09
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
9
请问楼主是非安全·后生吗?
2009-11-19 12:13
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
10
非安全·后生?

不是吧,应该不是我,你在哪看到的?
2009-11-19 12:17
0
雪    币: 2307
活跃值: (1013)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
11
此非安全乃彼非安全。
喜欢的代码风格。
2009-11-19 12:19
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
12
非安全·后生就是黑客手册的编辑啊!
2009-11-19 12:35
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
13
那楼主跟黑客手册又是啥关系捏??
2009-11-19 12:36
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
14
呵呵,没啥关系,先有他后有我
2009-11-19 12:38
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
15
非安全这昵称很难不联想到非安全·黑客手册啊,到处漂浮着nohack的影子!
2009-11-19 13:05
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
16
呵呵,理解,以前还有人问我手册是不是我办的了,我的QQ昵称是nohacks
2009-11-19 13:19
0
游客
登录 | 注册 方可回帖
返回
//