首页
社区
课程
招聘
[旧帖] [分享]SEH学习心得 0.00雪花
发表于: 2008-7-25 15:43 4995

[旧帖] [分享]SEH学习心得 0.00雪花

2008-7-25 15:43
4995
SEH(Structured exception hangling)是windows操作系统提供的结构化的异常处理。
以前看到些讲SEH的文章讲的比较抽象,而且多是用API操作,内部机制不清楚,多是讲到使用API SetUnhandledExceptionFilter 加入自已的异常处理过程。今天偶尔在杀毒时看到一段修改SEH的代码,就再看了一遍,才知道了SHE的结构是:
;                                        fs:[0]  -> ptr1
;                                        ptr1 [ ptr2 ]
;                                         [ SEH 处理程序1 ]
;                                        ptr2 [ ptr3 ]
;                                        [ SEH 处理程序2 ]
;                                                .
;                                                .
;                                                .
;                                        ptrEnd [ FFFFFFFF ] ;SEH链尾部
;                                        7C821A60  系统的SE处理程序

分析过程:

原代码:
0040D9C9  |.  68 40DB4000   push    <jmp.&MSVCRT._except_handler3>   ;  SE 处理程序安装
0040D9CE  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
0040D9D4  |.  50            push    eax
0040D9D5  |.  64:8925 00000>mov     dword ptr fs:[0], esp

我用它重写 Hume 大侠的SEH演示程序中的SetUnhandledExceptionFilter
部分内容,用以分析SEH的变化:

;==========================================
; ex. 1,by Hume,2001 演示final型异常处理
;==========================================
.586p
.model flat, stdcall
option casemap :none   ; case sensitive
include windows.inc      ;头部包含文件
include user32.inc
include kernel32.inc
includelib kernel32.lib
includelib user32.lib

        .data
szCap     db "By Hume[AfO],2001...",0
szMsgOK db "OK,the exceptoin was handled by final handler!",0
szMsgERR1 db "It would never Get here!",0
        .code
_start:
          push offset Final_Handler
       ;栈顶情况           0012FFC0   0040103A ;要加入的SEH处理过程入口

          ;call SetUnhandledExceptionFilte ;这个是原来的,不用了
          assume fs:nothing  ;这句要加入
                        ;fs:[00000000]=[7FFDE000]=0012FFE0

                        ;0012FFE0  FFFFFFFF  SEH 链尾部
                        ;0012FFE4  7C821A60  SE处理程序

          mov     eax, dword ptr fs:[0]
                        ;           eax = 0012FFE0H   ;原SEH链的首部
          push eax
                                ;栈顶情况          0012FFBC   0012FFE0  ;链接到原SEH链首部
                                ;                        0012FFC0   0040103A  ;新的SEH处理过程入口
                               
                                ;原情况 7FFDF000  0012FFE0  (指向 SEH 链指针)
          mov dword ptr fs:[0],esp
                                ;执得上句之后 7FFDF000  0012FFBC  (指向 SEH 链指针)  ;新SEH链首部写入,替换掉原来的SEH首部
        xor      ecx,ecx
        mov      eax,200   
        cdq
        div       ecx                                ;除0错误
                ;以下永远不会被执行
        invoke       MessageBox,0,addr szMsgERR1,addr szCap,30h+1000h  
        invoke       ExitProcess,0                    ;30h=MB_ICONEXCLAMATION ;1000h=MB_SYSTEMMODAL
        ;-----------------------------------------
Final_Handler:
       invoke       MessageBox,0,addr szMsgOK,addr szCap,30h
       mov       eax,EXCEPTION_EXECUTE_HANDLER     
                ;==1 这时不出现非法操作的讨厌对话框
        ;mov       eax,EXCEPTION_CONTINUE_SEARCH   
        ;==0 出现,这时是调用系统默认的异常
                ;处理过程,程序被终结了
        ;mov ecx,1
        ;mov    eax,EXCEPTION_CONTINUE_EXECUTION
                ;==-1 不断出现对话框,你将陷入死循环,可
                ;别怪我
       ret
        
end _start

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习下
2008-7-25 15:49
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
好文章~~
就是没有看明白`~~
2008-7-25 17:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
div ecx来触发的exception?程序自身触发的exception,能不能提交一段shellcode来触发呢?
2008-8-3 08:58
0
雪    币: 241
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5

可以的,有这方面的文章
2008-8-7 19:40
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
不知道楼主是用什么来编程的了!能个个真实的离子吗!
2008-8-7 19:46
0
雪    币: 241
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
我用ASM写
例子挺多的,这里给个我刚作出的一个小东西:

;程 序 名: SEH.asm
;功 能: 看看就会明白,SEH演示,还有SEH的用处
;工作方式: 用SEH来执行API
;作 者: UPlusPlus
;时 间: 2008/08/08
.386
.model flat, stdcall
option casemap: none

include
\masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\debug.inc
include user32.inc

includelib \masm32\lib\kernel32.lib
includelib user32.lib
includelib \masm32\lib\masm32.lib

SetSEH
Macro Porc
assume fs: nothing
push offset
Porc
push fs:[0]
mov
fs:[0], esp
ENDM


UnSetSEH Macro
pop
fs:[0]
add
esp,4
ENDM

.data
dwVar dword 0
szMessage byte "Message", 0


.code

SEHFlag equ 0AFAFAFAFh

start:

;-----------------------------------------------------------------------
;the code below shows how to use PrintException macro

;install new seh
SetSEH SEHproc

xor eax, eax
push 00000000h ; 引发MessageBoxA
push NULL
push offset szMessage
push 00000000h
;call MessageBoxA
mov eax,077E5425Fh ;addr of MessageBoxA in Windows Server 2K3 SP1,硬编码,懒下
call SpringSEH

;restore previous SEH
UnSetSEH
ret
call
MessageBox ;这句不会执行,仅仅是为了让Masm32将user32.dll加载进来

SpringSEH:
mov
ecx,SEHFlag
xchg eax,[eax]


SEHproc proc pExcept: DWORD, pFrame: DWORD, pContext: DWORD, pDispatch: DWORD
mov
edx, pContext ; <--------+断点一,考察栈情况
mov eax, (CONTEXT ptr [edx]).regEcx
xor eax,SEHFlag
je @F
mov
eax,EXCEPTION_CONTINUE_SEARCH
ret
@@:
push (
CONTEXT ptr [edx]).regEax
pop (CONTEXT ptr [edx]).regEip
mov eax, ExceptionContinueExecution ;返回继续执行
ret
SEHproc endp


end
start
2008-8-8 12:51
0
雪    币: 261
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
膜拜一下!看不懂牛人的巨作,汇编还有努力啊!
2008-8-8 13:38
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持,谢谢分享
2008-8-8 16:44
0
游客
登录 | 注册 方可回帖
返回
//