首页
社区
课程
招聘
[求助]问个简单的问题, 关于筛选器异常处理的
发表于: 2010-2-2 21:06 3992

[求助]问个简单的问题, 关于筛选器异常处理的

2010-2-2 21:06
3992
是这样的, 在学习WIN32汇编的, 在筛选器异常处理这里碰到一个小问题, 我想在异常发生后, 跳到ShowMessage();这里执行, 也就是在异常处理回调函数的时候设置CONTEXT中EIP的值, 有没有哪位大侠知道怎么用C语言实现的.
#include <windows.h>

int ExceptionHandle(EXCEPTION_POINTERS *);
int (*lpNewHandle)(EXCEPTION_POINTERS *);
int ShowMessage(void);
int (* lp)(void);

int (*lpBackHandle)(HWND, LPCTSTR, LPCTSTR, UINT);
LPTOP_LEVEL_EXCEPTION_FILTER lpOldHandler;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        int x = 0;
        int y;
   

        lpNewHandle = ExceptionHandle;

        lpOldHandler =SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)lpNewHandle);
     y = 4 / x;

         lp = ShowMessage;
    ShowMessage();
    SetUnhandledExceptionFilter(lpOldHandler);
    return 0;
}

int ExceptionHandle(EXCEPTION_POINTERS *lpExceptionPoint)
{
        char szBuffer[256];
        wsprintf(szBuffer, TEXT("异常发生位置: %08X, 异常代码: %08X, 标志: %08X"),
                lpExceptionPoint->ContextRecord->Eip, lpExceptionPoint->ExceptionRecord->ExceptionCode, lpExceptionPoint->ContextRecord->EFlags);
          lpExceptionPoint->ContextRecord->Eip = (LPTOP_LEVEL_EXCEPTION_FILTER)lp;
        MessageBox(NULL, szBuffer, NULL, MB_OK);

        return EXCEPTION_CONTINUE_EXECUTION;
}

int ShowMessage()
{
        MessageBox(NULL, TEXT("Welcome Back"), NULL, MB_OK);
        return 0;
}

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 347
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
y = 4 / x;

lp = ShowMessage;

这两句好歹也换个顺序阿。。。。
2010-2-2 22:16
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
俺知道错了, 换回来就可以了。。。 谢谢了
2010-2-3 11:23
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
不过还是有个小问题啊, 就是在这里
lpExceptionPoint->ContextRecord->Eip = (LPTOP_LEVEL_EXCEPTION_FILTER)lp;修改了线程环境块的指令寄存器的值, 异常处理回调函数返回后到ShowMessage函数执行, 然后该函数执行完后, 使用ret指令返回。。。 但是由于前面并没有调用ShowMessage函数, 所以没有把函数返回地址压栈, 也就是说ShowMessage函数返回后不会到达  
SetUnhandledExceptionFilter(lpOldHandler);
    return 0;这里的, 这个问题该怎么解决呢?
2010-2-3 11:49
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
顶起来等高手~~~
2010-2-4 09:44
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
这个问题还是没想明白...    哪位大侠来解释下呀
2010-2-5 22:05
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
#include <windows.h>

int ExceptionHandle(EXCEPTION_POINTERS *);
int (*lpNewHandle)(EXCEPTION_POINTERS *);
int ShowMessage(void);
int (* lp)(void);
void *p;

int (*lpBackHandle)(HWND, LPCTSTR, LPCTSTR, UINT);
LPTOP_LEVEL_EXCEPTION_FILTER lpOldHandler;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  int x = 0;
  int y;   

  lpNewHandle = ExceptionHandle;

  lpOldHandler =SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)lpNewHandle);
  lp = ShowMessage;
  __asm push eax;
  __asm mov eax,offset _L1;
  __asm mov p,eax;
  __asm pop eax
  y = 4 / x;
  __asm _L1:
  ShowMessage();
  SetUnhandledExceptionFilter(lpOldHandler);
  return 0;
}

int ExceptionHandle(EXCEPTION_POINTERS *lpExceptionPoint)
{
  char szBuffer[256];
  wsprintf(szBuffer, TEXT("异常发生位置: %08X, 异常代码: %08X, 标志: %08X"),
           lpExceptionPoint->ContextRecord->Eip, lpExceptionPoint->ExceptionRecord->ExceptionCode, lpExceptionPoint->ContextRecord->EFlags);
  lpExceptionPoint->ContextRecord->Eip = (int)lp;
  lpExceptionPoint->ContextRecord->Esp -= 4;
  *(int*)lpExceptionPoint->ContextRecord->Esp = (int)p;
  MessageBox(NULL, szBuffer, NULL, MB_OK);

  return EXCEPTION_CONTINUE_EXECUTION;
}

int ShowMessage()
{
  MessageBox(NULL, TEXT("Welcome Back"), NULL, MB_OK);
  return 0;
}
本代码的着色效果由xTiNt自动完成
下载xTiNt http://211.90.75.84/web/kanaun/download/xTiNt.rar
2010-2-8 09:43
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
小弟受教了...
2010-2-8 22:58
0
游客
登录 | 注册 方可回帖
返回
//