함수호출규약(Calling Convention)
함수호출규약이란 함수를 호출하기 위한 규칙이며, 인자를 넘겨주는 방식과 함수 종료 시 스택 공간을 정리하는 방법에 따라 분류한다.
위 그림은 함수의 호출과정에 대한 내용입니다.
여기서 함수호출규약을 결정하는 방법은 인자를 넘겨주는 방식과 스택 정리를 누가 하는가에
따라 달라진다.
Stdcall(Standard Call)
• Windows API Default Call
• 스택 정리를 콜리가 한다.
• 인자 전달순서는 오른쪽부터 왼쪽으로 전달한다.
위 그림은 메시지 박스를 출력하는 프로그램이다.
먼저 Call하는 부분의 위에 인자가 4개가 들어 간다는 것을 알 수 있다.
Stdcall은 불려지는 함수가 스택을 정리한다고 하니 함수의 안을 들여다 보겠습니다.
함수의 마지막을 보게 되면 4개의 인자만큼의 공간을 정리합니다.
Cdecl
• C/C++ Default Call
• 스택 정리를 콜러가 한다.
• 인자 전달순서는 오른쪽부터 왼쪽으로 전달한다.
함수가 끝난 후를 보면 함수의 인자가 3개였으며 그 공간을 콜러가 정리를 한다.
Fastcall
• 메모리를 참고하지 않고 ECX와 EDX레지스터를 이용해서 인자를 전달한다.
(3개 이상의 인자 전달 시에는 스택을 이용한다.)
• 스택 정리를 콜리가 한다.
• 인자 전달순서는 오른쪽부터 왼쪽으로 전달한다.
'Reversing' 카테고리의 다른 글
리버싱 기초 지식 : 어셈블리어(Assembly) (0) | 2015.01.27 |
---|---|
리버싱 기초 지식 : 레지스터(Register) (0) | 2015.01.27 |
리버싱(Reversing) 이란?? (0) | 2015.01.27 |