我想解开一个x64 callstack,所以我试图遵循我在这里找到的“UNWIND程序”:
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx
据我所知,如果RIP在epilog中,我们需要计算RSP的偏移量,考虑到仍然需要完成的操作,但我不清楚如何判断RIP是否在epilog中(在第3.a节)?
有人可以向我解释一下吗? (链接或代码示例也将非常感激)
答案 0 :(得分:2)
确定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中。