SEH 前几天看了一下,大概知道了一下,之前也是有一些了解的,MS 为了程序的健壮性,增加了 SEH ,我想,这个其实,就是一个回调函数,我们平时的编程用的不多,可能应为我们的水平还有待提高吧。。
回到正题,以前在 加密3 中知道,这是一种链式的 分发函数, 当程序产生异常时,系统捕获到之后,它会立刻跳向
异常处理的函数链表的开头,在这个 MS 定义的一场表中寻找能够处理这样异常情况的函数,当然,这是在我们自己的
程序中没有 定义自己的回调函数 来处理 异常的情况下的,那好,如果,我们定义了我们自己的异常处理函数,
那么, 程序会首先在我们的 程序 中来执行异常的处理机制,如果我们搞定不了,系统就会来接管,如果还不行,
系统就会强制的结束程序。 这些都是我之前知道的东西。。
那么我们能怎么样来利用这样的机制能。。。
1:在编程中,函数之间的数据传递过程中,我们可以加入我们的异常处理函数,增加我们程序的健壮性, 我们可以自己来封装一些 MS 提供的一些东西, 想对字符串的操作,我们就可以 加入 对字符串 buffer 的校验,当然在写一些保护程序的时候,反调试, debugxxx ,当调用这样的函数是,我们就可以 结束产生一个让系统和程序无法恢复的错误,
就像最近调试驱动 经常弄得XP 蓝屏一样。。
2:那么,在逆向的过程中,我们同样可以在解密的过程中利用这样的特点来对付,为了保护程序而故意产生的异常
来干扰我们的调试的 SEH ,具体 的 做法有三种,前几天,我总结了一下,本质上还是根据 MS 处理异常调用的
一个内核的.DLL, KiUserExceptionDispatcher ----> CALL ZwContinue ; 调用 ZwContinue , 我们可以根据当时 寄存器 ECX + 0XB8 来得到我们的 出口地址。