首页
社区
课程
招聘
[求助]学习VEH遇到不解的问题.
发表于: 2011-7-28 18:48 7803

[求助]学习VEH遇到不解的问题.

2011-7-28 18:48
7803
小弟学习刚刚学习VEH,在安装VEH时,调用安装函数AddVectoredExceptionHandler 时,进程就突然退出了,什么消息提示信息也没有.
小弟实在不解上来请教朋友们指点.

下面是程序代码:

LONG NTAPI VEHandler(PEXCEPTION_POINTERS pExceptionInfo) 
{
    // 异常处理函数
    OutputDebugString("Catch an exception by VEH!/r/n");
    return EXCEPTION_CONTINUE_SEARCH; 
} 
 
 
void SetupVEHandler() 
{ 
    __try 
    { 
        OutputDebugStringA("Before Setup!/r/n"); 
 
        // 执行下面的 AddVectoredExceptionHandler 时进程就结束了
        // 什么提示信息也没有,就像调用了TerminateProcess 那样就结束了
        // 这是为什么呢?
        AddVectoredExceptionHandler( 1 , VEHandler );
 
 
        OutputDebugStringA("After Setup!/r/n"); 
    } 
    __finally 
    { 
        int iNum = GetLastError(); 
        char cNum[10]; 
        _itoa(iNum,cNum,16); 
        OutputDebugStringA(cNum); 
    }
}
 
void CCErrorDlg::OnBnClickedBtnStep()
{
    // TODO: 在此添加控件通知处理程序代码
    // 安装VEH
    SetupVEHandler();
}
 
void CCErrorDlg::OnBnClickedBtnError()
{
    // TODO: 在此添加控件通知处理程序代码
 
    // 制造一个除0 异常
    int a = 0; 
    int b = 1 / a;
}
 


就是这么简单的代码.这是为什么,为什么执行到 AddVectoredExceptionHandler 时程序会退出..

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
因为 OutputDebugString 会再次产生中断,

于是你挂掉了
2011-7-29 02:15
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你把 OutputDebugString  注释掉就OK 了
2011-7-29 02:15
0
雪    币: 14
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢你.确实是这样的!!
2011-7-29 10:27
0
雪    币: 14
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可是我又遇到 了问题

LONG NTAPI VEHandler(PEXCEPTION_POINTERS pExceptionInfo) 
{
    // 异常处理函数
    OutputDebugString("Catch an exception by VEH!/r/n");
    return EXCEPTION_CONTINUE_SEARCH; 
} 
 


异常当然是处理异常的,可是这个异常处理函数怎么实能OD 那样的忽略异常呢?
这个异常函数函数我不知道怎么写才能实现达到忽略异常的目的.

不管是返回 EXCEPTION_EXECUTE_HANDLER , 还是 EXCEPTION_EXECUTE_FAULT , 还是 EXCEPTION_CONTINUE_SEARCH

最后应用\程序都会崩溃,就是说,异常没有得到像 try catch  , try except 那样的处理.
比如,还是上面的代码
	// 制造一个除0 异常
	__try
	{
		int a = 0;
		int b = 1 / a;
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		OutputDebugString( "继续往下执行" );
	}


请问要怎么实现像 try except  的功能呢?
就是说,出错了,捕获到并处理之后,让程序继续运行, 不会处理完后,程序还是崩溃.

谢谢
2011-7-29 10:36
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
OutputDebugString 应该只会在调试器里起作用的,而且就算有调试器,也应该是debugger先收到异常,怎么会导致程序crash呢。
2011-7-29 12:41
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
#define EXECPTION_CONTINUE_EXECUTION -1
处理了异常之后返回这个继续执行.
另外OD所谓的"忽略异常"其实是指OD不处理该异常,让系统继续往下搜索异常处理程序,也就是EXECPTION_CONTINUE_SEARCH
2011-8-2 12:20
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
OutputDebugString是会产生一个异常的,你在异常处理中触发了异常,自然就挂了
2011-8-2 12:22
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
我的意思是OutputDebugString只会在调试器里起作用的,有了调试器,就打印log,没有,就什么都不做。

这个函数会产生异常,但仅仅在有debugger的情况下产生,而且debugger总是会首先收到并且处理。和应用应该关系不大。
2011-8-3 10:20
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
没记错的话,异常是在没有debugger的情况下也会产生
2011-8-4 16:17
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我对这个问题一直很好奇,MSDN上如是说

If the application has no debugger, the system debugger displays the string if the filter mask allows it. (Note that this function calls the DbgPrint function to display the string. For details on how the filter mask controls what the system debugger displays, see the DbgPrint function in the Microsoft Windows Driver Kit (WDK) on MSDN.) If the application has no debugger and the system debugger is not active, OutputDebugString does nothing.

最近抽出空来调试了一下这个问题,有了些结果。分成2个问题:
1. 异常处理的失效
2. VEH中的陷阱
2011-8-25 15:38
0
雪    币: 1596
活跃值: (30)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
12
好像是取得context后,设置它里面的EIP,看<软件加密技术内幕>P118
2011-11-27 20:11
0
游客
登录 | 注册 方可回帖
返回
//