异常是哪个函数帧中

caddor2011 2011-11-27 07:29:08
class Test
{
public:
Test(){std::cout<<"构造"<<std::endl;}
Test(Test const& obj)
{

std::cout<<"拷贝构造"<<std::endl;
}
~Test(){std::cout<<"析构"<<std::endl;}

public:

void f(int i) throw (Test)
{
if(i==0)
throw Test();
}
void what() const
{
std::cout<<"发生异常"<<std::endl;
}
};

int main()
{

try
{

Test obj;
obj.f(0);
}
catch(Test e) //这里不用引用,说是:obj拷贝一个临时对象,临时对象,然后拷贝生成了e
{

e.what();

}
return 0;

}


f抛出一个对象,Test()在f的函数帧中, 这个Test() 是如何拷贝到
main函数的函数帧呢??



以下是main的部分反汇编代码(有的地方看不懂, 汇编牛牛能帮忙注释以下嘛?)

33: Test obj;
004013E8 lea ecx,[obj]
004013EB call @ILT+165(Test::Test) (004010aa)
004013F0 mov dword ptr [ebp-1Ch],eax //eax将this传给[ebp-1Ch]
004013F3 mov byte ptr [ebp-4],1
34: obj.f(0);
004013F7 push 0 //压入立即数
004013F9 lea ecx,[obj] //_stdcall调用
004013FC call @ILT+155(Test::f) (004010a0)
35: }
00401401 mov byte ptr [ebp-4],0 //[ebp-4]里面保存的是 this,析构的时候放0-----------------这里理解有问题
00401405 lea ecx,[obj] //如果上一条指令的注释是对的话,这里就有问题了,this变成0,如果调用析构呢??
00401408 call @ILT+45(Test::~Test) (00401032)
36: catch(Test e)
0040140D jmp __tryend$_main$1 (0040142d)
__catch$_main$0:
0040140F mov byte ptr [ebp-4],3
37: {
38:
39: e.what();
00401413 lea ecx,[e]
00401416 call @ILT+25(Test::what) (0040101e)
40:
41: }
0040141B mov byte ptr [ebp-4],2
0040141F lea ecx,[e]
00401422 call @ILT+45(Test::~Test) (00401032)
00401427 mov eax,offset __tryend$_main$1 (0040142d)
0040142C ret
42: return 0;
0040142D mov dword ptr [ebp-4],0FFFFFFFFh
00401434 xor eax,eax
43:
44: }




谢谢了啊
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
caddor2011 2011-11-28
  • 打赏
  • 举报
回复
木有高手啊
caddor2011 2011-11-27
  • 打赏
  • 举报
回复
涉及到异常的 这个汇编内存分布 还真不好理解

一般的函数帧是这样的:

{this}
{obj}
{ebp}
{main地址}
{参数}

但是对于这个主帖的例子而言, 不好解释





[Quote=引用 5 楼 duke56 的回复:]
引用 3 楼 caddor2011 的回复:
囧, c++反汇编 是一本书啊


这个得多少时间能学完


引用 2 楼 duke56 的回复:
反汇编有:《加密与解密(第三版)》

可到这里看看:看雪软件安全论坛


也不用太多时间的,《加密与解密(第三版)》有编程基础的大多能直接看懂的...

这本书是众初级开始介绍的
[/Quote]
duke56 2011-11-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 caddor2011 的回复:]
囧, c++反汇编 是一本书啊


这个得多少时间能学完


引用 2 楼 duke56 的回复:
反汇编有:《加密与解密(第三版)》

可到这里看看:看雪软件安全论坛
[/Quote]

也不用太多时间的,《加密与解密(第三版)》有编程基础的大多能直接看懂的...

这本书是众初级开始介绍的
chouxiaoya1112 2011-11-27
  • 打赏
  • 举报
回复
《c++反汇编与逆向分析技术揭秘》本书既是一本全面而系统地讲解反汇编与逆向分析技术的安全类专著,又是一部深刻揭示c++内部工作机制的程序设计类著作。理论与实践并重,理论部分系统地讲解了c++的各种语法特性和元素的逆向分析方法和流程,重在授人以渔;实践部分通过几个经典的案例演示了逆向分析技术的具体实施步骤和方法。
  全书共分为三大部分:第一部分主要介绍了vc++6.0、ollydbg和反汇编静态分析工具的使用,以及反汇编引擎的工作原理;第二部分以c/c++语法为导向,以vc++6.0为例,深入解析了每个c/c++知识点的汇编表现形式,包括基本数据类型、表达式、流程控制语句、函数、变量、数组、指针、结构体、类、构造函数、析构函数、虚函数、继承和多重继承、异常处理等,这部分内容重在修炼“内功”,不仅讲解了调试和识别各种c/c++语句的方法,而且还深入剖析了各知识点的底层机制;第三部分是逆向分析技术的实际应用,通过对peid、“熊猫烧香”病毒、ollydbg调试器等的逆向分析将理论和实践很好地融合在了一起。
  本书适合所有软件安全领域的工作者、想了解c++内部机制的中高级程序员,以及对windows底层原理感兴趣的技术人员阅读。
caddor2011 2011-11-27
  • 打赏
  • 举报
回复
囧, c++反汇编 是一本书啊


这个得多少时间能学完

[Quote=引用 2 楼 duke56 的回复:]
反汇编有:《加密与解密(第三版)》

可到这里看看:看雪软件安全论坛
[/Quote]
duke56 2011-11-27
  • 打赏
  • 举报
回复
反汇编有:《加密与解密(第三版)》

可到这里看看:看雪软件安全论坛
caddor2011 2011-11-27
  • 打赏
  • 举报
回复
有没有 反汇编与c 的书啊,

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