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.查看参数来源;

转载于:https://www.cnblogs.com/hjbf/p/10414489.html

x64 stack walking、调用约定、函数参数识别相关推荐

  1. 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

     调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 用c#调用视频接口相关的dll,dll ...

  2. 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配...

    VS10下调用dll,代码如下: // C++接口声明 void test(char *str);// 接口声明 [DllImport("datalib.dll", EntryPo ...

  3. shell调用python函数 参数 返回_Python之系统shell交互(subprocess)

    subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码.这个模块的目的在于替换几个旧的模 ...

  4. php调用字符串函数参数,如何从包含参数的变量中存储的字符串调用PHP函数

    我从这里找到了问题.但我需要用参数调用函数名.我需要能够调用一个函数,但是函数名存储在一个变量中,这是可能的吗?例如: function foo ($argument) { //code here } ...

  5. python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)

    1. 函数的作⽤ 函数就是将⼀段具有独⽴功能的代码块整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求. 函数在开发过程中,可以更⾼效的实现代码重⽤. 2. 函数的使⽤步骤 2.1 定义 ...

  6. x64汇编第三讲,64位调用约定与函数传参.

    目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...

  7. C#调用VC的DLL的接口函数参数类型转换一览表

    handle---------IntPtr hwnd-----------IntPtr char *----------string int * -----------ref int int & ...

  8. 【转】调用约定__cdecl、__stdcall和__fastcall的区别

    什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的.它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出 ...

  9. 2020-11-13(调用约定)

    a. x86 32位架构的调用约定 __cdecl:参数从右往左依次压入栈中,调用完毕,由调用者负责将这些压入的参数清理掉,返回值置于EAX中,绝大多数x86平台的c语言程序都在使用这种约定 __st ...

最新文章

  1. 【java】过滤器filter的使用
  2. raid模式_基于网络的磁盘热备技术|网络RAID-1
  3. React Hook基本使用踩坑指南
  4. petapoco mysql_PetaPocoEfCoreMvc[持续更新]欢迎在github上star
  5. 指纹图谱相似度评价软件_基于指纹图谱和网络药理学对当归四逆汤中桂枝的Qmarker预测分析...
  6. 就业局培训计算机心得,人社局计算机培训心得体会.doc
  7. java通用分页条件查询_通用分页查询
  8. iPhone的mysql客户端_适用于iPhone的MySQL C API库
  9. CS-- WebService、 windowsService
  10. 利用最新的开源软件构建日志管理系统
  11. 后台运行 命令_Docker基本命令
  12. Office 右键新建没有office选项怎么办
  13. 舆情热度实时数据查询分析怎么做的方法措施
  14. 做谷粒商城电脑配置不够怎么办?
  15. CISC和RISC的区别
  16. python新打包工具,最好用的版本之一,不接受反驳
  17. n个节点互异的拉格朗日插值基函数之和等于一证明
  18. python adb 实现对支付宝登录及后台监控
  19. RGB与YUV格式详解
  20. 抓取Bilibili哔哩哔哩网站视频(Java和Python双版本实现)

热门文章

  1. python基础知识-列表,元组,字典
  2. 二:Go编程语言规范-类型
  3. vue从入门到精通之进阶篇(五)脚手架vue-cli
  4. css3 pointer-events:none 允许点击穿透
  5. debian apt-get联网安装mysql服务
  6. yii2中的rules验证规则
  7. 重写setTimeout扩展参数
  8. Linux运维系统工程师系列---13
  9. python 细枝末节
  10. 从外网给新建的Exchange 2007/2010分发通讯组发邮件失败