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

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

调用约定

调用约定

约定规则

cdecl

stdcall

fastcall

thiscall


调用约定

  • 调用约定

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

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

  • 约定规则

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

      • 调用者负责清理堆栈。

      • #include 
        
        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 
        
        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 
        
        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寄存器传递。

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

你可能感兴趣的:(windows,汇编,开发语言,逆向,安全)