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.查看参数来源;
转载于:https://www.cnblogs.com/hjbf/p/10414489.html
x64 stack walking、调用约定、函数参数识别相关推荐
- 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 用c#调用视频接口相关的dll,dll ...
- 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配...
VS10下调用dll,代码如下: // C++接口声明 void test(char *str);// 接口声明 [DllImport("datalib.dll", EntryPo ...
- shell调用python函数 参数 返回_Python之系统shell交互(subprocess)
subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码.这个模块的目的在于替换几个旧的模 ...
- php调用字符串函数参数,如何从包含参数的变量中存储的字符串调用PHP函数
我从这里找到了问题.但我需要用参数调用函数名.我需要能够调用一个函数,但是函数名存储在一个变量中,这是可能的吗?例如: function foo ($argument) { //code here } ...
- python函数的用法详解(作用、定义、调用、函数参数、函数返回值、函数说明文档、函数嵌套使用)
1. 函数的作⽤ 函数就是将⼀段具有独⽴功能的代码块整合到⼀个整体并命名,在需要的位置调⽤这个名称即可完成对应的需求. 函数在开发过程中,可以更⾼效的实现代码重⽤. 2. 函数的使⽤步骤 2.1 定义 ...
- x64汇编第三讲,64位调用约定与函数传参.
目录 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 二丶x64汇编 2.1汇编详解 x64汇编第三讲,64位调用约定与函数传参. 一丶复习X86传参 在x86下我们汇编的传参如下: ...
- C#调用VC的DLL的接口函数参数类型转换一览表
handle---------IntPtr hwnd-----------IntPtr char *----------string int * -----------ref int int & ...
- 【转】调用约定__cdecl、__stdcall和__fastcall的区别
什么是调用约定 函数的调用约定,顾名思义就是对函数调用的一个约束和规定(规范),描述了函数参数是怎么传递和由谁清除堆栈的.它决定以下内容:(1)函数参数的压栈顺序,(2)由调用者还是被调用者把参数弹出 ...
- 2020-11-13(调用约定)
a. x86 32位架构的调用约定 __cdecl:参数从右往左依次压入栈中,调用完毕,由调用者负责将这些压入的参数清理掉,返回值置于EAX中,绝大多数x86平台的c语言程序都在使用这种约定 __st ...
最新文章
- 【java】过滤器filter的使用
- raid模式_基于网络的磁盘热备技术|网络RAID-1
- React Hook基本使用踩坑指南
- petapoco mysql_PetaPocoEfCoreMvc[持续更新]欢迎在github上star
- 指纹图谱相似度评价软件_基于指纹图谱和网络药理学对当归四逆汤中桂枝的Qmarker预测分析...
- 就业局培训计算机心得,人社局计算机培训心得体会.doc
- java通用分页条件查询_通用分页查询
- iPhone的mysql客户端_适用于iPhone的MySQL C API库
- CS-- WebService、 windowsService
- 利用最新的开源软件构建日志管理系统
- 后台运行 命令_Docker基本命令
- Office 右键新建没有office选项怎么办
- 舆情热度实时数据查询分析怎么做的方法措施
- 做谷粒商城电脑配置不够怎么办?
- CISC和RISC的区别
- python新打包工具,最好用的版本之一,不接受反驳
- n个节点互异的拉格朗日插值基函数之和等于一证明
- python adb 实现对支付宝登录及后台监控
- RGB与YUV格式详解
- 抓取Bilibili哔哩哔哩网站视频(Java和Python双版本实现)