21장 Windows 메세지 후킹
훅 Hook
- 훅을 건다? : 중간에 오고가는 정보를 엿보거나 가로채기 위해 초소를 설치
- 후킹? : 실제로 정보를 엿보고 조작하는 행위
메세지 훅
- 그림과 같이 키보드 메세지 훅이 설치되어있다면 OS 메세지 큐와 응용 프로그램 메세지 큐 사이에 설치된 Hook Chain에 있는 키보드 메세지 훅들이 응용 프로그램보다 먼저 해당 메세지를 볼 수 있다.
- Hook Chain : 같은 메세지 훅이여도 여러개를 동시에 설치 가능. 이런 훅은 순서대로 호출되기 때문에 이를 훅 체인이라고함.
SetWindowsHookEx()
HHOOK SetWindowsHookExA(
[in] int idHook, // hook type
[in] HOOKPROC lpfn, // hook procedure
[in] HINSTANCE hmod, // 위 hook procedure가 속해 있는 DLL 핸들
[in] DWORD dwThreadId // hook을 걸고 싶은 trhread의 ID
// 0을 주고 호출하면 글로벌 훅이 설치됨. 실행중인 모든 프로세스에 영향
);
- hook procedure : 운영체제가 호출해주는 콜백 함수. 메세지 훅을 걸때 DLL 내부에 존재해야하며, 그 DLL 의 인스턴스 핸들이 hMod다.
- 어떤 프로세스에서 해당 메세지가 발생했을 때 운영체제가 해당 DLL 파일을 해당 프로세스에 강제로 injection하고 등록된 hook procedure를 호출한다.
키보드 메세지 후킹 실습

