1

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

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

4

1 回答 1

2

放松程序

为了确定 RIP 是否在 Epilog 中,检查从 RIP 开始的代码流。如果该代码流可以匹配到合法 Epilog 的尾随部分,如 CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAA REF _Ref496092425 \r \h 0 部分所述,那么它在 Epilog 中,并且 Epilog 的剩余部分被模拟,带有上下文记录在处理每条指令时更新

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

这些是结语的唯一合法形式。它必须由 add RSP,constant 或 lea RSP,constant[FPReg] 组成,后跟一系列零个或多个 8 字节寄存器 pop 和 return 或 jmp。(结语中只允许使用 jmp 语句的子集。[...])。不能出现其他代码。特别是,不能在 Epilog 中安排任何内容,包括加载返回值。

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

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

于 2013-05-08T16:28:25.850 回答