x64栈unwind和检查RIP是否在epilog中

x64 stack unwinding and checking if the RIP is in the epilog

本文关键字:是否 epilog RIP 检查 unwind x64      更新时间:2023-10-16

我想unwind一个x64调用栈,所以我试图遵循我在这里找到的" unwind过程":
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx

我明白如果RIP在epilog中,我们需要计算RSP的偏移量,考虑到仍然需要做的操作,但是我不清楚如何找出RIP是否在epilog中(在第3.a节中)?
有人能给我解释一下吗?(链接或代码示例也将非常感谢)

来自Unwind过程

确定RIP是否在epilog中,来自RIP的代码流On被检查。如果该码流可以与尾随的合法epilog的一部分,如章节所述CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAAREF _Ref496092425 r h 0,则它在epilog中,其余的模拟epilog的一部分,并将上下文记录更新为每条指令被处理

,以及Prolog和Epilog(为了更好地理解,我推荐整篇文章)

这些是尾声的唯一合法形式。它必须包含add RSP,constant或lea RSP,constant[FPReg],后面跟着a一系列的零个或多个8字节寄存器弹出和返回或跳转。(epilog中只允许使用jmp语句的一个子集。[…])。不能出现其他代码。特别是,没有什么是可以的在epilog中调度,包括加载返回值。

注意,当不使用帧指针时,epilog必须使用addRSP,用于释放堆栈中固定部分的常量。它可能不使用lea RSP,constant[RSP]代替。这个限制存在,所以unwind在搜索epilog时,代码需要识别的模式更少。

如果代码发现自己处于这种情况,它就会检查当前执行的代码是否符合这些特定指令,如果匹配,则认为自己在epilog中。