我想解开x64调用栈,所以我尝试遵循在这里找到的“ UNWIND过程”:
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx

我了解如果RIP在Epilog中,我们需要考虑仍需要完成的操作来计算RSP的偏移量,但是我不清楚如何确定RIP是否在Epilog中(在本节中) 3.A)?
有人可以向我解释吗? (链接或代码示例也将不胜感激)

===============>>#1 票数:2

放松程序

为了确定RIP是否在结尾中,请检查从RIP开始的代码流。 如果该代码流可以与合法Epilog的结尾部分匹配,如CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAA REF _Ref496092425 \\ r \\ h 0部分中所述,则在Epilog的剩余部分中进行记录,并记录在Epilog中,并记录在处理每条指令时更新

,以及Prolog和Epilog的文章(为了更好的理解,我建议您全文阅读)

这些是结语的唯一合法形式。 它必须包含一个加法RSP,constant或lea RSP,constant [FPReg],然后是一系列零个或多个8字节寄存器pop和一个return或jmp。 (在结语中仅允许使用jmp语句的一个子集。 没有其他代码可以出现。 特别是,结语中不能安排任何事情,包括返回值的加载。

注意,当不使用帧指针时,结尾必须使用add RSP,constant来释放堆栈的固定部分。 它可能不使用lea RSP,constant [RSP]代替。 由于存在此限制,因此展开代码在搜索Epilog时识别的模式较少。

看来,如果代码发现自己处于这种情况下,那么就检查那些特定指令的当前执行代码,如果匹配,就认为自己在结语中。

  ask by Idov translate from so

未解决问题?本站智能推荐:

1回复

x64堆栈中查找RUNTIME_FUNCTION的算法

我正在尝试展开x64堆栈。 为此,我需要遵循此处指定的算法: http://msdn.microsoft.com/zh-CN/library/8ydc79k6.aspx 但是为了遵循它,我需要知道如何找到正确的RUNTIME_FUNCTION ,但是我无法为此找到完整的算法...
1回复

异常,堆栈展开,封装的堆内存,exit()[重复]

这个问题已经在这里有了答案: 内存释放和异常 4个答案 当引发异常时,从堆栈中展开引发异常的块: 当Object在堆上的构造内存上分配并在销毁时正确地对其进行分配时,则应该没有内存泄漏,因为堆栈展开调用x析构x (不是y ,但是Object保证构造函数失败时
1回复

在异常c ++中展开堆栈

我开始学习C ++中的异常主题。 我遇到了“堆栈展开”一词,据我所知,这意味着每当引发异常且“ throwing function”内没有catch块时,函数堆栈就会“展开”,由此所有本地对象的d'将调用tor(在外部函数中也会发生同样的情况,直到遇到合适的catch块为止)。 我的问题
1回复

堆栈展开动态创建的对象,其构造函数也作用于堆

当类的构造函数在堆上分配内存时,例如 我有一个功能,例如 如果ptr = new bla(1e10)的分配是成功的(这意味着, data和size分配)而不是构造函数 - >他抛出异常,因为1e10是大的,会发生什么? 我没有data = new double [size
1回复

是否有任何方法导致整个堆栈帧在C ++中展开? (除了使用例外)

我一直在写一个延续 - 特定的,协程 - 库。 它类似于std :: thread(除了它是合作的) - 每个执行上下文都在continuation对象中表示。 问题是关于持续对象的破坏。 如果在执行上下文没有正常退出时调用continuation对象的dtor,则应该强制它被销毁该对
3回复

如何在析构函数中检测堆栈展开

我有一个简单的C ++对象,我在函数F()的开头创建,以确保在F()的启动和返回时调用两个匹配的函数(OpDo,OpUndo),方法是使用对象的构造函数和析构函数。 但是,如果在F()的主体内抛出异常,我不希望撤消操作。 这可以干净利落吗? 我读过有关std :: uncaught-exc
1回复

堆栈展开时使用RAII是否安全?

问题是 - 当AutoSomething的析构函数被调用时,Object的状态是否正常?
2回复

放开/追上堆栈安全吗?

问:在堆栈展开时引发并捕获异常是安全的,还是应用程序调用在第二次引发时terminate ? 最小的例子: 看完这个问题我很好奇。 注:我知道你可以/应该catch(...)在析构函数,但是否有意义,一般有一个try/catch在catch块-也许在所谓例外的一些功能( re
3回复

RAII和堆栈展开

直到我对RAII和堆栈展开的“相互缠绕”(由于缺乏更好的词)的概念(如果不是完全的话)是完全错误的。 我的理解是使用RAII可以防止任何/所有资源泄漏-甚至可能由未处理的异常导致的泄漏。 但是,编写此测试程序并随后绊倒本文/文档使我意识到,堆栈展开只会导致在尝试块内自动启用RAII的资源
4回复

如何在析构函数期间检测到异常是否处于活动状态?

在C ++中,我如何在析构函数的主体中检测是否由于抛出异常而取消了堆栈的堆栈? 一旦检测到,是否可以引用活动异常? 我之所以问是因为我想添加一些调试代码来解释为什么可能会出现某种情况以及它是否是由于异常引起的。