본문 바로가기

리버스 엔지니어링

HookMain.exe 디버깅

Windows 메시지 후킹 기법을 어떻게 디버깅하는지 살펴보자.

 

먼저 키보드 후킹을 설치해주는 HookMain.exe를 디버깅 한다. OllyDbg로 HookMain.exe를 열어보자.

 

 

 

위 그림은 HookMain.exe의 EP(Entry Point) 코드이다. 전형적인 VC++의 스텁 코드이다. 우리가 관심있는 코드는 키보드 후킹을 시작하는 부분이다.

search for - All referenced String을 통해 Press 'q' to quit! 이부분을 찾아보자.

 

 

 

 

 

그림이 보여지는 코드는 프로그램의 main() 함수이다.

 

main() 함수 디버깅

 

401000 주소에 BP를 설치한 후 실행하면 이 주소에서 멈추면서 디버깅이 가능해진다. 위 코드를 차례대로 트레이싱해서 내려오다 보면 주요 흐름을 알 수 있다. 401006 주소에서 LoadLivrary(KeyBook.dll)을 호출한 후 40104B 주소의 CALL EBX 명령에 의해서 KeyHook.HookStart()함수가 호출되는 것을 알 수 있다. 40104B 주소의 CALL EBX 명령을 따라가보자.

 

 

위의 코드는 HookMain.exe 프로세스에 로딩된 KeyHook.dll의 HookStart() 함수이다. 100010EF 주소에서 CALL setWindowsHookEXW() API의 1,2번째 파라미터를 알 수 있다.

먼저 API의 첫 번쨰 파라미터(idhook)의 값은 WH_KEYBOARD(2)이다. 두번째 파라미터(lpfn)의 값은 10001020이며 이 값이 바로 훅 프로시저(Hook Procedure)의 주소이다. 이 주소 뒤에서 KeyHook.dll을 디버깅 할 때 사디 살펴볼 것이다. HookMain.exe의 main() 함수(401000)에서 나머지 코드는 사용자로부터 'q'입력을 받아서 후킹을 종료하는 것이다. 간단한 내용이므로 직접 디버깅 해보자.