Windows逆向工程入门之调用约定

目录

调用约定

调用约定

约定规则

cdecl

stdcall

fastcall

thiscall


调用约定

  • 调用约定

    • 调用约定(Calling Convention):确定了函数调用时参数传递、返回值处理以及寄存器使用的规则。

    • 堆栈(Stack):用于存储函数的参数、返回地址和局部变量。

  • 约定规则

    • cdecl
      • 参数从右到左压入堆栈。

      • 调用者负责清理堆栈。

      • #include <iostream>
        
        void _cdecl Fun1(int a, int b, int c, int d)
        {
        	
        }
        
        int main()
        {
        	// PUSH 4
        	// PUSH 3
        	// PUSH 2
        	// PUSH 1
        	// CALL FUN1
        	// ADD  ESP, 0X10
        	Fun1(1, 2, 3, 4);
        
        	return 0;
        }
    • stdcall
      • 参数从右到左压入堆栈。

      • 被调用者负责清理堆栈。

      • #include <iostream>
        
        void _stdcall Fun1(int a, int b, int c, int d)
        {
        	// ADD  ESP, 0X10
        	// RET  0X10
        }
        
        int main()
        {
        	// PUSH 4
        	// PUSH 3
        	// PUSH 2
        	// PUSH 1
        	// CALL FUN1
        	Fun1(1, 2, 3, 4);
        
        	return 0;
        }
    • fastcall
      • 前两个参数通过ECX和EDX寄存器传递,剩余参数从右到左入栈。

      • 被调用者负责清理堆栈。

      • #include <iostream>
        
        void _fastcall Fun1(int a, int b, int c, int d)
        {
        
        	//mov         dword ptr[ebp - 14h], edx
        	//mov         dword ptr[ebp - 8], ecx
        	
        	//mov         dword ptr[ebp - 8], 10h
        	//mov         dword ptr[ebp - 14h], 11h
        	//mov         dword ptr[ebp + 8], 12h
        	//mov         dword ptr[ebp + 0Ch], 13h
        
        	a = 16;
        	b = 17;
        	c = 18;
        	d = 19;
        
        	// RET  0X10
        }
        
        int main()
        {
        	// PUSH        4  
        	// PUSH        3  
        	// MOV         edx,2 
        	// MOV         ecx,1 
        	// CALL FUN1
        	Fun1(1, 2, 3, 4);
        
        	return 0;
        }
    • thiscall
      • 常用于C++成员函数。

      • this指针通过ECX寄存器传递。

      • 其余参数从右到左入栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值