Calling Conventions(콜링 컨벤션)
콜링 컨벤션이란 내부 및 외부 함수를 호출하기 위한 규칙이다. 디버깅 할 때나 어셈블리어 코드를 링크 할 때 어떠한 방식으로 접근하는지에 대해서 알려준다.
콜링 컨벤션의 종류는 __cdecl __clrcall __stdcall __fastcall __thiscall __vectorcall 이렇게 6가지가 있다. 하지만 자주 보는 __cdecl, __stdcall, __fastcall 이렇게 3가지만 정리하겠다.
1. __cdecl
Element | Implementation |
---|---|
Argument-passing order 인자 전달 순서 | Right to left. 오른쪽에서 왼쪽으로 스택을 불러온다. |
Stack-maintenance responsibility 스택 정리 | Calling function pops the arguments from the stack. 인자를 스택에서 꺼내온다. |
Name-decoration convention 선언 | Underscore character (_) is prefixed to names, except when __cdecl functions that use C linkage are exported. 함수 이름에 _ 문자를 추가하여 사용한다. __cdecl는 제외 |
Case-translation convention 대 소문자 변환 | No case translation performed. 대소문자 변환 없음 |
<출처 : MSDN>
2. __stdcall
Element | Implementation |
---|---|
Argument-passing order 인자 전달 순서 | Right to left. 오른쪽에서 왼쪽으로 스택을 불러온다. |
Argument-passing convention 인자 패스 규칙 | By value, unless a pointer or reference type is passed. 변수나 선언되지 않는 타입은 패스한다. |
Stack-maintenance responsibility 스택 정리 | Called function pops its own arguments from the stack. 인자를 스택에서 꺼내온다. |
Name-decoration convention 선언 | An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12 함수 이름에 _ 문자를 추가하여 사용한다. 이름 뒤에 @ 가 붙고 그 뒤에 인자 목록의 바이트 수가 10진수로 로 이어진다. 따라서 int func( int a, double b) 는 _func@12 와 같이 선언 된다. |
Case-translation convention 대 소문자 변환 | None 없음 |
<출처 : MSDN>
3. __fastcall
Element | Implementation |
---|---|
Argument-passing order 인자 전달 순서 | The first two DWORD or smaller arguments that are found in the argument list from left to right are passed in ECX and EDX registers; all other arguments are passed on the stack from right to left 처음 두 DWORD 또는 더 작은 크기의 인자는 ECX와 EDX 레지스터로 전달하며, 나머지 인자는 오른쪽에서 왼쪽으로 스택을 불러온다. |
Stack-maintenance responsibility 스택 정리 | Called function pops the arguments from the stack. 인자를 스택에서 꺼내온다. |
Name-decoration convention 선언 | At sign (@) is prefixed to names; an at sign followed by the number of bytes (in decimal) in the parameter list is suffixed to names. 이름 앞에 @ 가 붙고 이름 뒤에도 @ 붙는다.그 뒤에 인자 목록의 바이트수가 10진수로 이어진다. |
Case-translation convention 대 소문자 변환 | No case translation performed. 대 소문자 변환 없음 |
<출처 : MSDN>
'My Study > System' 카테고리의 다른 글
DLL Injection (1) - 간단 기본 개념 (0) | 2016.05.23 |
---|---|
Memory : stack(스택) (0) | 2015.06.26 |
레지스터 (0) | 2015.05.13 |
Handray (0) | 2015.03.25 |
Stack Corruption (0) | 2015.03.18 |