逆向工程核心原理0x05:函数调用约定 190608学习笔记

函数调用约定,是对函数调用时如何传递参数的一种约定。

理解中需要知道的两个关键问题

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

不用鸟他们
栈中的参数只是临时使用的,不用的时候不用鸟他们,
反正也不会在、影响你,当有需要存入新的参数时,自然会覆盖掉。

**Q2:**函数执行后,ESP值如何变化?

要恢复到调用前

ESP指向栈底,就无法使用该栈了。因此要及时复原。

这就是函数调用约定要解决的问题:

主要调用的函数:
cdecl
stdcall
fastcall

一些常见的表达:
调用者–调用函数的一方
被调用者–被调用的一方

cdecl:

调用者负责处理栈
举个例子:

一段c代码:
{这是自定义的函数段}
{
这是int main函数段
}

对于转化成汇编语言来说,
同样像上面那样分开了两段。

假设这是调用段A

调用段

假设这里是主函数段B:

主函数段

cdecl就是作用于B段
,当 假设push了n个字节入栈
,就必然会有一个add ESP,n
将其搞回原位,很好理解

STDCALL
这个就是作用于调用段,
当 假设push了n个字节入栈
,就必然会有一个add ESP,n
将其搞回原位,很好理解

fastcall
这个就跟前面的不一样了,
这个是用其他寄存器去干,不用栈内存,(就像科比名言:沙克也干了)
不过不推荐,
因为复杂函数中,其他寄存器也是有其他用途的。

你可能感兴趣的:(逆向工程核心原理学习笔记)