Security/Reversing

※함수호출규약

Winduck 2017. 3. 15. 00:00
반응형

●정의
함수 호출시 인자를 전달하는 방식과 스택프레임을 반환하는 방식을 약속해 놓은것이라고 한다.

호출규약은 x86/x64 서로 다른 규약을 사용합니다. x86은 __cdecl,__stdcall,__fastlcall,__thiscall 총 4개의 호출규약으로 구분되며
x64에서는 __fastcall을 사용하며 운영체제별 구분됩니다. 오늘은 위 호출규약별 특징을 정리하겠습니다.


●x86
__cdecl
-함수의 종료이후 스택을 Caller가 정리한다.(함수의 내부에서 정리하는것이 아닌 함수외부에서 스택을 정리한다.)
-호출규약을 입력하지 않으면 기본 cdecl을 사용한다.

__stdcall
-함수의 내부에서 스택을 정리한다.


__fastcall,__thiscall
-함수의 내부에서 스택을 정리한다.
-fastcall은 매개변수 2개 스택을 사용하지 않고 레지스터ecx,edx를 사용한다. __thiscall은 매개변수 1개를 ecx를 사용한다.
-레지스터를 사용하여 속도가 빠르다.


●64비트 운영체제별구분
호출규약이 64비트부터는 __fastlcall으로 통일되었다.


윈도우즈 경우, 매개변수 4개까지는 레지스터를 사용하여 빠르게 처리한다.추가적인 매개변수는 스택을 통하여 전달된다
리눅스와 BSD경우, 매개변수를 레지스터를 통해 최대 14개까지 처리한다.



오랜만에 글을 올려봅니다...ㅠㅠ 이노무 게으름!!! 다시 화팅!!


참고자료 : 윈도우즈 시스템 프로그래밍 (저자 : 윤성우)


반응형