当前位置: 首页 > 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寄存器传递。

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

http://www.dtcms.com/a/24282.html

相关文章:

  • 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搭建自己的远程控制向日葵
  • 最简单的难题——游戏英雄升级潜力评估
  • Flutter 跳转后不允许返回
  • 习题系列——数值分析与数值计算
  • el-table树状表格,默认展开第一个节点的每一层
  • 基因研究的“北极盲区”
  • 浏览器开发者工具(F12)查看请求的响应体内容显示”无法加载响应数据: No resource with given identifier found“
  • Linux网络 | 多路转接Reactor
  • HTB—OnlyHacks
  • 利用大模型deepseek搭建本地知识库并且实现 java 调用
  • DRF框架中viewsets.ModelViewSet、APIView区别与联系
  • 八大元素定位