상세 컨텐츠

본문 제목

Reverse Core 10장

Computer Science/Reverse Core

by RACC8N 2020. 1. 15. 18:54

본문

Calling Convention (함수 호출 규약)

 

'함수를 호출할 때 파라미터를 어떤 식으로 전달하는가?'에 대한 일종의 약속

 

프로세스가 실행될 때 스택 메모리의 크기가 결정됨.(malloc/new 같은 동적 메모리 할당과는 다름)

 

Q1. 함수가 실행 완료되었을 때 스택에 들어있던 파라미터는 어떻게 해야 될까?

A1. 그대로 놔둔다.

 

스택에 저장된 값은 임시로 사용하는 값이기 때문에 더 이상 사용하지 않는다 해도 값을 지우거나 하면 불필요하게 CPU자원을 소모함.

 

Q2. 함수가 실행 완료되었을 때 ESP는 어떻게 될까?

A2. ESP 값은 함수 호출 전으로 복원되어야 한다. 그래야 참조 가능한 스택의 크기가 줄어들지 않는다.

 

스택 메모리는 고정되어 있고 ESP로 스택의 현재 위치를 가리키는데, 만약 ESP가 스택의 끝을 가리킨다면 더 이상 스택을 사용할 수 없다.

 

함수 호출 후에 ESP를 어떻게 정리하는지에 대한 약속이 바로 함수 호출 규약이다.

 

cdecl

stdcall

fastcall

 

Caller(호출자) - 함수를 호출한 쪽

Callee(피호출자) - 호출을 당한 함수

ex) Main()함수에서 printf()함수를 호출 했다면, Caller=Main, Callee=printf

 

1. cdecl

cdecl 방식은 주로 C언어에서 사용되는 방식.

Caller에서 스택을 정리함.

CALL 401000한 후에, Caller에서 ADD ESP,8명령으로 스택을 정리한다.

 

이와 같이 Caller인 Main()함수가 자신이 스택에 입력한 함수 파라미터를 직접 정리하는 방식이 cdecl이다.

 

cdecl 방식의 장점 : printf함수와 같이 가변 길이 파라미터를 전달할 수 있다는 점.

 

2. stdcall

stdcall 방식은 Win32API에서 사용되는 방식

Callee에서 스택을 정리함.

401000함수의 마지막 (40100A)의 RETN 8 명령으로 스택을 정리한다. (RETN 8 = RETN + POP 8)

 

이와같이 Callee인 401000함수 내부에서 스택을 정리하는 방식이 stdcall이다.

 

stdcall 방식의 장점 : 호출되는 함수(Callee) 내부에 스택 정리 코드가 존재하므로 cdecl보다 코드 크기가 작아짐.

 

3. fastcall

기본적으로 stdcall 방식과 같지만, 함수에 전달하는 파라미터 일부(2개까지)를 스택 메모리가 아닌 레지스터를 이용하여 전달한다.

ex) 어떤 함수의 파라미터가 4개라면, 앞의 두 개의 파라미터는 각각 ECX, EDX 파라미터를 이용하여 전달함.

 

fastcall의 장점 : 좀 더 빠른 함수 호출이 가능함. 

fastcall의 단점 : 함수 호출자체는 빠르지만, ECX, EDX 레지스터를 관리하는 추가적인 오버헤드가 필요한 경우가 있다. 

 

'Computer Science > Reverse Core' 카테고리의 다른 글

Reverse Core 13장 (★★★★★)  (0) 2020.01.22
Reverse Core 7장  (0) 2020.01.15
Reverse Core 5장  (0) 2020.01.14
Reverse Core 4장  (0) 2020.01.14
Reverse Core 3장  (0) 2020.01.14

관련글 더보기

댓글 영역