首页
社区
课程
招聘
[求助]结构化异常SEH,求助!!!
发表于: 2017-5-17 09:33 3272

[求助]结构化异常SEH,求助!!!

2017-5-17 09:33
3272

我在学习大佬写的结构化异常,我运行大牛的代码,正常可以运行,但是为什么放到OD调试器,只要执行引发异常的语句,就会退出,而不进入自定义的异常函数???


#include "stdafx.h"

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

#include <stdio.h>

DWORD scratch;

EXCEPTION_DISPOSITION __cdecl _except_handler( 

                                                struct _EXCEPTION_RECORD *ExceptionRecord,

                                                void * EstablisherFrame,

                                                struct _CONTEXT *ContextRecord,

                                                void * DispatcherContext 

                                              )

{

    unsigned i;

    // 指明是我们让流程转到我们的异常处理程序的

    printf( "Hello from an exception handler\n" );

    // 改变CONTEXT结构中EAX的值,以便它指向可以成功进写操作的位置

    ContextRecord-> = (DWORD)&scratch;

    // 告诉操作系统重新执行出错的指令

    return ExceptionContinueExecution;

}

int main()

{

    DWORD handler = (DWORD)_except_handler;

    __asm

    { 

        // 创建EXCEPTION_REGISTRATION结构:

        push handler        // handler函数的地址

        push FS:[0]            // 前一个handler函数的地址

        mov FS:[0],ESP        // 安装新的EXECEPTION_REGISTRATION结构

    }

    __asm

    {

        mov eax,0            // 将EAX清零

        mov [eax], 1        // 写EAX指向的内存从而故意引发一个错误

    }

    printf( "After writing!\n" );

    __asm

    { 

        // 移去我们的EXECEPTION_REGISTRATION结构

        mov eax,[ESP]        // 获取前一个结构

        mov FS:[0], EAX        // 安装前一个结构

        add esp, 8            // 将我们的EXECEPTION_REGISTRATION弹出堆栈

    }

    return 0;

}


[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 222
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
个人觉得可能是od先捕捉到了这个异常。
2017-5-17 11:38
0
雪    币: 7265
活跃值: (5088)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
OD设置下,把这个异常忽略掉.
2017-5-17 12:42
0
雪    币: 51
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
不就是忽略所有异常的啊!还是不行,额。。
2017-5-17 17:02
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
编译为debug试试
2017-5-17 18:03
0
雪    币: 51
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
就是debug版本,Release版本也不行。
2017-5-17 18:50
0
雪    币: 401
活跃值: (45)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
od那个,有点问题的,64位系统有时候选择忽略异常没用,x86的话在xp下测试
x64的话用x64Dbg,或者你不管x86还是x64都用x64Dbg试试
2017-5-17 18:59
0
雪    币: 51
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
多谢啦,x64可以,谢谢大佬们啦!!!
2017-5-17 21:19
0
雪    币: 134
活跃值: (377)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
这与操作系统处理异常的流程息息相关。操作系统对异常做了分类,例如:访问内存异常(读写内存一类的);除零异常;特权指令异常;等等。。。发生上述异常后,会通过中断进入0环,然后操作系统对异常进行派发。如果有调试器,操作系统优先派发给调试器,如果调试器未能处理这个异常或没有调试器存在,操作系统则调用线程相关的SEH处理例程等等。。。(楼主可以参看坛主的加密与解密,有详细的介绍)。此处,很明显要么就是你的调试器接管了异常。要么就是SEH的处理例程已经执行,只是你跟飞了。
2017-5-18 04:34
0
雪    币: 134
活跃值: (377)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10

调试SEH有技巧的。在异常发生前,首先定位到第一个SEH处理例程,并设置断点。然后调试器选择忽略所有异常。接着步过(setp  over)或者步入(step  in)。然后就会断在SEH处理例程的第一条语句。此处重点就是定位SEH处理例程的位置。

2017-5-18 04:37
0
雪    币: 44
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
触发seh修改程序流程
2017-5-18 08:56
0
雪    币: 51
活跃值: (11)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
SevenSir 这与操作系统处理异常的流程息息相关。操作系统对异常做了分类,例如:访问内存异常(读写内存一类的);除零异常;特权指令异常;等等。。。发生上述异常后,会通过中断进入0环,然后操作系统对异常进行派发。如果 ...
好的老大,学到了,多谢帮助,多谢!
2017-5-21 12:56
0
游客
登录 | 注册 方可回帖
返回
//