首页
社区
课程
招聘
SEH异常捕获不了?
发表于: 2013-12-15 14:21 9059

SEH异常捕获不了?

2013-12-15 14:21
9059
win 7 64位系统下为什么捕获不了异常?访问异常直接崩溃

DWORD abcd;

EXCEPTION_DISPOSITION
__cdecl
_except_handler(struct _EXCEPTION_RECORD * ExceptionRecord,
    void * EstablisherFrame,
    struct _CONTEXT * ContextRecord,
    void * DispatcherContext)
{
  ContextRecord->Eax = (DWORD)&abcd;

  return ExceptionContinueExecution;
}

int main()
{
  DWORD handler = (DWORD)_except_handler;

  __asm
  {
    push handler

    push dword ptr fs:[0]

    mov dword ptr fs:[0],esp

    xor eax,eax

    mov [eax],0  //异常

    pop dword ptr fs:[0]

    add esp,4
  }

  return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
记得64位的SEH不是这样放了
2013-12-15 14:27
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
和系统位数没关系,64位系统也有32位子系统,和纯32位系统一样的
自己写一个__try{}__catch(...){}
如果能捕获就是代码问题
2013-12-15 23:05
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
__try是很简单
问题是要写成纯汇编的形式
2013-12-16 14:25
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你的代码写的都没有问题,但是你忽略了一点,win7有引入新的安全机制。
简单调试下不难发现,SEH没生效是因为RtlIsValidHandler这个函数返回了false,只要把返回值改成1就正常。搜下这个鸟函数你会得到更详细的原因和一堆解决方案。
我告诉你一个最简单的改法,在vs工程配置-linker-command line-additional options加入/SAFESEH:NO。
2013-12-16 14:34
0
游客
登录 | 注册 方可回帖
返回
//