Hooking
Hooking์ด๋, ์ด์ ์ฒด์ ๋ ์์ฉ ์ํํธ์จ์ด ๋ฑ์ ๊ฐ์ข ์ปดํจํฐ ํ๋ก๊ทธ๋จ์์ ์ํํธ์จ์ด ๊ตฌ์ฑ ์์ ๊ฐ์ ๋ฐ์ํ๋ ํจ์ ํธ์ถ, ๋ฉ์์ง, ์ด๋ฒคํธ ๋ฑ์ ์ค๊ฐ์์ ๋ฐ๊พธ๊ฑฐ๋ ๊ฐ๋ก์ฑ๋ ๋ช ๋ น, ๋ฐฉ๋ฒ, ๊ธฐ์ ์ด๋ ํ์๋ฅผ ๋งํ๋ค.
Message Hook
Windows ์ด์์ฒด์ ๋ GUI๋ฅผ ์ ๊ณตํ๊ณ , ์ฌ์ฉ์๋ ์์ด์ฝ, ๋ฉ๋ด, ๋ฒํผ, ์ฐฝ ๋ฑ์ ๊ทธ๋ํฝ ์์๋ฅผ ํด๋ฆญํ๊ฑฐ๋ ํค๋ณด๋๋ฅผ ์ ๋ ฅํ๋ ๋ฑ์ ๋ฐฉ์์ผ๋ก ์ํธ์์ฉํ๋ค. ์ด๋ฅผ Event Driven๋ฐฉ์์ด๋ผ๊ณ ํ๋ค.
Event๊ฐ ๋ฐ์ํ ๋ OS๋ ๋ฏธ๋ฆฌ ์ ์๋ ๋ฉ์์ง๋ฅผ ํด๋น ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ํต๋ณดํ๋๋ฐ, ์ด๋ฌํ ๋ฉ์์ง๋ฅผ ์ค๊ฐ์์ ๊ฐ๋ก์ฑ์ด ํ์ํ ์์ ์ ์งํํ๋ ํ์๋ฅผ ๋ฉ์์ง ํ ์ด๋ผ ์ผ์ปซ๋๋ค.
Message Hook์ ๋์ ์๋ฆฌ