- KeyHook.dll : 훅 프로시저 (KeyboardProc)가 존재하는 DLL 파일
- HookMain.exe : KeyHook.dll을 최초로 로딩하여 키보드 훅을 설치하는 프로그램
- HookMain.exe에서 KeyHook.dll 파일을 로딩한 후 SetWindowsHookEx()를 이용하여 키보드 훅 (KeyboardProc)을 설치한다.
- 다른 프로세스에서 키 입력 이벤트가 발생하면 키 입력 이벤트가 발생한 프로세스에게 OS가 KeyHook.dll을 강제로 injection한다.
- KeyHook.dll을 로딩한 프로세스에서 키보드 이벤트가 발생하면 ****KeyboardProc()가 먼저 호출된다
- 키보드 입력 발생 시 현재 프로세스 이름과 notepad.exe가 같다면 1을 리턴해 KeyboardProc()함수를 종료시킨다. ⇒ 메세지를 가로채 없애버린다. ⇒ 키보드 메세지가 메세지 큐에 전달되지 않는다.
- return CallNextHookEx 명령을 실행하면 메세지가 다른 응용프로그램 또는 훅 체인의 또 다른 훅 함수로 전달된다.
실행
- Process Explorer Search 에서 KeyHook.dll이 인젝션된 프로세스들을 볼 수 있음
- q로 종료하면, HookMain.exe는 키보드 훅을 제거하고 종료하게됨.
- ⇒ 키보드 훅이 제거되면서 관련 프로세스에서 KeyHook.dll 파일이 모두 Unloading됨. (메모장 키보드 입력 정상 작동, Process Explorer에 KeyHook.dll 검색시 아무런 프로세스도 KeyHook.dll을 로딩하고 있지 않게됨. )
디버깅
1. HookMain.exe 디버깅
핵심코드 찾는 방법 3가지
1. 한 줄씩 트레이싱
2. 관련 API 검색
3. 관련 문자열 검색
- 100010EF에서 SetWindowsHookExW()가 호출이되고, 그 위에 PUSH하는 10001020, 2가 파라미터 hook type과 hook procedure 주소.
2. NotePad.exe 프로세시 내의 KeyHook.dll 디버깅
- 실행중인 메모장프로세스에 attach 해주고 F9로 정상 동작하게 만든다.
- 10000000 주소에 KeyHook.dll이 로딩된 것을 확인 가능
- 다른 DLL이 먼저 로딩되는 경우 그냥 keyhook.dll나올때까지 f9눌러주면됨
- KeyHook.dll 을 더블 클릭하여 KeyHook.dll의 EP주소로 간다.
- 훅 프로시저 주소 10001020를 알고 있으므로 바로 가서 BP(F2)를 걸자
- 방금 설정한 DLL 옵션을 제거해준다.
- 키보드 입력 이벤트가 발생할때마다 여기서 멈춰지는 것을 볼 수 있다.
22장 악의적인 목적으로 사용되는 키로거
키로거 이슈가 있구나~
23장 DLL 인젝션
DLL Injection ?
- 다른 프로세스에게 LoadLibrary() API 를 스스로 호출하도록 명령하여 사용자가 원하는 DLL을 Loading하는 것 (실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입하는 것)
- DLL 인젝션 (로딩 대상이 다른 프로세스) vs DLL 로딩 (로딩 대상이 나)
- myhack.dll은 notepad.exe 프로세스 메모리에 대한 접근 권한을 가지기 때문에 사용자가 원하는 버그 패치, 기능 추가 등의 일을 곧바로 수행 가능.
DLL (Dynamic Linked Library)
프로세스에 DLL이 로딩되면 자동으로 DllMain()이 호출된다.
DllMain()에 사용자가 원하는 코드를 추가하면 DLL이 로딩될 때 자연스럽게 해당 코드가 실행된다.
DLL Injection 활용 예
- LoadLibrary() API 를 이용해 어떤 DLL을 로딩하면 해당 DLL의 DllMain() 함수가 수행된다.
- DLL Injection 동작 원리는 외부에서 다른 프로세스가 LoadLibrary() API를 호출 하도록 하는 것이기에 이 API를 이용해서 어떤 DLL을 로딩 시킬 경우 해당 DLL의 DllMain() 함수가 실행 된다.
- 삽입된 DLL은 해당 프로세스 메모리 접근권한을 가져 악의적 용도로 사용되기도 한다.
- 악성코드
- 정상 프로세스에 몰래 들어가 악성 파일을 다운 받거나, 몰래 백도어를 열어 외부 접속을 한다거나 키로깅 등을 한다.
- 프로세스 내부에서 벌어지는 일이기 때문에 일반 PC사용자들은 눈치채기가 힘들다.
- 유해 프로그램, 사이트 차단 프로그램
- DLL Injection 기법으로 정상 프로세스에 살짝 숨어들어가 들키기 힘들다.
- 프로세스 강제종료에도 안전하다. ex) 게임 프로그램, 성인 사이트 접속 차단
- 기능 개선 및 버그 패치
- 어떤 프로그램의 소스코드가 없거나 수정이 힘들때 DLL Injection을 이용, 전혀 새로운 기능을 추가하거나(Plug in 개념) 문제있는 코드, 데이터를 수정 가능하다.
- API Hooking
- 정상 API 호출을 중간에서 후킹하여 원하는 기능을 추가 혹은 제거 하는 목적으로 사용
- 정상 API 호출을 중간에서 후킹하여 원하는 기능을 추가 혹은 제거 하는 목적으로 사용
DLL Injection 구현 방법
- 원격 스레드 생성(CreateRemoteThread() API)
- 레지스트리 이용(AppInt_DLLs 값)
- 메시지 후킹(SetWindowsHookEx() API)
1) CreateRemoteThread
- PID 확인
- 실습 예제 DLL 파일은 notepad.exe 프로세스에 성공적으로 인젝션되면 디버그 문자열을 출력하게 되는데, DebugView로 그 순간을 확인할 수 있다.
- Process Explorer에서도 myhack.dll이 인젝션된 것을 확인할 수 있다.
- 결과를 확인하면 다음과 같이 index.html이 생긴 것을 볼 수 있다
2) AppInit_DLLs
- Windows 운영체제에서 기본으로 제공하는 AppInit_DLLs와 LoadAppInit_DLLs라는 이름의 레지스트리 항목이 있다.
- AppInit_DLLs 항목에 인젝션을 원하는 DLL 경로 문자열을 쓰고 LoadAppInit_DLLs 항목의 값을 1로 변경한 후 재부팅하면, 실행되는 모든 프로세스에 해당 DLL을 인젝션 한다.
- 적당한 위치에 넣고 LoadAppInit_DLLs 항목의 값을 1로 변경한 후 재부팅
- myhack2.dll이 성공적으로 인젝션 되었지만… 인젝션된 myhack2.dll은 아무 동작을 하고 있지 않는다.
3) SetWindowsHookEx()
- OS에서 hookpreocedure를 담고있는 DLL을 프로세스에게 강제로 인젝션한다. (위에 21장처럼 ㄱ)
'Rev' 카테고리의 다른 글
dungeon-in-1983 (0) | 2025.01.03 |
---|---|
리버싱 핵심원리 20장 (0) | 2024.10.06 |
리버싱 핵심원리 16장 (0) | 2024.09.28 |
리버싱 핵심원리 2부 (0) | 2024.09.23 |
KnockOn Bootcamp ROP (0) | 2024.09.18 |