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寄存器传递。
-
其余参数从右到左入栈。
-
-