최신목록

2015년 11월 19일 목요일

[windbg]함수의 파라미터와 클래스 인스턴스 전달방식

클래스 멤버함수에서 멤버함수 호출시 필요한 데이타는 클래스 instance와 전달되는 파라미터이다.

1. 32bit 프로그램

32bit 프로그램에서는 파라미터를 전달할때 스택을 사용한다. 아래의 그림은 B함수가 A함수를 호출하고 prologue 마치고 난후의 스택의 모습과 prologue 전 함수에 바로 진입했을때의 스택의 모습을 보여주고 있다.

prologue 작업은 해당함수에 맞게 EBP와 ESP를 스택에 다시 셋팅하는 작업으로 보통은 windbg에서 breakpoint를 찍어서 걸리면 prologue 작업전이기때문에 스택을 쳐다보면 return address가 있고 그 아래에 파라미터들을 볼 수 있다. assembly 코드를 보고 있으면 ebp+8, ebp+c, ebp+10 에 있는 데이터를 이용하는것을 볼수 있는데 이것은 전달된 파라미터를 이용하고 있는 모습니다. 32bit 에서는 ebp가 중요한 기준이 되고 있음을 볼 수 있다.

클래스에서는 이와 같으나 추가로 클래스 instance를 전달해주어야 하는데 이는 스택을 통하지 않고 ECX 레지스터를 통해 전달된다. 그러나 가끔 Windows 시스템 내부 함수를 추적하다보면 32bit OS에서는 ECX에 instance값이 없고 스택으로 전달할 때도 있다. 그러면 parameter1이 있을 자리에 instance값이 존재한다. 32bit OS에서는 __thiscall 이라는 호출규약 지정시 ecx를 통해 클래스 포인터(인스턴스)를 전달한다.

2. 64bit 프로그램

64bit 프로그램에서는 파라미터를 전달할때 레지스터를 사용한다.
사용되는 레지스터는 아래와 같다.

RCX : CLASS instance
RDX : parameter1
R8 : parameter2
R9 : parameter3

그래서 64bit 프로그램에서는 prologue 작업에 파라미터로 전달된 데이터를 스택에 저장하는 작업이 추가된다.
rdx는 전달된 iValue이고 rcx는 이클래스의 instance 값이고 각각 rsp+8과 rsp+10에 저장되고 있음을 볼 수 있다. 그래서 64bit에서는 rbp보다 rsp가 더 중요한 기준이 되고 있음을 볼 수 있다.

댓글 없음:

댓글 쓰기