되는대로 하나씩 정리.
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 메시지 맵에 대해
'Research > Reverse' 카테고리의 다른 글
About overflow flag (0) | 2016.02.16 |
---|---|
intager <-> string 변환과 속도 (0) | 2015.08.10 |
ARM 에서는 current instruction 과 PC 가 같지 않다. (0) | 2015.01.09 |
olly/ida에서의 HW Bp 처리방식 차이 (0) | 2014.07.03 |
[써볼만한 주제] unlikly 결과 어셈블리는 ? (0) | 2014.03.31 |