函数调用方式_stdcall 、 _cdecl 、_thiscall

目录

前言

__stdcall

__cdecl

__thiscall

__fastcall


前言

了解函数调用约定对逆向反汇编的分析会提供极大帮助。

__stdcall

__stdcall的全称是standard call。是C++的标准调用方式。

函数参数的入栈顺序为从右到左入栈。函数返回时使用retn x指令,其中x为调整堆栈的字节数。这种方式叫做自动清栈。即被调用的函数的参数个数是固定的,调用者必须严格按照定义传递参数,一个不多,一个不少。

堆栈平衡方式: __stdcall自动清栈

返回指令:_stdcall使用retn x

编译后函数的修饰名: 假设有函数int add(int a, int b), __stdcall编译后的函数名为add@8

__cdecl

__cdecl的全称是C Declaration,即C语言默认的函数调用方式。

函数参数的入栈顺序为从右到左入栈。函数返回时作用ret指令。由调用者手动清栈。被调用的函数支持可变参数。调用者根据调用时传入参数的个数,手动平衡堆栈。

堆栈平衡方式 __cdecl手动清栈。

返回指令:__cdecl使用ret

编译后函数的修饰名: 假设有函数int add(int a, int b), __cdecl编译后的函数名为_foo。

__thiscall

thiscall是调用类内部成员函数时传递的参数 . 其本质是类对象的第一个成员变量的地址.

this指针一般使用寄存器ECX传递

参数的传递方式:函数参数的入栈顺序为从右到左入栈
堆栈平衡:调用者平衡堆栈(外平栈)
【__thiscall只能够用在类的成员函数上,如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入栈堆】
对参数个数不确定的,调用者清理堆栈,否则函数自己清理堆栈。

__fastcall

通过的ECX和EDX寄存器传参,其余参数从右向左入栈,由调用者清理堆栈。(很少见)

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员陈子青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值