Phantom

함수 호출 규약 본문

Reverse Engineering

함수 호출 규약

Ph4nt0m_ 2014. 2. 25. 13:29
반응형

오늘은 함수 호출 규약에 대해 알아보도록 하겠습니다.

함수 호출 규약이란 함수를 호출할 때 파라미터를 어떤식으로 전달하는지에 대한 일종의 약속입니다.


우린 이미 함수 호출전에 파라미터를 스택을 통해 전달한다는 것을 알고 있습니다. 스택이란 프로세스에서 정의된 메모리 공간이며 주소가 줄어드는 방향으로 자랍니다. 또한 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
Comments