c语言类型定义 函数指针变量赋值,C语言22 调用约定和函数指针

C语言22 调用约定和函数指针

函数调用约定

就是告诉编译器:怎么传递参数,怎么传递返回值,怎么平衡堆栈

int method(int x,int y)

{

return x+y;

}

//调用

method(1,2);

常见的几种调用约定:

调用约定

参数压栈顺序

平衡堆栈

__cdecl

从右至左入栈

调用者清理栈

__stdcall

从右至左入栈

自身清理堆栈

__fastcall

ECX/EDX 传送前两个,剩下:从右至左入栈

自身清理堆栈

int __stdcall method(int x,int y)

{

return x+y;

}

//调用

method(1,2);

//观察反汇编堆栈变化

PS:一般情况下自带库默认使用 __stdcall 我们写的代码默认使用 __cdecl

函数指针类型变量的定义

函数指针变量定义的格式:

返回类型(调用约定 *变量名)(参数列表):

int (__cdecl *pFun)(int,int);

函数指针类型变量的赋值与使用

//定义函数指针变量

int (__cdecl *pFun)(int,int);

//为函数指针变量赋值

pFun =(int (__cdecl *)(int,int))10;

//使用函数指针变量

int r=pFun(1,2);

9: //定义函数指针变量

10: int (__cdecl *pFun)(int,int);

11: //为函数指针变量赋值

12: pFun =(int (__cdecl *)(int,int))10;

00401028 mov dword ptr [ebp-4],0Ah

13:

14: //使用函数指针变量

15: int r=pFun(1,2);

0040102F mov esi,esp

00401031 push 2

00401033 push 1

00401035 call dword ptr [ebp-4]

00401038 add esp,8

通过函数指针绕过调试器断点

函数指针变量的定义

int (__stdcall *pFun)(int,int,int,int,int);

正常调用

MessageBox(0,0,0,0;

通过函数指针 绕过断点

pFun = (int (__stdcall *pFun)(int,int,int,int,int))0x77D5055c;

pFun(0,0,0,0,0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值