1. ํค๋ณด๋ ์ ๋ ฅ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด WM_KEYDOWN ๋ฉ์์ง๊ฐ OS message queue์ ์ถ๊ฐ๋๋ค.
2. OS๋ ์ด๋ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ํ์ ํ์ฌ OS message queue์ ์ ์ฅ๋ ๋ฉ์์ง๋ฅผ ๊บผ๋ด์ด ํด๋น ์์ฉ ํ๋ก๊ทธ๋จ์ application message queue์ ์ถ๊ฐํ๋ค.
3. ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ ์ message queue๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ์๋ค๊ฐ WM_KEYDOWN ๋ฉ์์ง๊ฐ ์ถ๊ฐ๋ ๊ฑธ ํ์ธํ๊ณ ํด๋น event handler๋ฅผ ํธ์ถํ๋ค.
์ด๋ฌํ ์ํฉ์์ ๋ง์ฝ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํค๋ณด๋ ๋ฉ์์ง ํ ์ด ์ค์น๋์๋ค๋ฉด, OS message queue์ application message queue ์ฌ์ด์ ์ค์น๋ ํ ์ฒด์ธ์ ์๋ ํค๋ณด๋ ๋ฉ์์ง ํ ๋ค์ด ์์ฉ ํ๋ก๊ทธ๋จ๋ณด๋ค ๋จผ์ ํด๋น ๋ฉ์์ง๋ฅผ ๋ณผ ์ ์๋ค. ํค๋ณด๋ ๋ฉ์์ง ํ ํจ์ ๋ด์์๋ ๋จ์ํ ์ผํ์ ๊ธฐ๋ฅ๋ฟ๋ง ์๋๋ผ ๋ฉ์์ง ๋ด์ฉ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ ์๋ ์๊ณ , ๊ฐ๋ก์ฑ์ด ์๋๋ก ๋ด๋ ค๋ณด๋ด์ง ์๋๋ก ํ ์๋ ์๋ค.
SetWindowsHookEx()
๋ฉ์์ง ํ ์ SetWindowsHookEx() API๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ๊ตฌํํ ์ ์๋ค. SetWindowsHookEx๋ฅผ ์ด์ฉํ์ฌ ํ ์ ์ค์นํด ๋์ผ๋ฉด, ์ด๋ค ํ๋ก์ธ์ค์์ ๋ฉ์์ง๊ฐ ๋ฐ์ํ์ ๋, ์ด์์ฒด์ ๊ฐ ํด๋น dll ํ์ผ์ ํด๋น ํ๋ก์ธ์ค์ ๊ฐ์ ๋ก ์ธ์ ์ ํ๊ณ ๋ฑ๋ก๋ hook procedure๋ฅผ ํธ์ถํ๋ค.
SetWindowsHookEx() ํจ์์ ์ ์๋ ์๋์ ๊ฐ๋ค.
HHOOK SetWindowsHookEx {
int idHook,
HOOKPROC lfpfn,
HINSTANCE hMod,
DWORD dwThreadId
};
- idHook
- ์ค์นํ๊ณ ์ ํ๋ ํ ์ ํ์ ์ ์ง์ ํ๋ค.
- lpfn
- ํ ํ๋ก์์ ์ ์ฃผ์
- hMod
- ํ ํ๋ก์์ ๋ฅผ ๊ฐ์ง ๋ชจ๋์ ํธ๋ค(์ฃผ์)
- dwThreadId
- ํํน ํ ๋์์ thread ID
- ์ด ๊ฐ์ด 0์ด๋ฉด ํธ์ถํ๋ ์ค๋ ๋์ ๊ฐ์ ๋ฐ์คํฌํ ์์ ๋ชจ๋ ์ค๋ ๋์์ ๋ฐ์ํ๋ ๋ฉ์์ง๊ฐ ํ ํ๋ก์์ ๋ก ์ ๋ฌ๋๋ค.
HookMain.cpp
HookMain.cpp๋ KeyHook.dll์ ๋ก๋ํ ํ, dll๋ก๋ถํฐ HOOKSTART์ HOOKSTOP ํจ์์ ์ฃผ์๋ฅผ ์ป๋๋ค.
HookStart() ํจ์๋ก ํํน์ ์์ํ๋ค. 'q'๋ฅผ ๋๋ฅด๋ฉด HookStop() ํจ์๊ฐ ํธ์ถ๋๋ค.
KeyHook.cpp
HookStart() ํจ์๊ฐ ํธ์ถ๋๋ฉด SetWindowsHookEx() ํจ์์ ์ํด ํค๋ณด๋ ํ ์ฒด์ธ์ KeyboardProc() ํจ์๊ฐ ์ถ๊ฐ๋๋ค.
KeyboardProc() ํจ์๋ ํค๋ณด๋ ์ ๋ ฅ์ด ๋ฐ์ํ์ ๋, ํ์ฌ PID์ "notepad.exe" ๋ฌธ์์ด์ ๋น๊ตํ์ฌ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ 1์ ๋ฆฌํดํ์ฌ KeyboardProc() ํจ์๋ฅผ ์ข ๋ฃ์ํจ๋ค. ์ด๋ ๋ฉ์์ง๋ฅผ ๊ฐ๋ก์ฑ์ ์์ ๋ ๋์๊ณผ ๊ฐ๋ค.
๊ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ return CallNextHookEx(g_hHook, nCode, wParam, lParam); ๋ช ๋ น์ ์คํํ๋๋ฐ, ์ด ๋ ๋ฉ์์ง๋ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ ํน์ ํ ์ฒด์ธ์ ๋ ๋ค๋ฅธ ํ ํจ์๋ก ์ ๋ฌ๋๋ค. ๋ฐ๋ผ์ dwThreadId ์ต์ ์ 0์ผ๋ก ํ์์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ํค ์ ๋ ฅ์ ์ ์์ ์ผ๋ก ๋ฐ์ ์ ์๋ค. ๋ฉ์์ง๋ฅผ ๋ฐ์์ ์์ ๊ฑฐ๋ ๋ค์ ํ ์ผ๋ก ๋๊ธฐ๋ ๊ฒ ์๋๋ผ CallNextHookEx๋ฅผ ํตํด ๊ณง๋ฐ๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ๋๊ธด๋ค.
์ค์ต ๊ณผ์ ์์ฝ
- HookMain.exe ์คํ
- HookMain.exe์ main() ํจ์์์ LoadLibrary(KeyHook.dll) ์คํ๋จ
- HookStart() ํจ์์ ์ํด SetWindowsHookEx() ํจ์๊ฐ ์คํ๋จ
- KeyboardProc() ํ ์ค์น
- ์ฌ์ฉ์๋ก๋ถํฐ notepad.exe์ ํค๋ณด๋ ์ ๋ ฅ ๋ฐ์
- OS๋ ํค๋ณด๋ ์ ๋ ฅ์ด ๋ฐ์ํ ํด๋น ํ๋ก์ธ์ค์ ๊ฐ์ ๋ก KeyHook.dll ์ธ์ ์
- ๊ทธ ํ notepad.exe์ ํค๋ณด๋ ์ ๋ ฅ์ด ๋ค์ ๋ฐ์ํ ๊ฒฝ์ฐ, SetWindowsHookEx() ๋์ KeyboardProc() ํจ์๊ฐ ๋จผ์ ํธ์ถ๋จ
'๐ ๋ณด์ยท์ทจ์ฝ์ > ๐ธ์์คํ ยท์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OS] ์์คํ ๊ตฌ์กฐ (0) | 2023.10.01 |
|---|---|
| [ubunbtu] sscanf, argc/argv ์ค์ต (0) | 2023.09.18 |
| [dreamhack] Exploit Tech: Shellcode (0) | 2023.07.13 |
| [dreamhack] Background: Computer Architecture (0) | 2023.07.10 |
| [dreamhack] System Hackig Introduction (0) | 2023.07.08 |