码迷,mamicode.com
首页 > 其他好文 > 详细

x64 stack walking、调用约定、函数参数识别

时间:2019-02-21 18:56:03      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:操作   回写   cal   变化   div   gpo   entry   amd   函数参数   

k = <rsp> <rip> <frame_count>
x64下manual stack walking与x86不同,x86一般情况下有ebp chain,x64没有ebp chain,类似x86的FPO
x64下,rsp在函数执行完prologue之后就不会变化(调用约定);
所以
0.如果函数内执行了call指令,call指令返回地址压栈后,rsp就会减8;
1.也就是说,在stack reconstruction时,识别到返回地址所在的栈地址,再加8,就是当前函数执行完prologue的rsp;
2.由于x64非叶子函数有function table entry,记录unwind info,包括prologue操作,所以根据unwind info,可以还原进入当前函数时rsp的值,这个值就是指向本函数执行完时的返回地址;
3.这时在回到步骤1,就是stack walking;

参考

http://blogs.msdn.com/b/ntdebugging/archive/2010/05/12/x64-manual-stack-reconstruction-and-stack-walking.aspx

 

调用约定

amd64规范,rdi,rsi,rdx,rcx,r8,r9,栈

ms规范,rcx,rdx,r8,r9,栈

func1(int a, int b, int c, int d, int e);

// a in RCX, b in RDX, c in R8, d in R9, e pushed on stack

注意,无论是amd还是ms,寄存器传送的参数在栈上都有home space,callee可选择是否把寄存器参数回写栈,debug下通常会,release下home space会作其他用途

 

函数参数识别

由于参数用寄存器传送,所以release下,参数查找会比较麻烦,通常做法是1.查看汇编代码,看参数传到那里才mov到栈;2.查看参数来源;

x64 stack walking、调用约定、函数参数识别

标签:操作   回写   cal   变化   div   gpo   entry   amd   函数参数   

原文地址:https://www.cnblogs.com/hjbf/p/10414489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!