当前位置: 首页 > news >正文

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

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

相关文章:

  • Python logging 库全面指南
  • Skibidus and Fanum Tax (easy version)----Skibidus 和 Fanum 税(简易版)
  • 第四届图像、信号处理与模式识别国际学术会议(ISPP 2025)
  • 利用acme.sh 申请 Google 免费证书
  • 人车检测与计数系统(python+课程设计报告+源代码+数据集)
  • LeetCode 98.验证二叉搜索树
  • vscode远程报错:Remote host key has changed,...
  • 软件安全测试技术系列|跨站脚本攻击(Cross Sites Script)类漏洞攻击方式与防御措施
  • Opencv项目实战:26 信用卡号码识别与类型判定
  • 自动化办公|通过xlwings进行excel格式设置
  • 防火墙综合实验
  • ✨1.HTML、CSS 和 JavaScript 是什么?
  • 深度学习笔记——LSTM
  • 自动化测试框架搭建-单次接口执行-三部曲
  • 深入理解 fnmatch 函数的实现
  • 04 redis数据类型
  • 《DeepSeek赋能工业互联网:解锁数据深度分析新姿势》
  • python常用库整理
  • 【实用技巧】云服务器+FRP搭建自己的远程控制向日葵
  • 最简单的难题——游戏英雄升级潜力评估
  • 五粮液董事长:茅台1935已脱离千元价位带,五粮液在千元价位已逐步摆脱其他竞品纠缠
  • 保利42.41亿元竞得上海杨浦东外滩一地块,成交楼面单价超8万元
  • 国家税务总局泰安市税务局:山东泰山啤酒公司欠税超536万元
  • 见微知沪|优化营商环境,上海为何要当“细节控”自我加压?
  • 第1现场 | 印巴冲突:印50多年来首次举行大规模民防演习
  • “20后”比“60后”更容易遭遇极端气候事件