找回密码
 注册
搜索
热搜: 回贴

旧调重弹-SetUnhandledExceptionFilter的使用问题,SetUnhand,系统底层

2010-1-22 18:41| 发布者: admin| 查看: 119| 评论: 0|原作者: 情殇


旧调重弹-SetUnhandledExceptionFilter的使用问题,SetUnhand,系统底层
2008年06月23日 星期一 下午 01:25
旧调重弹-SetUnhandledExceptionFilter的使用问题

kongfoo/2005.12.19



. Delphi中使用SetUnhandledExceptionFilter的问题



  这几天在写一个测试程序,包括使用SetUnhandledExceptionFilter来

反OD调试,关于SetUnhandledExceptionFilter的反调试原理之前(一年前了哈)

simonzh2000等人都有详细讲述,这里就不多讲了,在Delphi里面要用这个

函数却有点问题,先看看代码:



program SetUnhandledExceptionFilterTest;

uses Windows;



procedure Handler;

begin

MessageBox(Hwnd(0),’Final SEH’,’.’,0);

asm

mov eax,1

retn

end;

end;



begin

SetUnhandledExceptionFilter(@Handler);

asm

xor edx,edx

idiv edx

end;

end.



  很简单的一个程序,但得到的效果却不是预期之中的,在弹出’Final SEH’

之后又弹出一个Runtime error。如果在窗体之中的按钮事件里面写这样的测试

代码的话,效果更加是“离奇”,弹出一个“除0错”之后就没事发生了,根本

没有去Handler里面。

  究其原因,Delphi编译出来的程序有自己的一套用SEH建立起来的异常处理

机构,是自动的,在程序启动之初就建立起来了。就连上面这样简单的程序也一

样,在SetUnhandledExceptionFilter之前就建立了一个SEH结构。如果要达到预

期效果:发生异常时去到我们的Handler里面,然后就完事了,我们就要先清掉

Delphi建立的SEH。再来看看代码:



program SetUnhandledExceptionFilterTest;

uses Windows;



procedure Handler;

begin

MessageBox(Hwnd(0),’Final SEH’,’.’,0);

asm

mov eax,1

retn

end;

end;



begin

//首先要清掉SEH

asm

@Loop:

mov eax,fs:[0]

cmp dword ptr [eax],$FFFFFFFF

je @SEHCleared

mov eax,[eax]

mov fs:[0],eax

jmp @Loop

@SEHCleared:

end;

SetUnhandledExceptionFilter(@Handler);

asm

xor edx,edx

idiv edx

end;

end.



  现在程序按照我们的想法运行了。在窗体的按钮OnClick事件中使用也正常。

SetUnhandledExceptionFilter在高级语言中应用时应该要注意一下这个问题了。

特别是用高级语言写壳用到这个反调试技巧时。另外说一说在异常处理函数返回

值为-1时的问题。hume在《SEH in ASM研究》中的资料说到:



EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以优雅地结束了

EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束

EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行



  网上搜到一些关于SetUnhandledExceptionFilter的文章演示的都是返回值

为1的情况,而在反调试当中,这种情况是没用的,因为返回到系统之后程序就

结束了,有用的是返回为-1的情况。具体设置和我们平时的SEH异常处理函数类

似,在到达SetUnhandledExceptionFilter指定的异常处理函数之后,[[esp 4] 4]

处就是CONTEXT STRUCT。看代码可以更清晰(测试环境:winxp sp2):



//这里是用SetUnhandledExceptionFilter设置的异常处理函数

@Handler:

mov eax,[esp 4]

mov eax,[eax 4]

add dword ptr [eax 0B8],2 //异常指令2个字节长,加2指向下一条指令。eax指向CONTEXT STRUCT。

mov eax,-1

retn



//设置代码:

push offset @Handler

call SetUnhandledExceptionFilter

xor edx,edx

idiv edx

nop //可以在这里下断测试(当然,OD要patch UnhandledExceptionFilter)。



  OK,收工。


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 01:26 , Processed in 0.230624 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部