MFC(Microsoft Foundation Classes) : Visual C++에 부속되는 클래스 라이브러리, 윈도우 애플리케이션 개발에 적합하도록 제공되는 프레임워크

 

MFC 개발여부 확인 : PE헤더의 IAT 확인 (패킹된 경우 : 메모리에 로드되었을때 .rdata섹션에 MFC관련 클래스가 보관되어 있음)

 

MFC 라이브러리(심볼파일) 등록 : OllyDBG에서 debug - Select Import Libraries 메뉴를 통해 lib 파일을 등록

보통 C:\Program Files\Microsoft SDK\Lib\IA64\mfc 디렉토리에 위치

-> MFC함수의 이름이 자세히 표기된다.

 

1. MFC 초기화 루틴 찾기

MFC의 초기화 루틴은 OnInitDialog()에서 이뤄진다.

이 함수는 MFC의 API함수 CDialog::OnInitDialog를 호출한다.

IAT에서 CDialog::OnInitDialog를 찾고 역참조 기법을 이용해서 개발자가 직접 만든 OnInitDialog() 부분을 찾을 수 있다.

 

버튼 핸들러 찾기

MFC 핸들러 함수는 가상 함수라서 .rdata 섹션에 테이블이 보관된다. 또한 상속의 개념에 따라 함수의 엔트리 포인트가 push ebp와 같은 일반적인 코드로 시작되지 않는다.

 

핸들러를 하나 만들때마다 아래의 구조체(메시지 맵)가 하나씩 생긴다.

struct AFX_MSGMAP_ENTRY {
  UINT nMessage;	// 윈도우 메시지 (WM_PAINT, WM_CREATE 등)
  UINT nCode;	// control code or WM_NOTIFY code (new in MFC 3.0)
  UINT nID;	// 메시지를 발생시킨 컨트롤 ID (윈도우 메시지일 경우 0)
  UINT nLastID;	// 컨트롤 ID의 범위를 나타내는 entry (new in MFC 3.0)
  UINT_PTR nSIG;	// nMessage에 해당되는 함수의 시그니처
  AFX_PMSG pfn;	// nMessage를 처리하는 함수의 포인터
};

여기서 pfn이 핸들러 함수의 주소이다.

따라서 핸들러를 찾고자하는 컴포넌트의 메시지 맵 구조체만 찾으면 된다.

이때 nID와 nLastID에 리소스 ID가 들어가기 때문에 이를 이용해서 찾아낼 수 있다.

#define IDM_ABOUTBOX		0x0010
#define IDD_ABOUTBOX		100
#define IDS_ABOUTBOX		101
#define IDD_MFCREVERSING_DIALOG	102
#define IDR_MAINFRAME		128
#define IDC_BUTTON1		1000
#define IDC_BUTTON2		1001

추가로, 리소스 해커를 이용하면 Dialog 리소스에서 특정 버튼이 선언된 곳을 찾아낼 수 있다.

여기서 그 버튼의 리소스 ID를 알아내자.

예를 들어 리소스 ID가 1001로 확인되었으면

OllyDBG를 이용해 .rdata섹션에서 E9 03 00 00 E9 03 00 00의 위치를 검색해주면 메시지 맵을 찾을 수 있다.

이때 E9 03 00 00 E9 03 00 00로 해주는 이유는 우선 리소스 ID를 넣는 field가 두번 연속해서 나오기 때문이고, 16진수로 변환한 후 리틀 엔디언 방식을 적용했기 때문이다.

'리버스 엔지니어링 바이블' 카테고리의 다른 글

06 흔히 사용하는 패턴  (0) 2018.11.10
05 PE 헤더 (PE Header)  (0) 2018.11.10
04 DLL 분석  (0) 2018.10.17
03 C++ 클래스와 리버스 엔지니어링  (0) 2018.10.14
02 C 문법과 디스어셈블링  (0) 2018.10.14

+ Recent posts