首页
论坛
课程
招聘
[原创]SEH异常处理反汇编分析
2010-5-8 21:24 23012

[原创]SEH异常处理反汇编分析

2010-5-8 21:24
23012
最近在学老罗的Win32汇编,所以一直没时间在论坛上灌水了,今天恰好有时间,就给新手们讲讲自己去SEH异常的理解,好像看雪〈加密与解密〉第三版也有讲!通过参考了这两本书,我得到了一点启发,仅供初学者学习,技术很简单,对于那些老鸟们请不见笑,小弟也是菜鸟一个,只是在努力学习,希望有朝一日也能成为像看雪老大,天草老大那样的精英人物,呵呵~~,对了,还要申明一点,我的QQ号已经公布在论坛了,目的只有一个就是想多认识一些密界的小鸟与老鸟们一起研究技术,共同进步,如果喜欢聊天之类的兄弟们,请勿加!因为现在本人正在学习Win32汇编没时间陪你们聊天,谢谢合作!~~好了,废话说了一大堆了,在说大家都要Sleep了,进入主题!
首先简单的介绍一下什么是SEH吧!
这里我借用《加密与解密》上的一句话,很简单很清楚的介绍了SEH:SEH是系统发现异常或错误时,在终结应用程序之前给应用程序的一个最后改正错误的机会,从程序设计的角度来说,就是系统在终结程序之前给程序的一个执行其预设定的回调函数的机会。
其它的相关知识,请各位初学者自己www.baidu.com吧!学习总不能老指望别人吧~~
.386
.model flat,stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.const
szMsg       db  '异常发生位置:%08x,异常代码:%08x,标志:%08x',0
szSEH1      db   '如果异常发生,这个对话框将显示!',0
szCaption1  db  '显示的对话框',0
szSEH2      db   '如果异常发生,这个对话框将永远不会显示!',0
szCaption2  db  '永远无法显示的对话框',0

;SEH Handler 异常处理程序
.code
_Handler proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
  
  LOCAL @szBuffer[256]:byte
  
  pushad 
  mov esi,_lpExceptionRecord
  mov edi,_lpContext
  assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT

  
  invoke wsprintf,addr @szBuffer,addr szMsg,[edi].regEip,\
    [esi].ExceptionCode,[esi].ExceptionFlags
  
  invoke MessageBox,NULL,addr @szBuffer,NULL,MB_OK
  
  mov [edi].regEip,offset SEH1
  assume esi:nothing,edi:nothing
  popad 
  mov eax,ExceptionContinueExecution
  ret
_Handler endp

SEH:
  assume fs:nothing
  push offset _Handler
  push fs:[0]
  mov fs:[0],esp
  
  xor eax,eax
  mov dword ptr[eax],0      ;这里产生异常
  
SEH2:  
  invoke MessageBox,NULL,addr szSEH2,addr szCaption2,MB_OK    ;如果异常发生这条代码将永远不会执行

  
SEH1:
  
  invoke MessageBox,NULL,addr szSEH1,addr szCaption1,MB_OK   ;如果异常发生这条代码才执行
  
  
  pop fs:[0]
  pop eax
  
  invoke ExitProcess,NULL

end SEH
老罗的SEH修改版~~

大部分的代码我都不用解释了很简单,这里我主要是想说明下运行结果~~
首先显示第一个对话框,然后显示第二个对话框,如下图所示,那么有人会问为什么会产生这个结果???


其实我们很容易得到这个结果,用Olldbg载入我们刚才那个程序,如图所示

然后我们打开选项,调试选项,在异常中不忽略所有的异常,如图所示

这时候我们F9运行,Olldbg会暂停在0040106A        C700 00000000          mov dword ptr ds:[eax],0这行,如图所示!

