본문 바로가기

Research/Reverse

C++ 뜯어보기 관련







되는대로 하나씩 정리.



1. 

C++ 가 이벤트 드리븐 방식으로 동작하기 때문에

이벤트 발생 시에 해당 이벤트에 연결된 이벤트 핸들러를 찾는 것이 중요한 포인트

아직까지는 핸들러 스택 프레임이 일반적이지 않은 케이스를 본 적은 없지만

push ebp 류로 시작하지 않는 핸들러도 있다고 하니

이런 방법론에 대해서도 잘 정리할 필요가 있겠다.


 

메시지 맵 struct 를 보면



struct AFX_MSGMAP_ENTRY

{

     UINT nMessage;   // 윈도우 메시지 WM_PAINT, WM_CREATE 등

     UINT nCode;      // control code or WM_NOTIFY code

     UINT nID;        // 메시지를 발생시킨 control ID (or 0 for windows messages)

     UINT nLastID;    // used for entries specifying a range of control id's

     UINT_PTR nSig;       // signature type (action) or pointer to message #

     AFX_PMSG pfn;    // routine to call (or special value)

};



핸들러 하나당 struct 하나씩. 맨 마지막 pfn 이 우리가 원하는 이벤트 핸들러 주소.

struct 의 nID 와 nLastID 를 검색하면 해당 struct 의 위치를 알 수 있고

핸들러 주소 또한 알 수 있음.


Resource Hacker 에서 Resource ID 값을 알 수 있다. 보통 버튼에다가 핸들러를 넣는데, CONTROL 행 BUTTON 앞의 인자가 ID. 

16 진수로 해당 값을 바꾸고, nID 와 nLastID 두 곳에 ID 가 들어가기 때문에 바이너리에서 해당 값으로 검색을 하면 된다.


예를 들어 ID 가 1000(0x3E8) 이라면,

메시지 맵이 .rdata 섹션에 있다는 것을 활용해서

해당 섹션에서 E8 03 00 00 E8 03 00 00 을 검색하면 되것지.


항상 헷갈리는 것이 올리/아이다에서 바이너리 서치인데,

rdata 영역 찾아가서 binary string 을 해야 찾아짐. 섹션 다르면 fail..

찾은 위치 + 0x8 위치에 포인터가 있겠다. 찾아가서 분석.



MFC 메시지 맵 자료는 아래에

http://hyacinth.byus.net/moniwiki/wiki.php/C++/MFC 메시지 맵에 대해