- Today
- Total
Phantom
함수 호출 규약 본문
오늘은 함수 호출 규약에 대해 알아보도록 하겠습니다.
함수 호출 규약이란 함수를 호출할 때 파라미터를 어떤식으로 전달하는지에 대한 일종의 약속입니다.
우린 이미 함수 호출전에 파라미터를 스택을 통해 전달한다는 것을 알고 있습니다. 스택이란 프로세스에서 정의된 메모리 공간이며 주소가 줄어드는 방향으로 자랍니다. 또한 PE헤더에 그 큭가 명시되어 있습니다. 즉, 프로세스가 실행될 때 스택 메모리의 크기가 결정됩니다.
애플리케이션 디버깅에서는 cdecl과 stdcall의 차이점을 확실히 알아야 합니다.
1. cdecl - 주로 C언어에서 사용되는 방식이며 Caller(함수를 호출한 쪽)에서 스택을 정리하는 것이 특징입니다.
ex)C언어에서 사용자가 만든 함수가 종료 된 후에, main함수가 메모리를 정리해줍니다.
2.stdcall - 주로 Win32 API에서 사용되며, Callee(호출을 당한 함수)에서 스택을 정리하는 것이 특징입니다.
C언어에서 stdcall방식으로 컴파일 하고싶을 때는 _stdcall 키워드를 붙여주면 됩니다.
그러면 사용자가 만든 함수에서 리턴시에(RETN 8) 메모리를 정리하고 리턴하는데 RETN 8에는 ADD ESP,8이 생략되어 있습니다.
3.fastcall - 기본적으로 stdcall과 같지만 함수에 전달하는 파라미터를 2개까지만 스택메모리가 아닌 레지스터를 이용하여 전달한다는 것이 특징입니다.
장점은 좀 더 빠른 함수 호출이 가능합니다. 그러나 레지스터를 관리하는 추가적인 오버헤드가 필요한경우도 있습니다.
'Reverse Engineering' 카테고리의 다른 글
간단한 C언어 패턴 분석 (0) | 2018.01.17 |
---|---|
Standard I/O Redirection (0) | 2014.02.25 |
IA-32 Register (0) | 2014.02.21 |