본문 바로가기

SYSTEM

함수 호출 규약 (Calling Convention)

728x90
반응형

▶함수 호출 규약 (Calling Convention)

: 함수를 호출하는 방식에 대한 약속

 

규약
인자 전달 순서
인자 전달 매체
Stack을 정리하는 함수
Cdecl
Stack
Caller
Stdcall
Stack
Callee
Fastcall
레지스터 + Stack
Callee

+ clrcall, thiscall, pascal, 등의 규약 존재

+ Caller / Callee란?

Caller – 콜러가 저장하는 레지스터, 값이 보존되지 않아도 되는 경우는 백업하지 않을 수 있음

Callee – 콜리가 저장하는 레지스터 , 콜러가 백업을 필요로하는 레지스터가 무엇인지 모르기에 무조건 백업해야함


# __CDECL 방식

  • C / C++ 함수에서 기본적으로 사용되는 호출 규약
  • 호출자가 스택을 정리
  • 인자 순서 ← (오른쪽에서 왼쪽)
  • 호출자가 피호출자를 호출시에 전달되는 인자의 개수를 알고 있음 – 가변 인수 함수를 만들 수 있음

+ 가변인수함수 : 인수의 개수와 타입이 미리 정해져 있지 않음. 그런 인수를 사용하는 함수

인자 전달 매체 – Stack을 사용

Stack Frame 정리 방법 – 함수가 호출한 Caller가 인자를 정리함

이름 수식 컨벤션 – 이름 앞에 _가 붙음 (_함수명)


 

# __Stdcall 방식

  • Window API, Visual Basic에서 사용되는 표준 규약,
  • 피호출자가 스택을 정리
  • 인자 순서 ← (오른쪽에서 왼쪽)
  • 호출을 당한 Callee가 함수를 종료하면서 인자를 정리함, 코드가 간결하지만 가변인자 사용 X

Stack Frame 정리 방법 – 호출을 당한 Callee가 함수를 종료하면서 인자를 정리함

이름 수식 컨벤션 - 이름 앞에 _가 붙음 (_함수명) 함수명 뒤에 인자 리스트의 바이트 크기를 @와 함께 표기함

(_함수명@인자리스트크기)

 


# __Fastcall 방식

  • Delphi 개발 툴의 기본 규약
  • 인자 전달에 레지스터를 사용하므로 속도가 빠름
  • 피호출자가 스택에서 인수들을 정리
  • 인자 순서 ← (오른쪽에서 왼쪽)

Stack Frame 정리 방법 – 호출을 당한 Callee가 함수를 종료하면서 인자를 정리함. 

이름 수식 컨벤션 - 이름 앞에 @가 붙음 (@함수명) 함수명 뒤에 인자 리스트의 바이트 크기를 @와 함께 표기함

(_함수명@인자리스트크기)

728x90
반응형

'SYSTEM' 카테고리의 다른 글

쉘코드를 널(\x00) 없이 제작 / getuid setreuid 추가  (0) 2023.01.05
리틀엔디안, 빅엔디안  (0) 2023.01.05
파일 디스크립터, 실습  (0) 2023.01.05
패킹, 언패킹  (0) 2023.01.05
안디디버깅 종류  (1) 2023.01.05