기본 콘텐츠로 건너뛰기

C++/MFC

클래스는 오프셋을 기반으로 멤버함수를 호출한다.
클래스를 동적으로 생성하는 경우 크기만큼 스택을 움직이는 것이 아니라, 동적 메모리함수를 불러 결과값을 받아와 저장해서 사용한다.

클래스의 멤버함수는 컴파일시에 주소가 결정되기 때문에 함수를 부르는 형태를 보면 객체의 주소값을 받아와 바로 콜하는 형태를 갖는다.

가상함수가 있는 경우 객체의 가장 앞에 Vtable 포인터가 생성된다.

C++에서 멤버함수를 호출할 때는, 객체의 포인터인 this 변수가 따라간다. 매번 this가 넘어가기 때문에 묵시적이고, 스택이아니라 레지스터를 통해 넘어간다. IDA에서 __this 가 그 의미이다. gcc 컴파일러의 경우 this가 스택으로 넘어간다.

생성자와 소멸자는 선택 가능한 함수이다. 클래스 생성시 가장 먼저 호출된다.

동적으로 생성될때 동적 메모리 할당의 결과값이 유효하면 생성자 호출, 틀리면 0을 삽입한다. 이 때문에 IDA에서 코드블럭을 보면 좌우로 갈라졌다가 다시 합쳐지는 형태를 갖는다. 소멸자도 마찬가지이다.

Vtable은 .rdata 에 저장된다.

댓글

이 블로그의 인기 게시물

맥스 어만(Max Ehrmann) - 소망(진정 바라는 것)

진정 바라는 것                                                                       -맥스 어만 소란스럽고 바쁜 일상속에서도  침묵 안에 평화가 있다는 사실을 기억하십시오 포기하지 말고 가능한한 모든 사람들과 잘 지내도록 하십시오 조용하면서도 분명하게 진실을 말하고  어리석고 무지한 사람들의 말에도 귀를 기울이십시오  그들 역시 할 이야기가 있을테니까요  목소리가 크고 공격적인 사람들은 피하십시오  그들은 영혼을 괴롭힙니다 자신을 다른 사람들과 비교하면 자신이 하찮아 보이고  비참한 마음이 들수도 있습니다  더 위대하거나 더 못한 사람들은 언제나...