天下

记录修行的印记

VC的SEH中的终结处理

//直接上代码
#include <iostream>
#include 
<windows.h>

void PrintHelp()
{
    printf(
"Usage:d04 <Number>\n");
}
int main(int argc,char* argv[])    
{
    
int nNumber = 0;
    
if (argc <2)
    {
        PrintHelp();
        
return -1;
    }
    nNumber 
= atoi(argv[1]);
    __try {
        printf(
"You Entered:%s \n",argv[1]);
        
if (nNumber<0)
        {
            __leave;
        }
        
if (nNumber==0)
        {
            
goto EXIT_BYE;
        }
        
if (nNumber>0)
        {
            
return -1;
        }
    }
    __finally {
        printf(
"ret Code:%d\n",AbnormalTermination());
    }
EXIT_BYE:
    
return 0;    
}



反汇编之后,
大意就是
在__try保护块中,
VC编译器会在return 及goto之前加入
call MSVCR90!local_unwind4+0x82的函数调用 
而local_unwind4又会调用
MSVCR90!NLG_Dispatch2+0x8 (78590adc)
然后又call到
78590adc ffd0    call    eax {d04!main+0x10b (0040110b)} ;这里就是__finally终结块代码.
另:
__leave是__try保护块的正常结束.



posted on 2011-11-05 14:57 天下 阅读(398) 评论(0)  编辑 收藏 引用 所属分类: Win32逆向工程


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿(4)

随笔分类(377)

随笔档案(327)

链接

最新随笔

搜索

最新评论