C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原
C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原
我们以前讲SEH异常处理的时候已经说过了,C++中的Try catch语法只不过是对SEH做了一个封装.
如果不懂SEH异常处理,请点击博客链接熟悉一下,当然如果不想知道,也可以直接往下看.因为异常处理所以做了封装,但是不影响我们还原.
这里有两种解决方法,
第一种,小白也能明白了还原方式,不用懂原理
第二种,了解其原理,并能在IDA中正确的还原.
SEH异常处理博客链接:
http://www.cnblogs.com/iBinary/category/1083755.html
一丶小白也懂的异常处理还原.
第一种,不用懂任何原理,(反汇编要懂,最起码的汇编代码知道是什么,不然这个专题讲了你也看不懂)
先看下高级代码:
int main(int argc, char* argv[])
{
try
{
throw ;//抛出3整形的异常
}
catch (int)
{
printf("%d\r\n",);
}
return ;
}
OD调试,观看步骤.
首先步骤分两步.
1.找SEH异常处理回调.
2.找参数多的call下断点
3.最后一个是call 寄存器.则找到正确的cath位置.
1.找到SEH的异常处理回调函数(如果不懂,看下SEH的筛选器异常.)
观看栈参数,可以看到回调函数地址是00410CC0,此时反汇编窗口跟过去下断点.
2.观看参数多了call,下断点,然后跟进.
因为层级较多,这里大家动手实战即可.
3.找到最后一层call一个寄存器.
此时则找到了我们的cath处理块了.
二丶理解原理进行实战.
上面说的,不懂原理你也可以做.比如以后工作了,原理不懂,起码做代码还原的时候还可以混口饭吃 ^_^
下面讲解原理.
首先,我们先寻找数据关系.
一个函数可以有多个 try 这是没问题的,所以 函数和try的关系是一对多的关系.
一个try有多个catch也是没有问题的.那么对应关系也是一对多.
所以操作系统为了管理这些.需要建表.(当然是未公开的),我们可以逆向得知.
1.原理介绍,上半部分表
观看表
看到怎么多表是不是很晕.其实很简单,只是里面的某个字段对我们有用.
1.观看函数信息表FuncInfo,重要字段就是dwTryCount,以及pTryBlockMap,我们说过一个函数可以有多个try,所以函数信息就记录了try的个数.以及每个try的try块结构,关于上面的成员,都是SEH的异常展开的.要做首尾动作的,对于我们还原没有任何阻碍,可以不用理解.
2.TryBlockMap表(tyr块信息表),我们还说过,一个try可以有多个catch,显然,try块信息表也要记录catch的个数.一个catch信息块的结构.
3.cathch信息块的结构体(msRTTIDsrc)msRTTIDsrc这个表是IDA识别的,我们可以自己说他是catch信息表,msRTTIDsrc的全名是 Microsoft Run Time TypeInfo ....微软运行时类型识别.
表结构体中重要字段就是 dwCount,catch信息快的个数,一个cathch信息表.
4.catch信息表(msRTTIDsrc),里面有4个成员, nflag 一个标志,表示你是常量,还是变量,还是引用. ptype,表示你的类型是什么类型.是int,还是float什么的,这个有个专门的表格存放着.下面重要字段则是catch的函数地址.编译器内部编译的时候,编译的catch是一个函数,也是有返回值的,返回值是catch_end的位置.
到这里,我们的上半部分就看完了.
总结一下:
对于上半部分.主要着重于 函数信息表,try块表.catch表.以及catch块表.
为什么说上半部分,是这样的,对于我们还原来说.有两种情况.
1.完整的还原trycatch的异常信息结构
2.找到关键的catch匹配函数.
这两种是完全不一样的,如果我们还原就看上版本的表.如果我们要找那个catch捕获异常,则看下部分的表,(下面讲解.)
实战演练.
实战演练的时候,我们就要知道函数信息表在哪,其实我们已经找到了,只不过大家不知道,按照小白思路为什么一路跟就可以找到catch块表.只是我们没讲.
1.找到注册异常回调的地方,进入回调函数内部.
2.看到反汇编.
这个地方,给eax赋值的地址就是函数信息表了.我们用IDA打开.根据表结构可以很自然的就能找到.catch块的位置.
IDA实战.
1.找到函数信息表点击进去
可以看到MaicNumber等等一些列的东西.
,通过最后一个成员,可以找到Try块信息表.
2.找到Try块信息表
可以看到Try块信息表中有几个Catch信息.
3.找到Catch信息表.
看到最后是catch的回调地址,里面则是catch的位置.
我们也能看到类型是什么.自己点击进去看看即可.
4.找到Catch函数地址,点击查看.
正确找到了Catch块了.
2.下半部分表格详解.
上面的部分是针对我们还原做的.下半部分主要就是找我要快速定位这个异常是谁接受的,那个catch块处理的.
第一个表 异常抛出表,重要字段catch数组表
第二个表是个数组表,一个throw对应多个catch,所以有个数组,这个数组是异常匹配表.表明了有多少个catch可以匹配.
一个记录个数,第二个成员则是二级指针.其内容是一个地址,其地址是一个cathc信息块的结构.
实战演练.
关于异常抛出表要怎么寻找,还记得的我们的高级代码有一个 throw吗?,其位置就是抛出异常表的位置.
关于抛出异常,我们需要了解的知识.当我们抛出一个常量或者变量的时候,不管怎么样,都会建立一个内存单元来接受我们抛出的值.所以别看你抛出的是常量,其实也成为内存单元了,也相当于一个变量了.
1.找到异常信息表.
最后一个成员是catch表.这个表保存了可以匹配的catch有多少个.
2.找到catch异常信息匹配表.
可以看出,值为1,下面是一个catch表,表明了有一个匹配的.
3.找到catch信息表.
通过异常信息表的第二个参数,也就是类型表,可以看是哪个匹配的.而且对类型表做一个引用,看谁引用类类型表,则能找到catch的函数地址.当然这一步是还原的动作.
4.找到类型表.对类型表做一个交叉引用.
如果引用显示的太少了,可以自己百度, IDA引用数量调整.看怎么设置的,或者当前位置按 x键查看.
如果按x,跳过去的是try块表,你需要通过try块表可以直接查看.那个catch信息表.
今天讲的主要是表结构.如果想对每一个成员都了解,并且想知道怎么跟出来了. 可以看一下书籍 <<C++反汇编与逆向分析揭秘>>也就是一本小黄书.
C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原的更多相关文章
- C++反汇编第五讲,认识C++中的Try catch语法,以及在反汇编中还原
我们以前讲SEH异常处理的时候已经说过了,C++中的Try catch语法只不过是对SEH做了一个封装. 如果不懂SEH异常处理,请点击博客链接熟悉一下,当然如果不想知道,也可以直接往下看.因为异常处 ...
- 在Sql中使用Try Catch
原文:在Sql中使用Try Catch 今天在写sql中出现了!我想在sql使用trycatch吧! 哎..但是语法又记不住了! 那就清楚我们的google大师吧! 嘿,网上关于在sql中使用Try ...
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式 备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提. 2.子类继承父 ...
- python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍
目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...
- C++反汇编第四讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.
目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形式 一丶多重继承在内存中的表现形式 高级代码: class Father1 { ...
- Stanford机器学习---第六讲. 怎样选择机器学习方法、系统
原文:http://blog.csdn.net/abcjennifer/article/details/7797502 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...
- 机器学习基石的泛化理论及VC维部分整理(第六讲)
第六讲 第五讲主要讲了机器学习可能性,两个问题,(1)\(E_{in} 要和 E_{out}\) 有很接近,(2)\(E_{in}\)要足够小. 对于第一个假设,根据Hoefding's Inequa ...
- 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现
原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
随机推荐
- 349B - C. Mafia
C - Mafia Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit S ...
- sed基本常用命令
sed的基本操作 sed 's/a/b/g' 文件a 把文件a中的a修改成b 注意这只是临时的 注:s就是所有的意思,g是缓存区的意思 sed -i 's/a/b/g' 文件a 把文件a中的a修改成b ...
- 文本宽度的测量--measureText
HTML5中的canvas提供了文字宽度的测量方法: ctx.measureText(string).width var c=document.getElementById("myCanva ...
- Java微信公众平台开发_06_素材管理
一.本节要点 1.官方文档的media 这个media可以理解为文件,即我们需要以POST方式提交一个文件 2.媒体文件有效期 媒体文件在微信后台保存时间为3天,即3天后media_id失效. 二.代 ...
- 数据库(概念、语法、DBMS、SQL语言:创建数据库、表格,添加、修改、删除数据记录)
关系型数据库:以表作为实体,以主键和外键关系作为联系的一种数据结构. 主键:在关系型数据库中,用一个唯一的标识符来标志每一行,这个标识符就是主键.主键有两个特点:非空和不能重复. 外键:在关系型数据库 ...
- 特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)
一.基本概念: 作用:特征点提取在"目标识别.图像拼接.运动跟踪.图像检索.自动定位"等研究中起着重要作用: 主要算法: •FAST ,Machine Learning forHi ...
- 六:在线工具网站,让你PC上要装的软件少一半!
记住这几个在线工具网站,让你PC上要装的软件少一半! 一.uzer.me——丰富的云端应用聚合 这个云平台将我们常用的Office系列软件.Adobe家族的系列软件……乃至CAD制图都整合在了云端,随 ...
- android wear开发之:建立可穿戴设备的应用 - Building Apps for Wearables
注:本文内容来自:https://developer.android.com/training/building-wearables.html 翻译水平有限,如有疏漏,欢迎批评指教. 译:山人 建立可 ...
- [转载] NoSQL简介
摘自“百度百科”. NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从 ...
- .net core2.0下使用Identity改用dapper存储数据
前言. 已经好多天没写博客了,鉴于空闲无聊之时又兴起想写写博客,也当是给自己做个笔记.过了这么些天,我的文笔还是依然那么烂就请多多谅解了.今天主要是分享一下在使用.net core2.0下的实际遇到的 ...