看清楚了吧,Olldbg产生异常(请看olldbg最下面显示为:访问违例(C0000005):写入到[00000000],这个异常而且olldbg停留在了0040106a处这行,很显然我们对话框中的信息都出来到了
异常发生位置:0040106A
异常代码:访问违例(即C0000005)
标志:00000000

现在大家应该明白了很多时候我们在调试程序的时候遇到这种异常是怎么发生的,可能就是因为这个原因,这只是本人的微见,还请大鸟们指点!!
接下来,如果我们想动态跟踪这个程序,我们按Shift+F9程序就跑飞了,不可能,难道我们没办法了吗?当然不是啊~~,看雪〈加密与解密〉给我们介绍了一种很简单的方法。。
大家看上面发生异常的界面的右下方堆栈窗口如下所示:

这里就是显示当异常发生之后程序接下来会怎样执行,我们只要在SE句柄前面的数值处下断就可以继续跟踪程序了,我们在命运框中输入bp 00401000,然后在Shift+F9这样程序就不会跑飞了,程序断下来了,如图所示~~

这样我们就又可以开始跟踪了,是不是很简单,所以嘛,老鸟看了这篇文章,千万不要骂我哦,我也是超级菜鸟一个,只是一直在跟看雪和天草两位大哥学习,希望有一天能成为他们,呵呵~~

这里补充一点,就是上面我所说的访问违例(c0000005)如果大家不知道的话,可以这样,跟踪程序到00401027        E8 7A000000            call <jmp.&user32.wsprintfA>

在看堆栈窗口,这时就显示了,我们所要的所有信息,好了,今天就给大家讲这些了,希望各位牛人们指点!!加密与解密真的很好玩,要想真正掌握是很需要时间和精力的,不是一两天一两年的事,贵在坚持,最后给初学的菜鸟们一个忠告:加密与解密的路很长,不可能一下子掌握的,请不要浮燥!

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

上传的附件:
  • 1.jpg (9.21kb,1651次下载)
  • 2.jpg (7.36kb,1646次下载)
  • 3.jpg (237.31kb,1665次下载)
  • 4.jpg (37.11kb,1647次下载)
  • 5.jpg (231.66kb,1655次下载)
  • 6.jpg (39.79kb,1641次下载)
  • 7.jpg (203.30kb,1665次下载)
  • 8.jpg (38.74kb,1646次下载)
收藏
点赞0
打赏
分享
最新回复 (20)
雪    币: 267
活跃值: 活跃值 (49)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wswm 活跃值 2010-5-19 16:08
2
0
这么好的 贴没人顶?   我来顶顶 !!!!
雪    币: 122
活跃值: 活跃值 (429)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
曹无咎 活跃值 1 2010-5-25 20:20
3
0
这个seh有什么用,在看雪第二版上仔仔细细的看了不下十几遍,还是不明白seh究竟为何物,是不是程序设计者在编写程序的时候,故意在代码处加的的异常?还是什么东东,希望高手能给个解答。
雪    币: 564
活跃值: 活跃值 (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lixupeng 活跃值 2010-10-3 08:56
4
0
当然是设计者故意写的阻止破解者跟踪
雪    币: 522
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ddsoft 活跃值 2010-10-6 21:00
5
0
这个《加密与解密》已经讲得非常清楚了。。。
雪    币: 522
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ddsoft 活跃值 2010-10-6 21:01
6
0
SEH的用处非常大。建议参考《Windows核心编程》第五版。
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sku 活跃值 2010-10-7 08:21
7
0
学习了  ...
雪    币: 211
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vintor 活跃值 2010-10-21 13:31
8
0
有点点晕~为啥要bp401000
雪    币: 244
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
suyuhai 活跃值 2010-10-21 13:40
9
0
特意强调公布QQ号码? 广告贴? 内容也不符合题目说明吧?
雪    币: 643
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
StudyRush 活跃值 3 2010-11-1 16:15
10
0
学习了,现在也在学习Win32汇编,还想看《Windows程序设计》《Windows核心编程》。
雪    币: 211
活跃值: 活跃值 (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bluesheet 活跃值 2010-12-4 00:54
11
0
顶一个,不错
雪    币: 227
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
enfeeling 活跃值 2011-1-14 01:59
12
0
异常发生时,堆栈中有一个SE,是异常发生时处理函数的地址,那个地址就是401000
要跟踪异常处理函数,所以要bp401000
雪    币: 53
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jacksona 活跃值 2011-1-20 23:41
13
0
呵,加油,不错。
雪    币: 190
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pasta 活跃值 2011-3-1 20:04
14
0
seh还是看的似懂非懂,学习了
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
csiau 活跃值 2011-3-24 07:35
15
0
好文,ddddddddddddddddddddddd
雪    币: 385
活跃值: 活跃值 (33)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
小小的心 活跃值 2 2011-3-25 00:39
16
0
好文啊 赞个
雪    币: 575
活跃值: 活跃值 (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zadley 活跃值 2011-7-9 18:23
17
0
学习了,多谢
雪    币: 49
活跃值: 活跃值 (17)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-7-10 15:11
18
0
小弟说句话,干脆你来讲算了
雪    币: 267
活跃值: 活跃值 (49)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wswm 活跃值 2012-8-2 17:33
19
0
今天学到这突然看下这篇文章  居然发现沙发是我的  当时也不知道怎么回复的  可能灌水  哈哈
现在能看懂  哎。  其实就是定义一个回调函数  我不知道能不能这样讲  个人的理解   然后让异常发生并且把回调函数的地址给异常发生时 调用   跟钩子有点相似   - -都是预先定义一个回调函数。。一点愚见
雪    币: 238
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
封心锁爱 活跃值 2012-8-2 18:08
20
0
先make,有空看
雪    币: 713
活跃值: 活跃值 (67)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
xyy吸氧羊 活跃值 2018-3-25 15:35
21
0
请教一下:代码中_Handler过程有4个参数,而实际用到的参数只有两个,我看《winPE指南》和《加解密》上的几个代码都是这样写的,所以我试着把没有用到的参数的删除了,结果发现程序一直重复执行_Handler,想问下这是为什么啊?
游客
登录 | 注册 方可回帖
返回