본문 바로가기

RVS

호출 규약 (Call conventions) 간략 비교 (cdecl vs stdcall vs fastcall)

함수 호출은 어셈블리 코드에서 다르게 나타날 수 있다. 

이는 호출 규약이 함수 호출이 발생하는 방식을 결정하기 때문이다.

 

호출이 발생하는 방식이라 함은 아래와 같이 두 가지가 존재한다.

1. 함수의 파라메타를 스택 혹은 레지스터에 놓는 순서

2. 함수가 종료되면 스택을 정리하는 대상(호출자 또는 호출된 함수)

 

또한 컴파일러에 따라서 사용되는 호출 규약도 다르다.

컴파일러가 이러한 규약을 구현하는 방법에는 미묘한 차이가 있다.

그래서 다른 컴파일러에 의해 컴파일된 코드를 인터페이스하기가 어려울 수 있다.

 

하지만, Windows API 사용할 때에는 일정한 규약을 따라야하며, 호환성을 위해 균일하게 구현된다.

 

호출 규약은 주로 cdecl, stdcall 및 fastcall 세 가지가 사용된다.

 

cdecl

- 가장 많이 사용되는 호출규약 (call convention)

- 함수 호출 규약을 입력하지 않으면 _cdecl 호출이 기본값

- parameters를 오른쪽에서 왼쪽으로 스택에 push

- return 값은 EAX에 저장

- 함수 종료 되면 caller는 스택을 정리 (아래 그림의 강조된 부분)

 

stdcall

- cdecl과 비슷한 호출 규약

- parameters를 오른쪽에서 왼쪽으로 스택에 push

- Windows API에 대한 기본 호출 규약

- 함수가 완료되면 callee가 직접 스택을 정리 (따라서, 위 그림의 강조된 부분이 없음)

 

fastcall

- 컴파일러마다 호출 규약이 다르나 보통 비슷함

- 먼저, 인자들(보통 2개)을 각 EDX 및 ECX 레지스터에 놓고 나머지 인자들을 오른쪽에서 왼쪽으로 메모리에 로드함

- 필요시 호출 함수는 일반적으로 스택을 정리

- 코드를 스택에 많이 push 하지 않아도 되므로 다른 호출규약 보다 빠름

'RVS' 카테고리의 다른 글

Reversing.kr 10번 문제 (Twist1)  (0) 2020.03.30
Reversing.kr 13번 문제 (AutoHotkey1)  (0) 2020.03.20
Reversing.kr 11번 문제(Easy ELF)  (0) 2020.03.19
Reversing.kr 7번 문제 (Position)  (0) 2020.03.19
Reversing.kr 9번 문제(Ransomware)  (0) 2020.03.16