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

原创 2004年07月08日 17:03:00

seh(3)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

  明天去郊外去春游,心里很兴奋哦。

   上次贴了一段代码,里面的回调函数有一长串参数,现在解释一下:

   _Handler  proc   _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext

 

   _lpExceptionRecord指向EXCEPTION_RECORD结构。

 

   _lpContext指向一个Context结构。这个结构保存了异常发生的时候所有寄存器的值。这个结构比较常用的字段有regEip。他用来得知异常发生的位置。如果要修正某个寄存器中的错误取值修改这个字段就可以了。

   _lpSEH指向注册回调函数时使用到的EXCEPTION_REGISTRATION结构的地址。如果希望异常处理程序能被封装在子程序里面的话,这个参数必不可少,如果不需要,就没用。

 

 

谈谈展开操作。

 

   什么叫展开?

   展开就是Unwinding。假设出现异常,seh链上有多个回调函数,但是没有一个函数能够处理的话,系统会把每一个回调函数调用一次,这个时候参数中指定的异常代码就是EXCEPTION_UNWIND。

 

好了,我们现在要应用了,SEH可以干什么?这其实是最先应该想到的,我们不可能什么都学,要有所选择。所以这应该是我们看这篇文章的第一个问题。

 

除了可以使我们的程序更加健壮,还可以做一些坏事,例如进入RING0,反跟踪,获得Kernel32的地址等等,这就是我学习seh的目的。我也是最近几天学seh的,在学习过程中我也有很多没明白的地方,希望和大家讨论一下

 

现在我们来预热一下:

CIH将handler指向它自己程序中。在它入口处有如下代码:

                                                                                 

    MyVirusStart:                                             

    ; Ring3代码入口点              

               push    ebp                                             

                                                                                 

    ; *************************************                                         

    ; * Let's Modify Structured Exception *                                         

    ; * Handing, Prevent Exception Error  *                                         

    ; * Occurrence, Especially in NT.     *                                         

    ; *************************************                                          

                                                                                

   lea  eax, [esp-04h*2]

;在栈中分配8字节存放_EXCEPTION_REGISTRATION结构,相当于C中基于栈的数据,即局部变量(C编译器中完成)这样EAX即指向_EXCEPTION_REGISTRATION的指针,但此时_EXCEPTION_REGISTRATION结构未初始化;具体实现机制可翻阅编译原理书籍和Matt Pietrek大师文章

               xor     ebx, ebx                                 

               xchg    eax, fs:[ebx] ;FS:[0]<->EAX

                       ;此时EAX存放的是原来异常处理代码,FS:[0]指向TEB中ExceptionList(FS指向TEB,ExceptionList偏移为0,即FS:[0])

                  call    @0                                              

         @0:                                                                             

               pop     ebx

                          ;此三行计算代码入口,此时ebx就是@0的地址,如果不明白请参看有关病毒的教程             

               lea   ecx, StopToRunVirusCode-@0[ebx]

                          ;将ecx指向自己内部代码处

               push    ecx

                       ;填充_EXCEPTION_REGISTRATION结构的handler

            ;在发生异常时,操作系统会自动调用,此时为CIH代码

                                                                   

               push    eax

                       ;EAX为原来异常处理代码

                       ;填充_EXCEPTION_REGISTRATION结构的prev

 

        .

        .

        .

                                                                         

    这其后CIH调用int 3使系统发生异常,仍能进入自已的代码,   

                        int 3 ;  

int3在破解中就是breakpoint,呵呵,学了一些时候的破解总算能用一下了。

 

 

呵呵,怎么样,是不是觉得也不是很难呢?

在这里,不知道你们有没有一个问题,这个问题从我开始学习cih代码到现在都一直存在,那就是,为什么可以用seh来现进入ring0,seh为实什么可以突破封锁进入ring0呢?我心里模模糊糊有点概念,但是写出来却写不清楚,大家如果谁知道,还请指教哦。

好了,下次我们就要开始令人激动的旅程了。

 

 

反调试—利用SEH链表

内容摘要:进程在被调试的时候,进程中TEB中的PEB中的BeingDebugged成员的值为1而正常情况下为0,于是通过访问该成员可知道当前是否为调试状态,来决定是否继续执行程序,原理和TLS反调试相...
  • qq_20977145
  • qq_20977145
  • 2016年08月03日 22:15
  • 899

深入研究Win32结构化异常处理(SEH总结篇)

深入研究Win32结构化异常处理(SEH总结篇)   本文假设你熟悉WIN32,C/C++。 引言:   本文是在《Win32 结构化异常处理(SEH)探秘》基础上做的更新总结。探索MS...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年04月10日 10:31
  • 1063

栈溢出利用SEH异常处理

前面一篇blog 里提到了基于堆溢出利用SEH的方式,本文将侧重于栈溢出利用SEH异常处理。     先来看下示例代码: #include #include char shellcod...
  • lixiangminghate
  • lixiangminghate
  • 2016年11月25日 11:52
  • 758

【VS开发】关于SEH的简单总结

尽管以前写过一篇SEH相关的文章《关于SEH的简单总结》, 但那真的只是皮毛,一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗.  1997年文章,Windows技...
  • LG1259156776
  • LG1259156776
  • 2016年05月21日 21:58
  • 1531

windows核心编程--SEH(结构异常处理)

SEH 的工作原理。          Windows 程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(...
  • FrankieWang008
  • FrankieWang008
  • 2013年12月18日 09:55
  • 1134

栈溢出笔记1.10 基于SEH的栈溢出

上节中简单地讲述了SEH的原理及逻辑结构。本节,要继续讲述SEH的物理结构及如何利用它进行栈溢出。先来看SEH的物理结构。先回想上节中的图51,我们在程序停在gets函数输入的时候查看SEH链,看到了...
  • hustd10
  • hustd10
  • 2016年04月16日 14:27
  • 4298

C++与SEH异常处理

参考以下两篇微软的文章:
  • atceedsun
  • atceedsun
  • 2014年08月02日 17:23
  • 1286

结构化异常(SEH)简述

结构化异常处理程序? SEH:structured Exception Handling,结构化异常处理。 结构化异常处理,是Windows操作系统上,Microsoft对C/C++程序语言做的语法...
  • yygydjkthh
  • yygydjkthh
  • 2014年08月04日 00:59
  • 2612

paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH Ca6

paip.提升用户体验---gcc c++ try catch不能捕获异常的解决--使用 SEH  Ca6     现象以及原因: 1 解决方法:使用SEH捕获异常: 1 可以使用SEH捕获...
  • attilax
  • attilax
  • 2013年10月06日 23:51
  • 6322

实践SEH攻击和虚函数攻击

试验工具:ollydbg(思考题程序见附件) 实验环境:windows2000虚拟机 1.目标 (1)了解SEH攻击及虚函数攻击的基本原理。 (2)通过调试SEH攻击代码,理解Windows异常处理机...
  • qq_32400847
  • qq_32400847
  • 2017年01月25日 20:36
  • 518
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习心得-------seh(3)
举报原因:
原因补充:

(最多只允许输入30个字)