SEH 结构化异常处理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标题:【原创】加密与解密二版菜鸟学习笔记(2) - SEH 结构化异常处理
作者:ytcswb
时间: 2005-02-01,16:40:24
链接: /showthread.php?t=10651
看学加密与解密二版学习笔记(2) - SEH 结构化异常处理
[ 工具] flyod1.10
[ 目的] 学习SEH的手法,另书中是用SoftICE调试的,看起来不习惯.根据原文内容重新整理一下,便于和我一样的菜鸟们一起学习.
今天下决心,好好学习,这是就算是个开始吧!感觉学明白的确很不容易!
[ 注释] ?--为不能理解的地方,请大侠们指点一下.学习过程中,有理解错误的地方,肯请大侠们多多指教.
[练习对象] 加密与加密二版第10章,光盘配套的练习软件:seh.exe seh2.exe
[ writer ] ytcswb 2005.2.1 感谢看学及论坛的大侠们为我们提供这么好的学习资料。
1.例子seh.exe学习:
00401000 > $ 8D4424 F8 lea eax,dword ptr ss:[esp-8] //程序入口!根据下面的代码分析,这里显然可以
//理解为开辟8字节的空间,并把栈顶指针保存到eax
//相当于sub esp,8 ; lea eax,dword ptr ss:[esp]
00401004 . 64:8705 00000>xchg dword ptr fs:[0],eax //记住fs[0]永远是指向当前err结构的指针,
//执行完成后,fs[0]指向栈顶,准备在堆栈中构造1个err结构
//eax等于原fs[0],即指向原来的err结构的指针,即那个err结构的地址
0040100B . BB 2E104000 mov ebx,Seh.0040102E //地址40102e-->ebx,建议在此地址上设断点,才能正常跟踪入seh代码中
00401010 . 53 push ebx //压入堆栈,即当前err结构的handler成员,当前异常处理代码的入口地址
00401011 . 50 push eax //压入原fs[0],即当前err结构的prev成员,即下一个err结构的地址
此时堆栈:
0012FFBC 0012FFE0 指针到下一个SEH 记录//0012FFE0是个指针,看看就知道指向下一个err结构,数值上等于下一个err结构的地址
0012FFC0 0040102E SE 句柄//建立了1个当前的err结构
0012FFE0 FFFFFFFF SEH 链尾部
0012FFE4 77E74809 SE 句柄
err结构的定义[在Essup.INC源文件中定义的---VC++ CRT(CRT含义:C++RunTime library)]: _EXCEPTION _REGISTERA TION stru
prev dd ? //指向下一个err结构的指针,数值上等于下一个err结构的首地址(在堆栈中) handler dd ? //指向异常处理代码的指针,数值上等于异常处理代码的入口地址即首地址
_EXCEPTION _REGISTERA TION ends
00401012 . BE 00000000 mov esi,0 //简单的赋值语句00401017 . 8B06 mov eax,dword ptr ds:[esi] //读取线性地址0,产生异常
//执行后,windows检查到异常,执行线程马上被中段,从用户模式转到内核模式
//控制权交到操作系统的异常调试程序(exception dispatcher),由它负责找到
//处理这个异常的方法,即所有应用程序的异常最终都是由windwos来处理的,
//同一个版本的windows 有固定的异常处理代码.
//如果你把这句nop掉了,也就等于去除了异常.会接着执行到下面的代码,并显示"SEH Fail"!
00401019 . 6A00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0040101B . 68 00304000 push Seh.00403000 ; |Title = "OK" 00401020 . 68 10304000 push Seh.00403010 ; |Text = "SEH Fail"
00401025 . 6A00 push 0 ; |hOwner = NULL
00401027 . E8 1C000000 call
0040102C . EB 13 jmp short Seh.00401041
0040102E . 6A00 push 0 ; /Style = MB_OK|MB_APPLMODAL
00401030 . 68 00304000 push Seh.00403000 ; |Title = "OK" 00401035 . 68 03304000 push Seh.00403003 ; |Text = "SEH Succeed "
0040103A. 6A00 push 0 ; |hOwner = NULL
0040103C . E8 07000000 call
00401041 > 6A 00 push 0 ; /ExitCode = 0
00401043 . E8 06000000 call