x64堆栈展开并检查RIP是否在epilog中

时间:2013-04-16 16:45:05

标签: c++ 64-bit stack-unwinding

我想解开一个x64 callstack,所以我试图遵循我在这里找到的“UNWIND程序”:
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx

据我所知,如果RIP在epilog中,我们需要计算RSP的偏移量,考虑到仍然需要完成的操作,但我不清楚如何判断RIP是否在epilog中(在第3.a节)?
有人可以向我解释一下吗? (链接或代码示例也将非常感激)

1 个答案:

答案 0 :(得分:2)

来自The Unwind Procedure

  

确定RIP是否在epilog内,来自RIP的代码流   在检查。如果该代码流可以与尾随匹配   合法句子的一部分,如章节所述   CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAA   REF _Ref496092425 \ r \ h 0,然后它是一个epilog,剩下的   模拟了epilog的一部分,并将上下文记录更新为   处理每条指令

,来自Prolog and Epilog(我推荐整篇文章以便更好地理解)

  

这些是epilog的唯一合法形式。它必须包括   添加RSP,常量或lea RSP,常量[FPReg],然后是a   一系列零个或多个8字节寄存器弹出和一个返回或jmp。   (在epilog中只允许jmp语句的一个子集。[...])。   没有其他代码可以出现。特别是,没有什么可以   在epilog中安排,包括加载返回值。

     

请注意,当不使用帧指针时,epilog必须使用add   RSP,常量取消分配堆栈的固定部分。它可能不会使用   lea RSP,而不是[RSP]。这种限制存在,因此放松   代码搜索epilog时识别的模式较少。

似乎如果代码发现自己处于这种情况,它只会检查当前执行的代码以获取那些特定指令,如果匹配,则认为自己在epilog中。