欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

9.逆向-函数调用约定

发布时间:2025/6/17 编程问答 10 豆豆
生活随笔 收集整理的这篇文章主要介绍了 9.逆向-函数调用约定 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

函数调用约定:是对函数调用时参数如何传递的一种约定。调用函数先把参数压入栈然后再传递给函数。栈就是定义在进程中的一段内存空间。向下(低地址方向)扩展。且其大小被记录在PE头中。也就是说,进程运行时确定占内存的大小。

 

函数执行完成后,栈中的参数如何处理? 不处理。

函数执行完毕后,ESP值如何变化? 恢复到调用之前。

调用约定分三种 cdecl/stdcall/fastcall

 

cdecl:调用者负责处理栈

VS2015 C++ 控制台程序 默认是cdecl

#include "stdafx.h"#include <iostream>#include <windows.h>#include <string>using namespace std;DWORD  Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {return dwNumberFirst + dwNumberSecond;}int main(){DWORD dwSum = Add(1 ,2);cout << dwSum << endl;getchar();return 0;}

ADD函数(被调用函数)

 

MAIN函数(调用函数)

 

 

Stdcall:被调用者负责处理栈

#include "stdafx.h"#include <iostream>#include <windows.h>#include <string>using namespace std;DWORD _stdcall Add(DWORD dwNumberFirst ,DWORD dwNumberSecond) {return dwNumberFirst + dwNumberSecond;}int main(){DWORD dwSum = Add(1 ,2);cout << dwSum << endl;getchar();return 0;}

ADD函数(被调用函数)

 


MAIN函数(调用函数)

 

虽然Win32API是使用C语言写的库,但它使用的是stdcall方式,而不是C语言默认的cdecl方式。这是为了获得更好的兼容性,使C语言之外的其他语言也能直接调用API。

Fastcall:与stdcall方式基本类似,但该方式通常是使用寄存器(非栈内存)去传递那些需要传递给函数的部分参数(前两个)。若某函数有4个参数,则前2个参数分别使用ECX、EDX寄存器传递。使用过程中注意ECX和EDX已经包含参数了。Fastcall的目的是为了加大执行速度用的。

总结

以上是生活随笔为你收集整理的9.逆向-函数调用约定的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。