在反汇编中还原C++ SEH

反汇编时如果遇到C++ SEH,会遇到如何快速还原程序流程的问题?

假设有如下代码,我们用VS 2015将其编译为release版本:crack5.exe

int main()

{

try

{

throw 3;//抛出3整形的异常

}

catch (int)

{

printf("%d\r\n", 3);

}

return 0;

}

一、要解决的问题

IDA静态分析crack5.exe

1)怎样找到SEH异常处理回调?

2)怎样找到正确的catch处理函数?

二、理解原理并实战

IDA打开crack5.exe,可以一眼找到SEH异常处理结构:_main_SEH

双击_main_SEH,可以看到结构体402548,__CxxFrameHandler3根据结构体402548对程序进行处理。

(1)原理介绍,上半部分表

注:图片是从别的地方拷贝的,个别字段名称与下面讲的有所不同,意义相同不影响理解。

下面我们来看看结构体 402548

stru_402548对应的为函数信息表FuncInfo。

struct FuncInfo {

    DWORD magicNumber;  // 编译器版本

    int maxState;      // 栈展开描述表中的入口数量

    UnwindMapEntry* pUnwindMap;  // 栈展开处理方法绑定表

    DWORD nTryBlocks;    // 函数中的 try 语句块数量

    TryBlockMapEntry* pTryBlockMap;  // try-catch 映射表

DWORD nIPMapEntries;

    void* pIPtoStateMap;

    ESTypeList* pESTypeList;

    int EHFlags;

}

重要字段就是dwTryCount以及pTryBlockMap,我们说过一个函数可以有多个try,所以函数信息就记录了try的个数.以及每个try的try块结构,关于上面的成员,都是SEH的异常展开的.

pTryBlockMap对应为stru_40257C,点击如下所示

TryBlockMapEntry 的定义如下。一个try可以有多个catch,显然,try块信息表也要记录catch的个数。

如果存在多个catch,如何区分?需要查看 tryLow、tryHight、catchHigh进行比对,就是看作用域最终确定catch函数。

struct TryBlockMapEntry {

    int tryLow;

    int tryHigh;    // this try {} covers states ranging from tryLow to tryHigh

    int catchHigh;  // highest state inside catch handlers of this try

    int nCatches;  // number of catch handlers

    HandlerType* pHandlerArray;  //catch handlers table

};

点击stru_402590,它为HandlerType结构,有时IDA识别为__msRttiDscr,两者相同。 可以看这个try由loc_401047进行处理,对应的数据项为addressOfHandler。

401047指向了sub_401080,做打印处理。

HandlerType的定义如下

struct HandlerType {

    DWORD adjectives;

    TypeDescriptor* pType;

    int dispCatchObj;

    void* addressOfHandler;

};

到这里,上半部分就看完了。

总结一下:对于上半部分,主要着重于函数信息表,try块信息表和catch信息表。顺藤摸瓜找到catch函数地址。

(2)原理介绍,下半部分表

下半部分用来快速定位异常由谁接收,哪个catch块处理。

实战演练

记得最开始C代码有一个throe吗?其位置就是抛出异常表的位置

首先,找到被抛异常的信息表

struct ThrowInfo {

    DWORD attributes;

    void (*pmfnUnwind)();

    int (*pForwardCompat)();

    CatchableTypeArray* pCatchableTypeArray;

};

接着,找到与之匹配的CatchableTypeArray。从中可以看到由1个匹配的CatchableTypes

struct CatchableTypeArray {

    int nCatchableTypes;  // number of entries in the following array

    CatchableType* arrayOfCatchableTypes[0];

};

接着,找catch 这种异常的类型为int型。IDA显示为??_R0H@8

struct CatchableType {

    DWORD properties;

    TypeDescriptor* pType;

    PMD thisDisplacement;

    int sizeOrOffset;

    void (*copyFunction)();

};

最后,选择??_R0H@8,按x,看到??_R0H@8类型被stru_402590交叉引用了

最终,异常被 loc_401047处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • layout: wikititle: Windbg调试笔记categories: Debugdescription...
    超哥__阅读 19,416评论 0 17
  • // com.adobe.flash.listen settings.gradle 定义项目包含那些模块app.i...
    zeromemcpy阅读 1,611评论 0 1
  • 所谓对抗反汇编技术,就是再程序中使用一些特殊构造的代码或者数据,让反汇编分析工具产生不正确的程序代码列表。这种技术...
    doinb1517阅读 1,323评论 0 2
  • 来源:http://bbs.ichunqiu.com/thread-8849-1-1.html?from=ch 首...
    池寒阅读 2,222评论 0 1
  • 1.插入流氓字节,阻止真正的指令被反汇编 线性反汇编和面向代码流的反汇编: 线性反汇编是遍历一个代码段,一次一条指...
    看点书阅读 1,135评论 0 1