x64 stack walking、调用约定、函数参数识别
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、调用约定、函数参数识别的更多相关文章
- 托管调试助手 "PInvokeStackImbalance":的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管
在C#中一定要检查引用时的数据类型 WinAPI 的数据类型 默认是32位的,但是引用时外部的是 Long类型默认是64位的.所以引用时需要将 long 改为 int 型. 参照 http://blo ...
- C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”
调用外部dll时,出现如下问题 C# DllImport“调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PInvoke 签名的调用约定和参数与非托管的目标 ...
- 检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
解决方案: [DllImport("Dll.dll")]改为[DllImport("Dll.dll", CallingConvention=CallingCon ...
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
转自:https://www.cnblogs.com/qinfengxiaoyue/archive/2013/02/04/2891908.html 函数在C++编译方式与C编译方式下的主要不同在于:由 ...
- x86 x64下调用约定浅析
x86平台下调用约定 我们都知道x86平台下常用的有三种调用约定,__cdecl.__stdcall.__fastcall.我们分别对这三种调用约定进行分析. __cdecl __cdecl是C/C+ ...
- x64汇编第三讲,64位调用约定与函数传参.
目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...
- C/C++:函数的调用约定(Calling Convention)和名称修饰(Decorated Name)以及两者不匹配引起的问题
转自:http://blog.csdn.net/zskof/article/details/3475182 注:C++有着与C不同的名称修饰,主要是为了解决重载(overload):调用约定则影响函数 ...
- X86调用约定 calling convention
http://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A 这里描述了在x86芯片架构上的调用约定(calling con ...
- CPP-基础:有关调用约定
在C语言中,假设咱们有这样的一个函数:int function(int a,int b) 调历时只有用result = function(1,2)的方法就能利用这个函数.然而,当高档语言被编译成计算机 ...
随机推荐
- O-C-11-利用类方法做一个简单的计算器
#import <Foundation/Foundation.h> @interface calculator : NSObject //@property double numb ...
- Linux常用(持续更新)
1. scp ./bcec_computernode_check.sh root@10.254.3.1:/tmp 2. # uname -a # cat /proc/version # cat /e ...
- mysql学习笔记(1)
参考教材<MySQL入门经典> 王雨竹 高飞 机械工业出版社 软件下载:http://www.mysql.com 安装好后打开命令提示符 (黑窗口) net start mys ...
- 【POJ2094】【差分序列】Angry Teacher
Description Mr. O'Cruel is teaching Math to ninth grade students. Students of course are very lazy, ...
- C# 利用TextBox的Text属性实现换行加字符 "\r\n"
要让一个TextBox显示多行文本就得把它的Multiline属性设置为true,可是如果你是要把TextBox的Text属性设置多行文本时,换行符由两个字符组成:"\r\n". ...
- Thrift 应用场景(收集版)
官网: http://thrift.apache.org/ 一些介绍使用的文章: http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift ...
- 将数据库二进制图片导出显示到EPPlus Excel2007中
1.EPPlus Excel 控件可以参考我的另一篇博客:http://blog.163.com/pei_huiping/blog/static/206573067201281810549984/ 这 ...
- javascript 节点的增,删,改,查
1.创建节点 A.创建元素节点 document.createElement("元素标签名"); B.创建属性节点 document.createAttribut ...
- [转]maven插件的开发
原文链接: http://clojure.iteye.com/blog/1124188 另一篇文章 http://blog.csdn.net/csfreebird/article/details/77 ...
- rgba兼容IE系列
在容器里面如果用到opacity或者filter:opacity里面的内容也会被滤镜化 如果不想里面的内容也被滤镜化我们可以用rgba来处理或者用透明的背景图片. 兼容ie的rgba的写法 backg ...