2008年4月19日

SEH学习

据我所知,SEH在很多加壳程序里经常出现。
貌似就是try{} catch{} finally{}的本质体现

很多介绍SEH的教程前面都有这么一句

push 00401037 ; SE handler installation
push dword ptr fs:[0]
mov dword ptr fs:[0], esp

什么意思呢?

fs指向一个TIB结构 (THREAD INFORMATION BLOCK)
第一个元素fs:[0]指向一个_EXCEPTION_REGISTRATION结构

fs:[0]->
_EXCEPTION_REGISTRATION struc
prev dd ? ;前一个_EXCEPTION_REGISTRATION结构
handler dd ? ;异常处理例程入口
_EXCEPTION_REGISTRATION ends


这里

push 00401037 ; SE handler installation
push dword ptr fs:[0]
mov dword ptr fs:[0], esp


第一步放我们的异常处理函数地址

第二步放fs:[0]指向的异常处理函数地址

第三步用esp地址覆盖fs:[0]地址

结果就是这样,














图中栈顶数据为旧的fs:[0]地址,现在新的fs:[0]还是指向他,
改变的是第二个结构,即
handler dd ? ;异常处理例程入口

这样做,当发生异常就可以跳到我们自己定义的异常处理函数去了。

可以用od数据窗口跟踪最初的结构,比如dd fs:[0]

可以看出是这样的链式结构



没有评论: