函数
函数的重点是识别调用约定、参数类型和返回值类型
调用约定:
- cdecl
- 调用方平栈
- stdcall
- 被调用方平栈
- fastcall
- 被调用方平栈
- edx, ecx 寄存器传第1、第2个参数
- thiscall
- 参数个数确定:
- this指针通过ecx传递
- 被调用方平栈
- 参数个数不确定:
- this指针最后一个入栈
- 调用方平栈
- 参数个数确定:
参数个数
通过调用前的push来判断参数个数不一定正确,实际要看函数内部用了多少个参数,如果一个参数都没有用则当作无参函数还原
stdcall也可通过观察ret指令后的平栈大小来判断参数个数
fastcall外面给寄存器赋值、内部未经赋值直接使用
参数类型
根据使用方式来判断
返回值类型
- __int64
- 返回值在edx.eax中
- double, float返回值在st0