https://ko.wikipedia.org/wiki/X86_%ED%98%B8%EC%B6%9C_%EA%B7%9C%EC%95%BD
https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions
Calling Conventions 정리
매개변수 스택 순서: 오른쪽->왼쪽
cdecl: caller가 스택정리
stdcall: winAPI, callee가 스택정리
thiscall: ecx에 this포인터 저장 (주의할 점은 컴파일러마다 this 포인터를 어떤 레지스터에 담을지가 다르다.)
매개변수 저장 순서: rcx,rdx,r8,r9,스택 (MS x64)
fastcall: 64비트 아키텍쳐, callee가 스택정리
매개변수 저장 순서: RDI, RSI, RDX, RCX, R8, R9, XMM0–7 (System-V, AMD64)
fastcall: 64비트 아키텍쳐, callee가 스택정리
C++ Calling Convention
THISCALL
thiscall: ecx에 this포인터 저장 (주의할 점은 컴파일러마다 this 포인터를 어떤 레지스터에 담을지가 다르다.)
Name-Mangling
예제: 소스코드
C++ Name Mangling
class MyClass {
MyFunction(int a) { }
};
맹글링된 이름
?MyFunction@MyClass@@QAEHH@Z
함수 오버로딩로 인한 복잡성 때문에 C++ 함수는 거칠게 네임-데코레이트 됩니다.
사람들은 흔히 그 과정을 '네임맹글링'이라고 부릅니다.
불행히도 C++ 컴파일러들은 이 표준이 규칙을 강제당하지 않기 때문에 자유롭게 네임맹글링을 할 수 있습니다.
또한 예외 처리와 같은 다른 문제도 표준화되지 않습니다.
모든 컴파일러가 네임맹글링을 다르게 하기 때문에, 이 책은 알고리즘의 구체적 내용에 대해 토론하는 데 많은 시간을 소비하지 않을 것입니다.
대부분의 경우 네임맹글링 형식의 세부 사항을 검토하여 실행 파일을 만든 컴파일러를 확인할 수 있습니다.
그러나 이 책에서는 이 주제에 대해 이렇게 깊이 있게 다루지 않을 것입니다.
다음은 THISCOLL 네임맹글링 함수에 대한 몇 가지 일반적인 설명입니다.
- CDECL, FASTCOLL 및 STDCALL 함수 이름 장식에 비해 복잡하기 때문에 시각적으로 알아볼 수 있습니다.
- 때때로 해당 함수의 클래스 이름을 포함합니다.
- 거의 항상 매개변수의 수와 타입이 포함되어 있으므로, 오버로드된 함수는 그것에 전달되는 인수에 의해 구별될 수 있습니다.
Extern "C"
C++ 소스 파일에서 Extern "C" 블록에 배치된 함수가 맹글되지 않도록 보장됩니다.
이 작업은 라이브러리를 C++로 작성할 때 자주 수행되며, 함수들은 맹글없이 export해야합니다.
프로그램이 C++로 작성되고 C++ 컴파일러로 컴파일되더라도, 함수의 일부가 맹글되지 않으며 일반적인 C호출 규약(일반적으로 CDECL) 중 하나를 사용합니다.
Note on Name Decorations
우리는 이 장에서 네임 데코레이션에 대해 논의해왔지만, 사실 순수한 디스어셈블된 코드에는 일반적으로 이름이 없습니다. 특히 멋진 데코레이션을 가진 이름은 없습니다. 어셈블리 단계는 이러한 읽기 가능한 식별자를 모두 제거하고 대신 바이너리 위치로 바꿉니다.
함수 이름은 실제로 다음 두 위치에만 표시됩니다:
- Listing files produced during compilation (컴파일 중에 생성된 파일 리스팅)
- In export tables, if functions are exported (함수가 익스포트된 경우 익스포트 테이블)
raw 머신코드를 디스어셈블할 때 함수 이름과 검사할 데코레이션이이 없습니다.
따라서 매개 변수 전달 방법, 스택 정리 방법 및 기타 유사한 세부 정보에 더욱 주의를 기울여야 합니다.
아직 최적화에 대해서는 다루지 않았지만 컴파일러 최적화는 이러한 세부 사항을 엉망으로 만들 수도 있습니다.
export되지 않은 함수는 반드시 표준 인터페이스를 유지할 필요가 없으며, 특정 함수가 표준 규약을 준수할 필요가 없다고 판단될 경우, 일부 세부 사항은 최적화됩니다. 이러한 경우 어떤 호출 규칙이 사용되었는지(if any) 확인하기가 어려울 수 있으며, 심지어 함수의 시작과 종료 위치를 결정하기도 어렵습니다.
이 책은 모든 가능성을 설명할 수 없기 때문에, 가능한 많은 정보를 보여주려고 노력합니다.
여기 제공된 많은 정보의 지식들이 진정한 디스어셈블리 상황에서 이용될 수 없게 될 것이다.
Futher Reading
- x86 Disassembly/Calling Convention Examples
- Embedded Systems/Mixed C and Assembly Programming describes calling conventions on other CPUs.
'Windows' 카테고리의 다른 글
RVA + 이미지 베이스 = 섹션이 로드될 가상 주소 (0) | 2020.06.24 |
---|---|
64비트 알아두어야할 점 (0) | 2020.01.15 |