본문 바로가기
리버스 코드 엔지니어링

[리버스 엔지니어링] 함수 호출 규약 정리

by 손정빈 2018. 11. 14.
728x90
반응형

함수 호출 규약이란?

- 함수를 호출하는 방식에 대한 약속을 의미합니다.

-  인자를 전달하는 방식과 함수 종료시 스택 공간을 정리하는 방법에 따라 달라집니다.



cdecl

- 인자 전달 순서 : 오른쪽에서 왼쪽

- 인자 전달 매체 : 스택

-  Stack Frame 정리 : Caller

호출한 main()에서 스택을 정리하는걸 확인 할 수 있습니다.

C/C++에서의 표준 함수 호출규약으로, Caller가 인자를 정리하는 규약이며 가변인자를 사용할 수 있습니다.

(printf와 같이 긴 인자를 사용할 수 있습니다.)



stdcall

- 인자 전달 순서 : 오른쪽에서 왼쪽

- 인자 전달 매체 : 스택

-  Stack Frame 정리 : Callee

호출당한 add()에서 스택을 정리하는걸 확인 할 수 있습니다.

return 8을 통해 int형 자료형 2개의 크기를 반환한다.

인자에 대한 크기를 반환하는 부분이 고정 되어 있기에 가변적은 인자에 대해서 사용이 불가능하다.

Win32 Api, Visual Basic에서 사용하는 표준 함수 호출 규약으로, 코드가 간결하나 가변인자를 사용할 수 없습니다.



fastcall

- 인자 전달 순서 : ECX, EDX에 저장 후 나머지 인자는 오른쪽에서 왼쪽

 보통 2개의 인자만 사용합니다.

- 인자 전달 매체 : ECX, EDX, 3개이상부터는 Stack

-  Stack Frame 정리 : Callee

Delphi 개발 툴의 기본 규약으로, 인자 전달에 레지스터를 사용하므로, 속도가 빠른 장점이 있습니다.

반응형

댓글