2011-9-11
SetUnhandledExceptionFilter()函数来注册一个自己的未处理异常过滤函数,下面是一个code实例
/*
Demonstrates how to use SEH so that unhandled exception filter
can trap unhandled instructions.
*/
#include <windows.h>
#include <stdio.h>
LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo);
void main (void)
{
LPBYTE lpBuff = NULL;
// 注册自己的异常处理函数
SetUnhandledExceptionFilter (MyUnFilter);
*lpBuff = 54;
}
// 异常处理函数,可以自己实现所需的功能
LONG WINAPI MyUnFilter (struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
static int s_SigCount = 0;
DWORD dwExceptCode = lpExceptionInfo -> ExceptionRecord ->
ExceptionCode;
LONG lResult;
if (dwExceptCode == EXCEPTION_ACCESS_VIOLATION)
{
printf ("access violation caught by MyUnFilter\n");
++s_SigCount;
// test case to keep this from going on forever (since we're not
// fixing the AV)
if (s_SigCount < 5)
lResult = EXCEPTION_CONTINUE_EXECUTION;
else
lResult = EXCEPTION_EXECUTE_HANDLER;
}
else
lResult = EXCEPTION_CONTINUE_SEARCH;
return lResult;
}
暂时就先不考虑这个顶层过滤函数,从这个示例看,只能在进程内实现注册自己的异常处理函数,不清楚如何能够实现进程之间或是系统级实现注册自己的异常处理函数。当然可以通过修改注册表来实现定义自己使用的JIT(Just-In-Time Debugging,紧急调试)调试器,关于JIT调试器的配置信息在注册表:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug. 可以自己编写JIT程序,然后修改AeDbug键下的Debugger选项设置为:<路径>\OwnJIT.exe –p %ld –e %ld. 后面的参数UnhandledExceptionFilter为启动JIT而设置的。-p后的是发生错误的进程ID,-e后面的是事件的句柄,这些参数是通过UnhandledExceptionHandl传递过来的。
如果使用这种方式进行潜入或破坏的话,马上就会被发现,因为注册表被修改是一眼就能发现的。