그리고 예제 파일을 이용해서 실습을 해보도록 하겠습니다.
이전 포스트에서 이어지는 내용입니다.
API Hooking – 계산기, 한글을 배우다. (1)
IAT Hooking 동작 원리
프로세스에서 IAT(Import Address Table)는 프로그램에서 호출되는 API 들의 주소가 저장되는 장소입니다.
* IAT 설명
PE(Portable Executable) File Format (6) - PE Header
IAT Hooking 은 IAT 에 저장된 API 의 주소를 바꿔 치는 후킹 기법입니다.
아래 그림을 봐주시기 바랍니다.
<Fig. 1>
이것은 정상적인 계산기(calc.exe) 프로세스에서 user32!SetWindowTextW() API 호출을 나타낸 그림입니다.
01001110 주소가 바로 IAT 영역이며, 프로그램 실행시점에 PE Loader 가 이 주소(01001110)에 user32!SetWindowTextW() API 주소(77D0960E)를 기록해 두었습니다.
01002628 주소의 CALL DWORD PTR [01001110] 명령은 01001110 주소에 저장된 값(77D0960E)을 호출하라는 뜻이므로 결국 CALL 77D0960E 명령과 같습니다.
01002628 의 CALL 명령에 의해서 제어는 user32!SetWindowTextW() 시작 주소(77D0960E)로 갔다가(1), 함수 실행이 완료되면 되돌아 옵니다.(2)
이제 IAT 가 후킹된 계산기 프로세스를 보시겠습니다.
<Fig. 2>
IAT Hooking 을 위해서 먼저 계산기 프로세스(calc.exe)에게 “hookiat.dll” 파일을 injection 시켰습니다.
* DLL Injection 설명
DLL Injection - 다른 프로세스에 침투하기 (1)
hookiat.dll 파일은 MySetWindowTextW() 라는 후킹 함수(10001000)를 제공합니다.
01002628 주소의 CALL 명령을 보시면 <Fig. 1> 의 그것과 완전히 동일합니다. 하지만 01001110 주소에 가면 값이 10001000 으로 바뀌어 있습니다. 10001000 주소는 hookiat!MySetWindowTextW() 함수의 시작주소 입니다.
즉, 실행 코드는 그대로 두고 IAT 에 저장된 API 의 시작 주소를 사용자 함수의 시작 주소로 변경하였습니다. 이것이 IAT Hooking 의 기본 동작 원리 입니다.
IAT 가 후킹된 계산기 프로세스의 실행 흐름을 보겠습니다.
01002628 주소의 CALL 명령에 의해서 제어는 hookiat!MySetWindowTextW() 시작 주소(10001000)로 갔다가(1), 뭔가 작업을 하고 1000107D 주소의 CALL 명령에 의해서 (원래 호출하려 했던) user32!SetWindowTextW() 시작주소로 갑니다.(2)
* 참고로 1000B6B8 은 hookiat.dll 의 data 섹션 영역이며 전역변수 g_pOrgFunc 의 주소입니다. DLL Injection 될 때 DllMain() 에서 원본 함수(user32!SetWindowTextW())의 시작 주소를 구해서 저장해 두었습니다.
이후 user32!SetWindowTextW() API 가 종료되면 제어는 hookiat.dll 의 1000107D 주소의 명령어 이후로 돌아오고(3), 최종적으로 calc.exe 의 코드영역인 01002628 주소의 명령어 이후로 되돌아 오게 됩니다.(4)
즉, user32!SetWindowTextW() API 를 호출하기 전에 hookiat!MySetWindowTextW() 를 호출해 준것입니다.
대상 프로세스(calc.exe)에 사용자 DLL(hookiat.dll)을 인젝션 시키고, calc.exe 프로세스의 IAT 영역에서 4 byte 크기의 주소만 변경하면 위와 같이 쉽게 API Hooking 을 할 수 있습니다. (IAT 패치를 이용한 API 후킹을 특별히 IAT Hooking 이라고도 말합니다.)
위 과정을 잘 숙지하신 후 아래 실습 예제를 따라 해보시기 바랍니다.
실습
계산기의 에디터 윈도우에 숫자 대신 한글을 표시하는 예제 파일입니다. 이 파일들은 앞에서 설명한 IAT 패치를 통한 API Hooking 기법을 사용하였습니다.
* 참고
hookiat.dll 과 InjectDll.exe 파일 모두 VC++ 2008 Expr. 로 제작되었으며, Windows XP SP3 에서 테스트 하였습니다. 혹시 실행이 안 되는 경우 연락해 주시기 바랍니다.
위에 첨부된 파일을 적당한 위치(c:\work)에 복사해주세요.
먼저 계산기(calc.exe)를 실행하신 후 Process Explorer 등으로 PID 값을 알아냅니다.
<Fig. 3>
커맨드 창에서 아래와 같이 입력해 주세요.
<Fig. 4>
Process Explorer 로 인젝션 된 hookiat.dll 을 확인해 보겠습니다.
<Fig. 5>
자 이제 계산기 프로그램에 아무 숫자나 입력해서 연산을 해보시기 바랍니다.
<Fig. 6>
입력하는 모든 숫자가 한글로 변경됩니다. 이 상태에서 계산기의 연산 기능은 완벽하게 잘 동작합니다.
그러면 이번에는 Unhook 을 해볼까요?
Unhook 은 IAT 를 원래 값으로 복원시키고 삽입시킨 DLL (hookiat.dll) 을 빼내면 됩니다.
커맨드 창에서 아래와 같이 입력하세요.
<Fig. 7>
다시 계산기 프로그램에 숫자를 입력해 보시기 바랍니다.
<Fig. 8>
정상적으로 숫자가 찍혀 나타납니다. Unhook 성공입니다.
다음 포스트에는 예제 프로그램의 소스 코드를 상세히 분석하여 IAT Hooking 에 대한 구현 방법을 알아보겠습니다. 또한 디버거를 이용해서 계산기 프로세스의 가상메모리를 살펴보면서 실제로 IAT 가 어떤식으로 후킹 되었는지 확인하겠습니다.
API Hooking - 계산기, 한글을 배우다. (3)
+---+
ReverseCore
위 글이 도움이 되셨다면 추천(view on) 부탁드려요~
'study' 카테고리의 다른 글
| API Hooking - '스텔스' 프로세스 (3) (39) | 2009/12/30 |
|---|---|
| API Hooking - '스텔스' 프로세스 (2) (32) | 2009/12/16 |
| API Hooking – '스텔스' 프로세스 (1) (18) | 2009/12/13 |
| API Hooking - 계산기, 한글을 배우다. (4) (10) | 2009/11/27 |
| API Hooking – 계산기, 한글을 배우다. (3) (35) | 2009/11/20 |
| API Hooking - 계산기, 한글을 배우다. (2) (14) | 2009/11/13 |
| API Hooking - 계산기, 한글을 배우다. (1) (30) | 2009/11/10 |
| API Hooking - 메모장 WriteFile() 후킹 (3) (26) | 2009/11/04 |
| API Hooking - 메모장 WriteFile() 후킹 (2) (3) | 2009/11/03 |
| API Hooking - 메모장 WriteFile() 후킹 (1) (22) | 2009/10/08 |
| API Hooking - Tech Map (10) | 2009/09/29 |
hookiat.dll
InjectDll.exe
