C++ x64堆栈展开并检查裂缝是否在尾声中

C++ x64堆栈展开并检查裂缝是否在尾声中,c++,64-bit,stack-unwinding,C++,64 Bit,Stack Unwinding,我想解开x64调用堆栈,所以我尝试按照我在这里找到的“解开过程”进行操作: 我知道如果RIP在尾声中,我们需要计算RSP的偏移量,考虑到仍然需要进行的操作,但我不清楚如何确定RIP是否在尾声中(在第3.a节中)? 谁能给我解释一下吗?(链接或代码示例也将不胜感激)来自 要确定RIP是否在epilog中,请输入RIP中的代码流 对其进行了检查。如果该码流可以与尾随的 合法尾声的一部分,如第节所述 CNDJ6NN5US4RJIIAQGBLQQSCAAAAAAAAAA4AAABFAFIAZQBMAD

我想解开x64调用堆栈,所以我尝试按照我在这里找到的“解开过程”进行操作:

我知道如果RIP在尾声中,我们需要计算RSP的偏移量,考虑到仍然需要进行的操作,但我不清楚如何确定RIP是否在尾声中(在第3.a节中)?
谁能给我解释一下吗?(链接或代码示例也将不胜感激)

来自

要确定RIP是否在epilog中,请输入RIP中的代码流 对其进行了检查。如果该码流可以与尾随的 合法尾声的一部分,如第节所述 CNDJ6NN5US4RJIIAQGBLQQSCAAAAAAAAAA4AAABFAFIAZQBMADQAOQAAQAAQAAQAAQADQAAQAAQAAQADQAAQAAQAAQADQAAQAAQAAQAAQADQAAQAAQAAQAAQAAQAAQAAQAAQAAQAAQAAQAA REF _Ref496092425\r\h0,则它在尾声中,其余的 epilog的一部分是模拟的,上下文记录更新为 每个指令都会被处理

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

这些是尾声的唯一合法形式。它必须包括 一个add RSP常量或lea RSP常量[FPReg],后跟一个 一系列零或多个8字节寄存器POP和一个返回或一个jmp。 (epilog中只允许jmp语句的子集。[…])。 无法显示其他代码。特别是,什么都不能改变 在epilog中计划,包括加载返回值

注意,当不使用帧指针时,epilog必须使用add RSP,用于释放堆栈固定部分的常量。它可能不会使用 lea RSP,改为常量[RSP]。此限制存在,因此展开 在搜索结束语时,代码要识别的模式较少


似乎,如果代码发现自己处于这种情况,它只会检查当前执行的代码中是否有这些特定的指令,如果匹配,则认为自己在结束语中。

我建议阅读有关x64 ABI的文章:我在这个链接中找不到任何有帮助的内容。。。