티스토리 뷰

HookMain.exe 디버깅

먼저 키보드 후킹을 설치해주는 HookMain.exe 디버깅한다.

올리 디버거로 열어보자.



위의 그림은 EP의 코드이다. 전형적인 VC++의 스텁 코드이다. 

핵심 코드 찾기 위해서는 몇 가지 방법이 존재한다.


1. 한 줄씩 트레이싱

2. 관련 API 검색

3. 관련 문자열 검색하기


한 줄씩 트레이싱하는 것보단 API 또는 문자열 검색 방법을 먼저 해보겠다.

HookMain.exe.을 실행보면 이 프로그램의 기능 - 키보드 후킹과 출력되는 문자열 - "Press 'q' to quit!" 을 알고 있다.

이 문자열을 참조하는 코드 전/후에 우리가 관심이 있는 코드가 있을 것이다. 이제 문자열을 찾아보자.


All referenced text strings 항목을 선택하면 아래와 같은 그림이 나온다.



이제 문자열 "Press 'q' to quit!" 더블 클릭하면 40104D 주소로 가게 된다.



4010000 주소에 BP를 설치한 후 실행(F9)하면 이 주소에서 멈추고 디버깅이 가능하다. 위 코드를 차례대로 트레이싱해서 내려오면 흐름을 알 수 있다.

401006 주소에서 LoadLibraryA을 호출한 후 40104B 주소의 CALL EBX 명령에 의해 KeyHook.HookStart() 함수가 호출되는 것을 알 수 있다.

이 명령을 따라가 보겠다.(StepInto F7) 아래와 같은 코드가 나타난다.



위의 코드는 HookMain.exe 프로세스에 로딩된 KeyHook.dll의 HookStart() 함수이다. 100010EF 주소에서 CALL SetWindowsHookExW() 명령어를 볼 수 있다.

100010E8과 100010ED 주소의 PUSH 명령어를 보면 SetWindowsHookExW() API의 1,2 번쨰 파라미터를 알 수 있다. 


먼저 API의 첫 번째 파라미터(idHook)의 값은 WH_KEYBOARD(2)이다. 두 번째 파라미터(lpfn)의 값은 10001020이며,이 값이 바로 훅 프로시저의 주소이다.

HookMain.exe의 main() 함수에서 나머지 코드는 사용자로부터 'q' 입력을 받아서 후킹을 종료하는 것이다.


이제 notepad.exe 프로세스에 인젝션된 KeyHook.dll의 훅 프로시저를 디버깅해보도록 하겠다. 올리디버거로 메모장을 열어보면



아래와 같은 화면이 나오게 된다.

F9를 눌러 메모장을 실행시키고 프로세스를 정상적으로 동작하게 만들어준다.

이제 아래와 같은 옵션을 체크상태로 변경해준다.




이 옵션은 프로세스에 새로운 DLL이 로딩될 때에 자동으로 디버깅을 멈추는 옵션이다. 이 상태에서 HookMain.exe를 실행하자. 그리고나서 메모장에 키보드를 이용해

입력을 해보면 아래와 같은 화면이 나오게 된다.



AE0000 주소에 KeyHook.dll이 로딩되는 것을 확인할 수 있다.

KeyHook.dll을 더블클릭하면 KeyHook.dll의 EP주소로 간다. 그전에 아까 해놓은 옵션을 원래대로 변경해야 한다.



이제 훅 프로시저(AE1000)에 BP를 설치하면, 메모장에 키보드 입력 이벤트가 발생시 이곳에 멈추게 된다.



'Reversing > Reverse Engineering' 카테고리의 다른 글

실행 압축 테스트  (0) 2016.04.26
Huffman Algorithm에 대해서  (0) 2016.04.23
PE File Format에 대해서  (0) 2015.12.29
abex’ crackme #1  (0) 2015.12.26
OllyDbg를 이용한 스택 공부하기  (0) 2015.12.23
댓글