๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ ๋ณด์•ˆ·์ทจ์•ฝ์ /๐Ÿ”ธ์‹œ์Šคํ…œ·์šด์˜์ฒด์ œ

[Windows] ์œˆ๋„์šฐ์ฆˆ ๋ฉ”์‹œ์ง€ ํ›„ํ‚น

by Jenny:! 2024. 10. 2.

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๋ฅผ ํ†ตํ•ด ๊ณง๋ฐ”๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋„˜๊ธด๋‹ค.

 

์‹ค์Šต ๊ณผ์ • ์š”์•ฝ

  1. HookMain.exe ์‹คํ–‰
  2. HookMain.exe์˜ main() ํ•จ์ˆ˜์—์„œ LoadLibrary(KeyHook.dll) ์‹คํ–‰๋จ
  3. HookStart() ํ•จ์ˆ˜์— ์˜ํ•ด SetWindowsHookEx() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ
  4. KeyboardProc() ํ›… ์„ค์น˜
  5. ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ notepad.exe์— ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋ฐœ์ƒ
  6. OS๋Š” ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•œ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์— ๊ฐ•์ œ๋กœ KeyHook.dll ์ธ์ ์…˜
  7. ๊ทธ ํ›„ notepad.exe์— ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, SetWindowsHookEx() ๋Œ€์‹  KeyboardProc() ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ๋จ