일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 깃허브
- 자바스크립트
- oracle
- python
- 자바스크립트 element api
- javascript
- ES6
- 랜섬웨어
- 다크웹
- 자바스크립트 기본 문법
- 파이썬
- oracle db
- 오라클
- 카카오프로젝트100
- 보안뉴스
- 카카오프로젝트
- 자바스크립트 jQuery
- numpy
- Oracle SQL
- 자바스크립트 prototype
- 자바스크립트 API
- 보안뉴스 요약
- 보안뉴스요약
- GIT
- 자바스크립트 객체
- 보안뉴스 한줄요약
- 자바스크립트 node
- php
- 카카오프로젝트 100
- 보안뉴스한줄요약
- Today
- Total
FU11M00N
함수 호출 규약 (feat stdcall,fastcall) 본문
- 함수 호출 규약?
함수 호출 규약 (Calling Convention) 함수(subroutine, callee)가 어떻게 인자를 전달받고 결괏값을 반환하는지에 대한 로우 레벨에서의 규칙입니다.
- Callee? Caller?
Caller(호출자) - 함수를 호출한 쪽.
Callee(피호출자) - 호출을 당한 함수.
ex) main()에서 printf()를 호출했다면 Caller는 main(), Callee는 printf().
c언어에서는 기본적으로 명시를 안 하면 cdecl 함수 호출 규약을 사용합니다.
이번 글에선 stdcall 과 fastcall을 자세히 알아보겠습니다.
- stdcall
stdcall은 가변인자 ex) printf를 지원하지 않습니다.
stdcall은 Callee 에서 스택을 정리하기 때문에 Callee 쪽에서는 가변 인자의 스택 크기를 알 수 없습니다.
stdcall은 Win32 API 함수에서 자주 사용 되는 호출 규약입니다.
또한 DLL파일을 만들때에도 STDCALL로 선언하여 다른 언어에서 API를 호출할 때 호환성을 위함입니다.
c언어에서는 stdcall을 사용할려면 함수 앞에 명시해줘야 합니다.
인자 전달 순서 |
오른쪽 인자부터 전달한다. |
인자 전달 매체 |
Stack을 사용합니다. |
Stack Frame 정리 방법 |
호출을 당한 Callee가 함수를 종료하면서 인자를 정리합니다. |
- fastcall
인자 전달에 레지스터를 사용하므로, 속도가 빠른 장점이 있다.
주로 2개의 인자를 사용하며, 인자가 3개 이상이면 Stack을 함께 사용해 인자를 전달합니다.
즉 함수에 전달하는 파라미터 일부(2개까지) 스택 메모리가 아닌 레지스터를 이용하여 전달합니다.
인자 전달 순서 |
오른쪽 인자부터 전달한다. |
인자 전달 매체 |
ECX, EDX, Stack 순서로 사용한다. 보통은 2개의 인자만 사용한다. |
Stack Frame 정리 방법 |
호출을 당한 Callee가 함수를 종료하면서 인자를 정리한다. |
주의. 아래의 코드들은 3개의 인자입니다.
함수 호출 규약을 한 장으로 요약하자면 위의 사진과 같습니다.
ref:
https://tyeolrik.github.io/reversing/2017/03/06/Reversing-9-Calling-Convention.html