27
Windows API Hooking Reversing ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API ํ›„ํ‚น์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž 4/13/2016 By Kali KM

Windows API Hooking

  • Upload
    others

  • View
    28

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Windows API Hooking

Windows API

Hooking Reversing ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” API ํ›„ํ‚น์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

4/13/2016

By Kali KM

Page 2: Windows API Hooking

ํŽ˜์ด์ง€ 2 / 27

2 Windows API Hooking

๋ชฉ์ฐจ

1 Intro .............................................................................................................................................................. 4

2 Prior Knowledge...................................................................................................................................... 5

2.1 What is an API? .......................................................................................................................... 5

2.2 What is an API Hooking? ....................................................................................................... 6

3 User Mode Hooking.............................................................................................................................. 7

3.1 IAT Hooking ................................................................................................................................. 7

3.2 Message Hooking ................................................................................................................... 13

4 Kernel Mode Hooking ....................................................................................................................... 15

4.1 System Call ................................................................................................................................ 15

4.2 INT 0x2E Hooking ................................................................................................................... 16

4.3 SYSENTER Hooking ................................................................................................................ 19

4.4 SSDT Hooking .......................................................................................................................... 22

5 Conclusion .............................................................................................................................................. 26

6 Reference ................................................................................................................................................ 27

๊ทธ๋ฆผ

๊ทธ๋ฆผ 1. User Mode & Kernel Mode ............................................................................................. 5

๊ทธ๋ฆผ 2. ์ •์ƒํ˜ธ์ถœ๊ณผ ํ›„ํ‚น๋œ ํ˜ธ์ถœ .................................................................................................. 6

๊ทธ๋ฆผ 3. PE View๋กœ ๋ณธ IAT................................................................................................................ 7

๊ทธ๋ฆผ 4. Sleep API .................................................................................................................................. 7

๊ทธ๋ฆผ 5. ๋ฉ”๋ชจ๋ฆฌ์—์„œ Sleep API ........................................................................................................ 8

๊ทธ๋ฆผ 6. Sleep API in IAT .................................................................................................................... 8

๊ทธ๋ฆผ 7. ์ฝ”๋“œ ํŒจ์น˜ ................................................................................................................................ 9

๊ทธ๋ฆผ 8. ํ˜ธ์ถœํ•  ํ•จ์ˆ˜ ์ฃผ์†Œ ๋ณ€๊ฒฝ ..................................................................................................... 9

๊ทธ๋ฆผ 9. ํ•จ์ˆ˜ ํ˜ธ์ถœ - Debugger ................................................................................................... 10

Page 3: Windows API Hooking

ํŽ˜์ด์ง€ 3 / 27

3 Windows API Hooking

๊ทธ๋ฆผ 10. Sleep์ด ํ˜ธ์ถœํ•˜๋Š” ์ฃผ์†Œ ๋ณ€๊ฒฝ ................................................................................... 10

๊ทธ๋ฆผ 11. Code Cave๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ํ‚น ........................................................................................ 11

๊ทธ๋ฆผ 12. (C) ๋‹จ๊ณ„ ์›๋ž˜ ๋ช…๋ น์–ด์™€ ์กฐ์ž‘๋œ ๋ช…๋ น์–ด ............................................................... 11

๊ทธ๋ฆผ 13. ์กฐ์ž‘ ์ฝ”๋“œ ........................................................................................................................... 12

๊ทธ๋ฆผ 14. Ntdll.dll์˜ API ................................................................................................................. 12

๊ทธ๋ฆผ 15. ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹ ........................................................................................................... 13

๊ทธ๋ฆผ 16. SetWindowsHookEx API .............................................................................................. 14

๊ทธ๋ฆผ 17. DLL Injection ..................................................................................................................... 14

๊ทธ๋ฆผ 18. System Call ๊ณผ์ • ............................................................................................................. 15

๊ทธ๋ฆผ 19. INT 0x2E์™€ SYSENTER ................................................................................................. 16

๊ทธ๋ฆผ 20. IDT ๊ตฌ์กฐ .............................................................................................................................. 17

๊ทธ๋ฆผ 21. INT 0x2E์˜ ISR(KiSystemService) ........................................................................... 17

๊ทธ๋ฆผ 22. IDT ์ฃผ์†Œ์™€ ๊ฐ ์—”ํŠธ๋ฆฌ ๊ตฌ์กฐ ....................................................................................... 18

๊ทธ๋ฆผ 23. IDT 0x2E ๋ฒˆ์งธ Entry ...................................................................................................... 18

๊ทธ๋ฆผ 24. IDT Entry 0x2E ํ›„ํ‚น ...................................................................................................... 19

๊ทธ๋ฆผ 25. Read MSR 0x176 ............................................................................................................. 20

๊ทธ๋ฆผ 26. Write MSR 0x176 ............................................................................................................ 20

๊ทธ๋ฆผ 27. ์ •์ƒ์ ์ธ SYSENTER ์ง„์ž… .......................................................................................... 21

๊ทธ๋ฆผ 28. ํ›„ํ‚น ๋œ SYSENTER ์ง„์ž…............................................................................................. 21

๊ทธ๋ฆผ 29. ์ „์ฒด์ ์ธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ณผ์ • ...................................................................................... 22

๊ทธ๋ฆผ 30. SSDT Hooking ๊ณผ์ • ....................................................................................................... 23

๊ทธ๋ฆผ 31. KeServiceDescriptorTable ๊ตฌ์กฐ ................................................................................ 24

๊ทธ๋ฆผ 32. SSDT๋ฅผ ํ†ตํ•œ Native API ์ ‘๊ทผ ................................................................................. 24

๊ทธ๋ฆผ 33. SSDT Hooking .................................................................................................................. 25

Page 4: Windows API Hooking

ํŽ˜์ด์ง€ 4 / 27

4 Windows API Hooking

1 Intro

๋ฆฌ๋ฒ„์‹ฑ์„ ํ•˜๋Š” ๋ฐ ์žˆ์–ด ํ”ํžˆ โ€œArt of Reversing is an API Hookingโ€์ด๋ผ๋Š” ๋ง๊ณผ ๊ฐ™์ด

API ํ›„ํ‚น์€ ๋ฆฌ๋ฒ„์‹ฑ์˜ ๊ฝƒ์ด๋ผ ์ผ์ปฌ์–ด์ง„๋‹ค. ์–ด๋–ค ์œˆ๋„์šฐ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ

์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์–ธ์–ด1๋‚˜ ๋„๊ตฌ2๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฐ ์–ธ์–ด๋‚˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅด๋”๋ผ๋„ ๊ฒฐ๊ตญ, ๊ฐœ๋ฐœ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์œˆ๋„์šฐ

์šด์˜์ฒด์ œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ด๋Ÿฌํ•œ API ๋Š” ์‚ฌ์šฉ์ž ์˜์—ญ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปค๋„ ์˜์—ญ์—์„œ๋„ Native API ์˜ ํ˜•ํƒœ๋กœ

์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— API ํ›„ํ‚น์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์œˆ๋„์šฐ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ์„

์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ๋ฌธ์„œ์—์„œ๋Š” API ํ›„ํ‚น์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋„๋ชจํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ํ›„ํ‚น์˜

๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ํ›„ํ‚น ๋ฐฉ๋ฒ• ๋˜ํ•œ ๋‚ฏ์„ค์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.

๋‹จ, ํ›„ํ‚น์„ ์ง„ํ–‰ํ•˜๋Š” ์ž์„ธํ•œ ์ฝ”๋“œ๋“ค์€ ํฌํ•จํ•˜์ง€ ์•Š๊ณ , ์–ด๋Š ๋ถ€๋ถ„์„ ์–ด๋– ํ•œ ๋ฐฉ์‹์œผ๋กœ

ํ›„ํ‚น ํ•˜๋Š”์ง€ ์ค‘์ ์ ์œผ๋กœ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋“ค์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ข‹์€ ์†Œ์Šค๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ

๊ทธ๋Ÿฌํ•œ ์š”์†Œ๋“ค์„ ์ฐพ์•„๋ณด๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ด์ œ๋ถ€ํ„ฐ API ํ›„ํ‚น์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

1 C๋‚˜ C++, C#๊ณผ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

2 Visual Studio์™€ GCC์™€ ๊ฐ™์€ ์ปดํŒŒ์ผ ๋„๊ตฌ ๋“ฑ

Page 5: Windows API Hooking

ํŽ˜์ด์ง€ 5 / 27

5 Windows API Hooking

2 Prior Knowledge

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ๊ตฌ์ฒด์ ์ธ API ํ›„ํ‚น์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” API ๊ฐ€

๋ฌด์—‡์ธ์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๊ณ  API ํ›„ํ‚น์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

2.1 What is an API?

API ๋ž€ Application Programming Interface ์˜ ์•ฝ์ž๋กœ ๋‹จ์–ด ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ๋ฌด์Šจ ๋œป์ธ์ง€

์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ์šด์˜์ฒด์ œ๊ฐ€ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ์œผ๋กœ

์‘์šฉํ”„๋กœ๊ทธ๋žจ๊ณผ ๋””๋ฐ”์ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด

๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ, ๋น„๋””์˜ค, ์‚ฌ์šด๋“œ ๋“ฑ ์‹œ์Šคํ…œ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋”๋ผ๋„ ์ด๋“ค์—

๋Œ€ํ•ด ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ ์ž์›์€ ์šด์˜์ฒด์ œ๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ณด์•ˆ์ด๋‚˜

ํšจ์œจ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์‚ฌ์šฉ์ž ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ๋ง‰์•„๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ ์ปค๋„์—๊ฒŒ ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ ์ž์›์˜ ์‚ฌ์šฉ์„

์š”์ฒญํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ MS ์ œ๊ณตํ•œ Win32 API ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ API ํ•จ์ˆ˜

์—†์ด๋Š” ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ, ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ, ๋„คํŠธ์›Œํฌ, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ ์‹œ์Šคํ…œ ์ž์›์— ์ ‘๊ทผํ• 

์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜๊ฐ€ ์—†๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์€ 32 ๋น„ํŠธ Windows OS ์˜ ํ”„๋กœ์„ธ์Šค

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ„๋žตํžˆ ๋‚˜ํƒ€๋‚ธ ๊ทธ๋ฆผ์ด๋‹ค.

๊ทธ๋ฆผ 1. User Mode & Kernel Mode

์‹ค์ œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งŽ์€ DLL ์ด ๋กœ๋”ฉ๋œ๋‹ค. ๋ชจ๋“ 

ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ kernel32.dll ์ด ๋กœ๋”ฉ๋˜๋ฉฐ, kernel32.dll ์€ ntdll.dll ์„ ๋กœ๋”ฉํ•œ๋‹ค.

Page 6: Windows API Hooking

ํŽ˜์ด์ง€ 6 / 27

6 Windows API Hooking

๋ฐ”๋กœ ์ด ntdll.dll ์˜ ์—ญํ• ์ด ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋กœ ์š”์ฒญํ•˜๋Š” ์ž‘์—… 3์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ†ตํ•ด ์‹œ์Šคํ…œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

2.2 What is an API Hooking?

API ํ›„ํ‚น์— ๊ด€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ์ „์— ํ›„ํ‚น์— ๋Œ€ํ•˜์—ฌ ๋จผ์ € ์•Œ์•„๋ณด์ž. ํ›„ํ‚น์ด๋ž€ ์ด๋ฏธ

์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ์ฝ”๋“œ์˜ ํŠน์ • ์ง€์ ์„ ๊ฐ€๋กœ์ฑ„์„œ ๋™์ž‘ ๋ฐฉ์‹์— ๋ณ€ํ™”๋ฅผ ์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋ผ ํ•  ์ˆ˜

์žˆ๋‹ค. Hook ์ด๋ผ๋Š” ๋‹จ์–ด ์ž์ฒด๊ฐ€ ๋‚š์‹ฏ๋ฐ”๋Š˜ ๊ฐ™์€ ๊ฐˆ๊ณ ๋ฆฌ ๋ชจ์–‘์„ ๊ฐ€์ง€๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด

๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๋‚š์•„์ฑ„๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ปดํ“จํ„ฐ์—์„œ๋„ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๋‚š์•„์ฑ„๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜

์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด API ๋ฅผ ํ›„ํ‚น ํ•œ๋‹ค๋Š” ๋ง์€ ๋ฌด์Šจ ๋œป์ผ๊นŒ? ๋ฐ”๋กœ Win32 API ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”

์ค‘๊ฐ„์—์„œ ๊ฐ€๋กœ์ฑ„์–ด ์ œ์–ด๊ถŒ์„ ์–ป์–ด๋‚ธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋Š ์‹œ์ ์— ๊ฐ€๋กœ์ฑ„๋Š”์ง€

๊ถ๊ธˆํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. API ํ›„ํ‚น์—๋Š” ๋งŽ์€ ๊ธฐ๋ฒ•์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ถ„๋ฅ˜๊ฐ€ ์ฃผ๋กœ ์–ด๋–ค

๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์–ด๋Š ์ง€์ ์—์„œ ๊ฐ€๋กœ์ฑ„๋Š”์ง€์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜๋˜๋ฏ€๋กœ ์ด์—

๋Œ€ํ•ด์„œ๋Š” ๊ฐ ๋ฐฉ์‹์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ๊ธฐ๋ณธ์ ์ธ ํ›„ํ‚น์˜ ๊ฐœ๋…์€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ

๊ฐ™๋‹ค.

๊ทธ๋ฆผ 2. ์ •์ƒํ˜ธ์ถœ๊ณผ ํ›„ํ‚น๋œ ํ˜ธ์ถœ

์ •์ƒ์ ์ธ ๊ฒฝ์šฐ A ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰๋œ ๋‹ค์Œ์— B ๊ฐ€ ์ง„ํ–‰๋˜์–ด์•ผ ํ•˜์ง€๋งŒ, ํ›„ํ‚น ๋œ ํ˜ธ์ถœ์˜

๊ฒฝ์šฐ A ๋‹จ๊ณ„ ๋‹ค์Œ์— B ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ C ๊ฐ€ ์ง„ํ–‰๋œ ๋’ค B ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. ์ด๋ฅผ

ํ†ตํ•ด A ์˜ ์š”์ฒญ์„ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ํŠน์ •ํ•œ ์กฐ๊ฑด์—๋งŒ B ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์กฐ์ž‘ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์œ„์™€

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ API ๋ฅผ ํ›„ํ‚น ํ•˜๋ฉด ๊ทธ ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๊ณ 

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ฐ์‹œ๋งŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ์ „ํ˜€ ๋‹ค๋ฅธ ๋‚ด์šฉ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ๋” ํ•  ์ˆ˜๋„

์žˆ๋‹ค.

3 ์‹œ์Šคํ…œ ํ˜ธ์ถœ(System Call)๋กœ ์ปค๋„ ์˜์—ญ ํ›„ํ‚น์—์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

Page 7: Windows API Hooking

ํŽ˜์ด์ง€ 7 / 27

7 Windows API Hooking

3 User Mode Hooking

Windows ์—์„œ๋Š” ํฌ๊ฒŒ ์‚ฌ์šฉ์ž ๋ชจ๋“œ(User Mode)์˜ ํ›„ํ‚น๊ณผ ์ปค๋„ ๋ชจ๋“œ(Kernel Mode)์˜

ํ›„ํ‚น์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์–ด๋–ป๊ฒŒ API ํ˜ธ์ถœ์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€,

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ด๋“ค์„ ํ›„ํ‚นํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž.

3.1 IAT Hooking

3.1.1 IAT(Import Address Table)

IAT ํ›„ํ‚น์€ IAT(Import Address Table)๋ฅผ ํ›„ํ‚น ํ•˜๋Š” ๊ฒƒ์œผ๋กœ, IAT ๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ํ•ด๋‹น

ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ์ˆ ํ•œ ํ…Œ์ด๋ธ”์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด Kernel32.dll ์˜ GetDriveType API ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด ํ•ด๋‹น API ๋ฅผ

์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋ฅผ IAT์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ 3. PE View ๋กœ ๋ณธ IAT

IAT ํ›„ํ‚น์€ ๋ฐ”๋กœ ์ด IAT ์—์„œ ํ›„ํ‚นํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ•จ์ˆ˜(์ดํ›„

ํ›„ํ‚น ํ•จ์ˆ˜)๋กœ ๊ต์ฒดํ•˜๊ณ , ํ›„ํ‚น ํ•จ์ˆ˜์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ๋ฆฌํ„ด ๊ฐ’์„ ์กฐ์ž‘ํ•˜๊ณ  ์›๋ž˜ ํ•จ์ˆ˜๋ฅผ

ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ IAT ํ›„ํ‚น์ด๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šฐ๋ฉด์„œ๋„ ์•ˆ์ •์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ›„ํ‚น ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ API๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ƒํ™ฉ์„ ๋ณด์ž.

๊ทธ๋ฆผ 4. Sleep API

Sleep()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  0x43B168 ์ฃผ์†Œ์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ

ํ˜ธ์ถœํ•œ๋‹ค. 0x43B168 ์ฃผ์†Œ๋Š” ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์˜ IAT ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ 0x76AE7990 ์ด๋ผ๋Š”

๊ฐ’์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ์ด์ œ ์ด ๊ฐ’์ด ๋ฐ”๋กœ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋œ Kernel32.dll ์˜

Sleep ํ•จ์ˆ˜์˜ ์ฃผ์†Œ์ด๋‹ค.

Page 8: Windows API Hooking

ํŽ˜์ด์ง€ 8 / 27

8 Windows API Hooking

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ 0x40104F ์—์„œ๋Š” CALL 0x76AE7990 ์ด๋ผ ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๊ณณ์„ ์ฐธ์กฐํ•˜๋Š”

ํ•˜์—ฌ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ์ด๋Š” ์šด์˜์ฒด์ œ ๋ฒ„์ „์ด๋‚˜, ์–ด๋–ค ์–ธ์–ด, ์„œ๋น„์Šค ํŒฉ์ด๋ƒ์—

๋”ฐ๋ผ DLL ์˜ ๋ฒ„์ „์ด ๋‹ค๋ฅด๋ฉฐ, ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ

Sleep() ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Sleep()์˜ ์‹ค์ œ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋ 

์œ„์น˜(0x43B168)๋ฅผ ์ค€๋น„ํ•˜๊ณ  CALL DWORD PTR DS:[43B168]์„ ์ ์–ด๋‘๊ธฐ๋งŒ ํ•œ๋‹ค. ๊ทธ ํ›„

ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ PE Loader๊ฐ€ 0x43B168 ์œ„์น˜์— Sleep() ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

3.2.2 Hook

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฌํ•œ IAT ์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์ง€๋งŒ, ๋Œ€์ฒด ์ด ๋ถ€๋ถ„ ์ค‘ ์–ด๋Š ๊ณณ์„ ํ›„ํ‚น

ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ธ๊ฐ€ ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ Sleep ํ•จ์ˆ˜๋ฅผ ์˜ˆ๋กœ, ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ

Sleep API๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆผ 5. ๋ฉ”๋ชจ๋ฆฌ์—์„œ Sleep API

(A)๋Š” 3.2.1 ์—์„œ ์ด์•ผ๊ธฐํ•œ ๋ฐ”์™€ ๊ฐ™์ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด

๋†“์€ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด ๋†“์€ ์ฃผ์†Œ์— ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉฐ PE ๋กœ๋”๊ฐ€ Sleep ํ•จ์ˆ˜์˜

์ฃผ์†Œ๋ฅผ ์ฑ„์›Œ ๋„ฃ๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ ๋งŒ๋“ค์–ด์ง„ ์ฃผ์†Œ ๊ณต๊ฐ„ 43B168 ์€ RVA ๊ฐ’์ด๋ฉฐ, ์ด์— ํ•ด๋‹นํ•˜๋Š”

ํŒŒ์ผ Offset4์€ 39168์ด๋‹ค. 39168์€ ๋ฐ”๋กœ IAT ์˜ Sleep ํ•จ์ˆ˜๊ฐ€ ์œ„์น˜ํ•œ Offset์ด๋‹ค.

๊ทธ๋ฆผ 6. Sleep API in IAT

๋งŒ์•ฝ (A)์— ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฐ’์ธ 43B168 ์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ง์ ‘

Sleep ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์— IsDebuggerPresent API ์˜ IAT ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด๋ณด์ž. ์ฃผ์†Œ๋Š”

4 RVA๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ ์ƒ๋Œ€์ฃผ์†Œ์ด๋ฉฐ Offset์€ ํŒŒ์ผ์—์„œ์˜ ์œ„์น˜์ด๋‹ค.

Page 9: Windows API Hooking

ํŽ˜์ด์ง€ 9 / 27

9 Windows API Hooking

์œ„ ๊ทธ๋ฆผ์—์„œ์™€ ๊ฐ™์ด Offset 39164 ์ด๋ฏ€๋กœ ์ด๋Š” RVA 43B164 ๊ฐ€ ๋œ๋‹ค. ์ด์ œ ์•„๋ž˜์™€ ๊ฐ™์ด

์ฝ”๋“œ๋ฅผ ํŒจ์น˜ํ•ด๋ณด์ž.

๊ทธ๋ฆผ 7. ์ฝ”๋“œ ํŒจ์น˜

์›๋ž˜ Sleep()์„ ํ˜ธ์ถœํ•˜๋˜ ๋ถ€๋ถ„์— IsDebuggerPresent()์˜ IAT ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด PE ๋กœ๋”๊ฐ€ 0x40104F ์—์„œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์˜

์ฃผ์†Œ๋ฅผ 0x43B164 ์—์„œ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ IsDebuggerPresent()๊ฐ€

์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ฆผ 8. ํ˜ธ์ถœํ•  ํ•จ์ˆ˜ ์ฃผ์†Œ ๋ณ€๊ฒฝ

์ด๋ฅผ ์ •๋ฆฌํ•˜์ž๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” API ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•ด๋‹น ๋ช…๋ น์–ด์—๋Š”

โ€œCALL DWORD PTR DS:[IAT ์— ์กด์žฌํ•˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์˜ RVA]โ€๋กœ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์ด

์‹คํ–‰๋˜๋ฉด์„œ ์‹ค์ œ ์ฃผ์†Œ๊ฐ€ ํ•ด๋‹น DS:[RVA]์— ์˜ฌ๋ผ์˜ค๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด (A)๋ฅผ ํ›„ํ‚น

ํ•˜๊ธฐ ์œ„ํ•ด์„  DS:[HookFunc]๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค..

์ด๋ฒˆ์—๋Š” (B)์˜ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. (A)๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ ์ด์ „ ํŒŒ์ผ์˜ ํ˜•ํƒœ์—์„œ

์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜์˜€์ง€๋งŒ (B)์˜ ๊ฒฝ์šฐ ํŒŒ์ผ์ด ์‹คํ–‰๋˜๋ฉด์„œ 43B168 ์— ์‹ค์ œ Sleep API ์˜ ์ฃผ์†Œ๋ฅผ

๊ฐ€์ง€๊ณ  ์˜จ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ (B) ๋ถ€๋ถ„์€ ํŒŒ์ผ์ด ์•„๋‹Œ ํ”„๋กœ์„ธ์Šค์ผ ๊ฒฝ์šฐ์—๋งŒ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•จ์„ ์•Œ

์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‰ฝ๊ฒŒ DLL Injection ๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ• 

์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฒˆ ๋ฌธ์„œ๋Š” ์ฝ”๋“œ์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ์ตœ๋Œ€ํ•œ ์ œ์™ธํ•˜๊ณ  ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•จ์„

๋ชฉ์ ์œผ๋กœ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ž๋Š” ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผํ•  ๊ฒƒ์ด๋‹ค.

Page 10: Windows API Hooking

ํŽ˜์ด์ง€ 10 / 27

10 Windows API Hooking

๊ทธ๋ฆผ 9. ํ•จ์ˆ˜ ํ˜ธ์ถœ - Debugger

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด Sleep ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ 43B168 ์„ ์ฐธ์กฐํ•˜๋ฉฐ, IsDebuggerPresent

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋Š” 43B164 ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ๋คํ”„ ์˜์—ญ์„ ๋ณด๋ฉด

๊ฐ๊ฐ ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๊ฐ€ PE ๋กœ๋”์— ์˜ํ•ด ์ง€์ •๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Sleep

ํ•จ์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์—๋Š” 76AE7990์ด ์œ„์น˜ํ•˜๋ฉฐ ๋‹ค๋ฅธ ๊ณณ์—๋Š” 76AEB0B0๊ฐ€ ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค.

ํ•ด๋‹น ์ง€์ ์—๋Š” ๊ฐ ํ•จ์ˆ˜์˜ ์‹ค์ œ ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์œ„์น˜๋ฅผ

๋ณ€๊ฒฝํ•˜๋ฉด ํ›„ํ‚น์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ 43B168(Sleep)์— 76AEB0B0 ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ์–ด๋–ป๊ฒŒ

๋ ๊นŒ?

๊ทธ๋ฆผ 10. Sleep ์ด ํ˜ธ์ถœํ•˜๋Š” ์ฃผ์†Œ ๋ณ€๊ฒฝ

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ถ„๋ช… ๋””๋ฒ„๊ฑฐ๋Š” Sleep()์ด๋ผ๊ณ  ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ํ•˜๋‹จ์˜ DS ์—์„œ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์€

KERNEL32.IsDebuggerPresent ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊ฑฐ ๋˜ํ•œ IAT ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์„์—

๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ๊ฒƒ์ž„์„ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ข€ ๋” ์‹ฌํ™” ํ•™์Šต์„ ์ง„ํ–‰ํ•ด๋ณด์ž. ํ”ํžˆ ์ฝ”๋“œ

์ผ€์ด๋ธŒ5(Code Cave)๋ผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์—ฌ๊ธฐ์— ์ ์šฉํ•ด๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์ฝ”๋“œ ์ผ€์ด๋ธŒ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ๋นˆ ๊ณต๊ฐ„์— ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ

์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€ ๋’ค, ์ด ๋ถ€๋ถ„์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ „๊ฐœ๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์˜ˆ์ œ

ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋นˆ ๊ณต๊ฐ„์€ Sleep ์ด ํ˜ธ์ถœ๋˜๋Š” ์œ—๋ถ€๋ถ„์— ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Call

๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด DS:[43B168]์„ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ 43B168 ์€ ์ฝ”๋“œ ์ผ€์ด๋ธŒ์˜ ์œ„์น˜์ธ

401023 ์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. 401023 ์—์„œ Sleep API ์˜ ์ธ์ž๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•ด ์Šคํƒ์—

์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฏ€๋กœ ํ๋ฆ„์„ ๋ฐฉํ•ดํ•œ๋‹ค. ADD ๋ช…๋ น ๋‹ค์Œ์—๋Š” ์›๋ž˜์˜ ๊ธฐ๋Šฅ์„

์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ์ž‘๋˜๊ธฐ ์ด์ „ ๊ฐ’์ธ 76AE7990๋กœ ์ ํ”„๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

5 Inline Patch ๊ธฐ๋ฒ•๊ณผ ์œ ์‚ฌํ•œ ๊ฐœ๋…์œผ๋กœ ์ด๋ฆ„๋งŒ ๋‹ค๋ฅด๊ฒŒ ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

Page 11: Windows API Hooking

ํŽ˜์ด์ง€ 11 / 27

11 Windows API Hooking

๊ทธ๋ฆผ 11. Code Cave ๋ฅผ ์‚ฌ์šฉํ•œ ํ›„ํ‚น

์ด๋ ‡๊ฒŒ ์กฐ์ž‘์„ ํ–ˆ๋Š”๋ฐ ๊ณผ์—ฐ ์ œ๋Œ€๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ• ๊นŒ? ๋‹น์—ฐํžˆ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

์ด์ „ (A)์—์„œ๋Š” IAT ์— ์กด์žฌํ•˜๋Š” ๋‹ค๋ฅธ API ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋งŒ ์ง„ํ–‰ํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ ๊ณผ์ •์—์„œ๋Š”

์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›์€ ๊ฐ’์„

์กฐ์ž‘ํ•˜์—ฌ ํŠน์ •ํ•œ ํ•จ์ˆ˜์˜ ํ๋ฆ„์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋‹ค๋ฅธ ๋ฉด์—๋„ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ• 

์ˆ˜ ์žˆ๋‹ค. (B)์— ์ ์šฉํ•œ ๋ฐฉ์‹์€ (C)์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์„ JMP Hook_Address ๋กœ ์ด๋™ํ•˜์—ฌ

์œ ์‚ฌํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

(C)์˜ ๊ฒฝ์šฐ ์‹ค์ œ ํ•จ์ˆ˜์˜ ๋ช…๋ น์–ด๋“ค์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ถ€๋ถ„์„ ํ›„ํ‚น ํ•˜๊ธฐ

์œ„ํ•ด์„œ๋Š” ๋ช…๋ น์–ด๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ์•ผ ํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์กฐ์ž‘ํ•ด์•ผ ํ• ๊นŒ? (C)์˜ ๋‚ด์šฉ์€ ๋ฐ‘์— ๊ทธ๋ฆผ๊ณผ

๊ฐ™๋‹ค. ์ž์„ธํžˆ ๋ณด๋ฉด ์ƒ๋‹จ์˜ ์„ธ ๋ช…๋ น์–ด์˜ OPCODE ๋Š” ์ด 5 ๋ฐ”์ดํŠธ์ด๋‹ค. ๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์„

์กฐ์ž‘ํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ›„ํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

๊ทธ๋ฆผ 12. (C) ๋‹จ๊ณ„ ์›๋ž˜ ๋ช…๋ น์–ด์™€ ์กฐ์ž‘๋œ ๋ช…๋ น์–ด

Sleep() ํ•จ์ˆ˜์˜ ์›๋ž˜ ์ฃผ์†Œ 7673A6B0 ์˜ ๋ช…๋ น์–ด๋ฅผ JMP ๋ช…๋ น์–ด๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์„ ํ™•์ธํ• 

์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ Sleep()ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉฐ

๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ํ๋ฆ„์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋‹ค. ํ•„์ž๊ฐ€ ์˜๋„ํ•œ ์กฐ์ž‘์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด

Page 12: Windows API Hooking

ํŽ˜์ด์ง€ 12 / 27

12 Windows API Hooking

Sleep() ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ ๋‹ค์Œ, ์›๋ž˜๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๋ณต์›ํ•˜๊ณ  ๋ณต์›๋œ ์ง€์ ์œผ๋กœ

์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆผ 13. ์กฐ์ž‘ ์ฝ”๋“œ

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์กฐ์ž‘ํ•œ ๊ฒƒ์€ ๊ธ€์„ ์ฝ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ดํ•ด๋ฅผ ๋•๊ณ ์ž

์ง„ํ–‰ํ•œ ๊ฒƒ์ด๋‹ค. ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์œผ๋ฉฐ, ํŠนํžˆ 42000E ์—์„œ ์›๋ž˜๋Œ€๋กœ

์ฝ”๋“œ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ถ€๋ถ„์€ VirtualProtect ๋กœ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋Š” ๋“ฑ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ

์ง„ํ–‰ํ•  ๊ฒฝ์šฐ ๋ณต์žกํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋„ฃ์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ C/C++์™€ ๊ฐ™์€

์–ธ์–ด๋กœ ํ›„ํ‚น ํ•จ์ˆ˜๋ฅผ ์ œ์ž‘ํ•  ๋•Œ๋Š” ๋”์šฑ ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•œ ๊ฐ ๋ฐฉ์‹์˜ ์ฐจ์ด์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž. (A)๋ฅผ ํ›„ํ‚น ํ•  ๋•Œ

ํ•ด๋‹น ์ฃผ์†Œ์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์˜€๋Š”๋ฐ, ์ด๋กœ ์ธํ•ด ํ•ด๋‹น ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ์ง€์ ์—์„œ Sleep()์„

ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ์ •์ƒ์ ์ธ Sleep()์ด ํ˜ธ์ถœ๋œ๋‹ค. ๋ฐ˜๋ฉด์— (B)์˜ ๊ฒฝ์šฐ IAT ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” DS ์—

์กด์žฌํ•˜๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์˜€๊ณ , ์ด๋กœ ์ธํ•ด Sleep() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๊ณณ์ด ์กฐ์ž‘๋œ DS ๋ฅผ

๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ (B)์˜ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์—์„œ Sleep() ํ•จ์ˆ˜๋Š” ํ›„ํ‚น ๋œ ์ฝ”๋“œ

์ผ€์ด๋ธŒ๋ฅผ ์ง€๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ (C) ๋˜ํ•œ ์‹ค์ œ Sleep() ํ•จ์ˆ˜์˜ ๋ถ€๋ถ„์„ JMP ๋ช…๋ น์–ด๋กœ

์กฐ์ž‘ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ๋ชจ๋“  Sleep() ํ•จ์ˆ˜๊ฐ€ ํ›„ํ‚น๋œ ๊ฒƒ์ด๋‹ค.

ํŠนํžˆ (C)์˜ ๋ฐฉ์‹์€ Ntdll.dll ์˜ ํ•จ์ˆ˜๋„ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์‹ค์ œ

Ntdll.ZwDelayExecution ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ถ€๋ถ„์˜ ์‹ค์ œ ์ฝ”๋“œ์˜ 5

๋ฐ”์ดํŠธ๋ฅผ JMP ๋ช…๋ น์–ด๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ํ›„ํ‚น์„ ์ง„ํ–‰ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ฆผ 14. Ntdll.dll ์˜ API

๋‹จ, ์ด๋Ÿฌํ•œ IAT ํ›„ํ‚น์˜ ๊ฒฝ์šฐ, ํ›„ํ‚น ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ IAT ์— ์กด์žฌํ•ด์•ผ๋งŒ6 ํ›„ํ‚นํ•  ์ˆ˜

์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ ์œผ๋กœ API ๋ฅผ ๋กœ๋“œ(์˜ˆ๋กœ, GetProcAddress API ๋“ฑ์„ ํ†ตํ•ด)ํ•˜๋Š” ๊ฒฝ์šฐ IAT๋ฅผ

์ฐธ์กฐํ•˜์ง€ ์•Š์•„ IAT ํ›„ํ‚น์„ ์‚ฌ์šฉํ•  ์—†๋‹ค. ๋˜ํ•œ IAT ๋Š” ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๊ฐ๊ฐ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—

a.exe์˜ IAT๋ฅผ ํ›„ํ‚นํ•˜์˜€๋‹ค๊ณ  b.exe๊นŒ์ง€ ํ›„ํ‚น ๋œ ๊ฒƒ์ด ์•„๋‹˜์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

6 (C)๋ฐฉ์‹์˜ Ntdll ํ›„ํ‚น์€ IAT์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„ Detours ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Page 13: Windows API Hooking

ํŽ˜์ด์ง€ 13 / 27

13 Windows API Hooking

3.2 Message Hooking

์œˆ๋„์šฐ ์šด์˜์ฒด์ œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ GUI ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ณ , ์‚ฌ์šฉ์ž๋Š” ์ œ๊ณต๋ฐ›์€ GUI ๋ฅผ

์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์ด๊ฑฐ๋‚˜ ํด๋ฆญ,

๋˜๋Š” ํ‚ค๋ณด๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋™์ž‘์€ ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ๊ฐ€ Event Driven

๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ์ด๋ฒคํŠธ๋กœ ๋ฐœ์ƒ์‹œ์ผœ ์šด์˜์ฒด์ œ๊ฐ€ ๊ทธ

์ด๋ฒคํŠธ์— ๋งž๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด๋‹น ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ „๋‹ฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋ฉ”์‹œ์ง€ ํ›„ํ‚น์ด ์–ด๋–ค ์ง€์ ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ํ–‰์œ„๋ฅผ ํ–ˆ์„ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜๊ณ , ์ด๋ฒคํŠธ ๋ฐœ์ƒ์œผ๋กœ ์ธํ•ด OS ์—์„œ

์‘์šฉํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณด๋‚ผ ๋ฉ”์‹œ์ง€๋“ค์ด OS Message Queue ์— ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด WM_KEYDOWN ๋ฉ”์‹œ์ง€๊ฐ€ OS Message Queue ์—

์ถ”๊ฐ€๋œ๋‹ค. ์šด์˜์ฒด์ œ๋Š” ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์–ด๋Š ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํŒŒ์•…ํ•œ ๋‹ค์Œ,

ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊บผ๋‚ด์–ด ํ•ด๋‹น ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”์‹œ์ง€ ํ์— ์ „๋‹ฌํ•œ๋‹ค. ํ•ด๋‹น

์‘์šฉํ”„๋กœ๊ทธ๋žจ์€ ์ž์‹ ์˜ Application Message Queue ์— WM_KEYDOWN ๋ฉ”์‹œ์ง€๊ฐ€ ์ถ”๊ฐ€๋œ

๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์œˆ๋„์šฐ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ

์ „๋‹ฌํ•œ๋‹ค.

๊ทธ๋ฆผ 15. ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹

์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค์€ ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์—์„œ ์ด๋Ÿฌํ•œ ๋ฉ”์‹œ์ง€ ํ›…๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ

์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ”๋กœ SetWindowsHookEx API ๊ฐ€ ๊ทธ ์ฃผ์ธ๊ณต์œผ๋กœ ํ›… ์ฒด์ธ์—

์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์ •์˜ํ•œ ํ›„ํฌ ํ”„๋กœ์‹œ์ €๋ฅผ ์„ค์น˜ํ•˜๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ํŠน์ • ์œ ํ˜•์˜

์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

Page 14: Windows API Hooking

ํŽ˜์ด์ง€ 14 / 27

14 Windows API Hooking

HHOOK WINAPI SetWindowsHookEx(

_In_ int idHook // ํ›… ์ข…๋ฅ˜

_In_ HOOKPROC lpfn, // ์ง€์ •ํ•œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ์‹œ์ € ์ฃผ์†Œ

_In_ HINSTANCE hMod, // lpfn ์ด ์žˆ๋Š” DLL์˜ ํ•ธ๋“ค

_In_ DWORD dwThreadId

);

๊ทธ๋ฆผ 16. SetWindowsHookEx API

๋งŒ์•ฝ ํ•ด๋‹น API ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” HookKey.dll ์ด ์กด์žฌํ•˜๋ฉฐ ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ

HookMain.exe ๋ฅผ ์ œ์ž‘ํ•˜์˜€๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. HookMain.exe ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด HookKey.dll ์ด

ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์— ๋กœ๋“œ๋˜๋ฉฐ SetWindowsHookEx()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฉ”์‹œ์ง€ ํ›„ํ‚น์ด ๊ฑธ๋ฆฐ

์ƒํƒœ์—์„œ, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋ฉด HookKey.dll ์€ ๊ทธ

ํ”„๋กœ์„ธ์Šค์—์„œ๋„ ๋กœ๋”ฉ์ด ๋œ๋‹ค.

๊ทธ๋ฆผ 17. DLL Injection

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์‹œ ๋งํ•ด ํ›„ํ‚น ๋œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“ 

ํ”„๋กœ์„ธ์Šค์— DLL ์ธ์ ์…˜์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ํ›„ํ‚นํ•  ์ˆ˜

์žˆ์œผ๋ฉฐ, ์ด๋Š” DLL ์ธ์ ์…˜์˜ ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Page 15: Windows API Hooking

ํŽ˜์ด์ง€ 15 / 27

15 Windows API Hooking

4 Kernel Mode Hooking

3 ์žฅ์—์„œ๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ ํ›„ํ‚น์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์•˜๋‹ค๋ฉด ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์ปค๋„ ๋ชจ๋“œ

ํ›„ํ‚น์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ์ปค๋„ ๋ชจ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ํ›„ํ‚น์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ JMP

๋ช…๋ น์–ด๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŠน์ •ํ•œ ๊ตฌ์กฐ์ฒด์— ํฌํ•จ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ ์ž‘์—…์„

์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๋ž˜๋„ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์˜ ํ›„ํ‚น๋ณด๋‹ค ๋ณต์žกํ•˜๋‹ค. ์ด์ œ ์ด๋Ÿฌํ•œ ์ปค๋„

๋ชจ๋“œ ํ›„ํ‚น์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž.

4.1 System Call

์šด์˜์ฒด์ œ๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ(Ring 3)์™€ ์ปค๋„ ๋ชจ๋“œ(Ring 0)๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ๊ถŒํ•œ์ด

์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌ๋˜๋Š” ์ด์œ ๋Š” ๋‹ค์–‘ํ•˜์ง€๋งŒ, ์•„๋ฌด๋ž˜๋„ ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ์  ๋˜ํ•œ

๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ์–ด๋– ํ•œ ํ”„๋กœ์„ธ์Šค๋“ ์ง€ ์šด์˜์ฒด์ œ์˜ ํ•ต์‹ฌ

๊ธฐ๋Šฅ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฏ€๋กœ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ทธ๋ ‡๊ธฐ์—

์ปค๋„ ๋ชจ๋“œ์—์„œ๋Š” ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋Š”

์กฐ์ž‘ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์ปค๋„ ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””์Šคํฌ์˜ ๋‚ด์šฉ์„ ์ฝ์„

์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋˜๊ณ  ๊ทธ ์™ธ์—๋„ ํ•˜๋“œ์›จ์–ด๋‚˜ ํ”„๋กœ์„ธ์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด

์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ์ œ์ž‘ํ•œ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ํ”„๋กœ์„ธ์Šค๋‚˜ ๋””์Šคํฌ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„

์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋Š” ๋ฐ”๋กœ ์‹œ์Šคํ…œ ํ˜ธ์ถœ(System Call)์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์˜

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„ ์˜์—ญ์— ์ ‘๊ทผ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ฆผ 18. System Call ๊ณผ์ •

Page 16: Windows API Hooking

ํŽ˜์ด์ง€ 16 / 27

16 Windows API Hooking

์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด Kernel32.dll ์˜ API ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น API ๋Š”

Ntdll.dll ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜ธ์ถœ๋œ Ntdll.dll ์€ ์ž์‹ ์ด ์ปค๋„์— ์š”์ฒญํ•ด์•ผ ํ• 

์„œ๋น„์Šค ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ง„ํ–‰ํ•˜๋ฉฐ ์ด ๊ณผ์ •์ด ๋ฐ”๋กœ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์ปค๋„์—๊ฒŒ

์‹œ์Šคํ…œ ์ž์› ์ ‘๊ทผ์„ ์š”์ฒญํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ด๋•Œ ์ง€์ •ํ•œ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด EAX ์—

์›ํ•˜๋Š” ์„œ๋น„์Šค ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ  EDX ์—๋Š” ์ด ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋  ์ธ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”

ํฌ์ธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ํ†ตํ•ด ์ปค๋„์—์„œ๋Š” ์–ด๋– ํ•œ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•œ์ง€, ์–ด๋– ํ•œ

์ธ์ž๋ฅผ ๋„˜๊ฒจ์ฃผ์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

System Call ์€ โ€œINT 0x2Eโ€์™€ โ€œSYSENTERโ€ ๋‘ ๊ฐ€์ง€ ๋ช…๋ น์–ด๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค. ์ด๋ ‡๊ฒŒ

๋‚˜๋ˆ„์–ด์ง€๋Š” ๊ธฐ์ค€์€ ๋ฐ”๋กœ Windows XP ์ด์ „๊ณผ ์ดํ›„๋กœ, ์ด์ „์—๋Š” INT 0x2E ๋ฅผ

์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ, XP ๋ถ€ํ„ฐ๋Š” SYSENTER ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. INT 0x2E ์˜ ๊ฒฝ์šฐ ์ƒ๋Œ€์ ์œผ๋กœ ๋ฌด๊ฑฐ์šด

์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ํด๋Ÿญ ์ˆ˜๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด

SYSENTER ๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด ์™ธ์— ์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ํ›„ํ‚น ๊ณผ์ •์—์„œ๋„ ์ฐจ์ด์ ์„

๊ฐ€์ง€๋ฏ€๋กœ ์ด์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž.

๊ทธ๋ฆผ 19. INT 0x2E ์™€ SYSENTER

์šฐ์„  INT 0x2E ์˜ ๊ฒฝ์šฐ IDT(Interrupt Descriptor Table)์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฐ”๋กœ System

Service Dispatch(KiSystemService)๋กœ ๊ฐ„๋‹ค. ํ•˜์ง€๋งŒ SYSENTER ๋Š” SYSENTER_EIP(MSR)๋ฅผ

์ฐธ์กฐํ•˜์—ฌ KiFastCallEntry ๋กœ ์ง„ํ–‰ํ•œ ๋‹ค์Œ KiSystemService ๋กœ ๊ฐ„๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ INT

0x2E ์˜ ๊ฒฝ์šฐ IRET ๋ผ๋Š” ๋ช…๋ น์–ด๋กœ ์ปค๋„ ๋ชจ๋“œ์—์„œ ๋‹ค์‹œ ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋กœ ๋ณต๊ท€ํ•˜๊ณ ,

SYSENTER ์˜ ๊ฒฝ์šฐ SYSEXIT ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋กœ ๋ณต๊ท€ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ณ„๋กœ

์ค‘์š”ํ•˜๊ฒŒ ๋Š๊ปด์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ›„ํ‚น์„ ์ง„ํ–‰ํ•  ๋•Œ ๋‘ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ํ›„ํ‚น ์ง€์ ์ด

๋‹ฌ๋ผ์ง„๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ํ›„ํ‚น ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ”๋กœ ๋’ค์—์„œ ์•Œ์•„๋ณด์ž.

4.2 INT 0x2E Hooking

INT 0x2E ๋Š” ์ธํ„ฐ๋ŸฝํŠธ 0x2E ๋กœ IDT ์— ์ •์˜๋œ ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด(ISR)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ IDT ๋Š” 256 ๊ฐœ์˜ Entry ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด๋กœ ์—”ํŠธ๋ฆฌ ํ•˜๋‚˜๋‹น ํ•˜๋‚˜์˜ ์ธํ„ฐ๋ŸฝํŠธ์—

Page 17: Windows API Hooking

ํŽ˜์ด์ง€ 17 / 27

17 Windows API Hooking

๋Œ€์‘ํ•˜๋ฉฐ ๊ฐ ์ธํ„ฐ๋ŸฝํŠธ๋Š” IDT ๋กœ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜์˜ ์ฃผ์†Œ(ISR)์„ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ๊ฐ

์—”ํŠธ๋ฆฌ์—๋Š” ์ง€์ •๋œ ๊ฐ’์ด ๋‹ด๊ฒจ ์žˆ์œผ๋ฉฐ WinDBG7๋กœ ํ™•์ธํ–ˆ์„ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์Šต์„ ๋ณผ

์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ INT 0x2E ์˜ ๊ฒฝ์šฐ IDT ์—์„œ ๋ฐ”๋กœ KiSystemService ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„

ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kd> !idt

Dumping IDT: 8003f400

โ€ฆ(skip)

2e: 8053f481 nt!KiSystemService

37: 806d3728 hal!PicSpuriousService37

3d: 806d4b70 hal!HalpApcInterrupt

41: 806d49cc hal!HalpDispatchInterrupt

50: 806d3800 hal!HalpApicRebootService

โ€ฆ(skip)

๊ทธ๋ฆผ 20. IDT ๊ตฌ์กฐ

์ด ๊ณผ์ •์„ ์š”์•ฝํ•˜๋ฉด, XP ์ด์ „ ๋ฒ„์ „์—๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด API ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด Ntdll.dll ์˜

Zw*, Nt* ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ตญ INT 0x2E ๋ฅผ ํ†ตํ•ด ์šด์˜์ฒด์ œ์—๊ฒŒ

์ปค๋„ ๋ชจ๋“œ ์ž‘์—…์„ ์š”์ฒญํ•œ๋‹ค. ์ด๋•Œ INT 0x2E ๊ฐ€ IDT ์—์„œ KiSystemService ์˜ ์ฃผ์†Œ๋ฅผ

์ฐธ์กฐํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ํ›„ํ‚น ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋ฐ”๋กœ IDT8์ด๋‹ค. IDT ๊ฐ€

๊ฐ€๋ฆฌํ‚ค๋Š” 2E ์˜ ์ฃผ์†Œ๋กœ ๊ฐ€๋ณด๋ฉด ์‹ค์ œ๋กœ KiSystemSerive ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•„๋ž˜์™€

๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

nt!KiSystemService:

8053f481 6a00 push 0

8053f483 55 push ebp

8053f484 53 push ebx

8053f485 56 push esi

8053f486 57 push edi

8053f487 0fa0 push fs

8053f489 bb30000000 mov ebx,30h

๊ทธ๋ฆผ 21. INT 0x2E ์˜ ISR(KiSystemService)

7 ์ปค๋„ ๋””๋ฒ„๊น…์ด๋ฏ€๋กœ ์œ ์ € ๋ชจ๋“œ ๋””๋ฒ„๊น…์œผ๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด WinDBG๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

8 INT 0x2E Hooking์€ ๊ฒฐ๊ตญ IDT๋ฅผ ํ›„ํ‚น ํ•˜๋Š” ๊ฒƒ์œผ๋กœ IDT Hooking์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

Page 18: Windows API Hooking

ํŽ˜์ด์ง€ 18 / 27

18 Windows API Hooking

IDT ๋ฅผ ํ›„ํ‚น ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ์„  IDT ์˜ ์ฃผ์†Œ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, IDTR ๋ ˆ์ง€์Šคํ„ฐ์— IDT ์˜

Base Address์™€ IDT์˜ ํฌ๊ธฐ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. WinDBG๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ IDTR

๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’(์ฃผ์†Œ)๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ โ€œ!idtโ€๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ฃผ์†Œ9๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. IDT ์˜

Entry ๊ตฌ์กฐ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 8 ๋ฐ”์ดํŠธ์”ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ Entry ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š”

ISR์˜ ์ฃผ์†Œ๊ฐ€ ํ•˜์œ„ 2๋ฐ”์ดํŠธ, ์ƒ์œ„ ์ฃผ์†Œ 2๋ฐ”์ดํŠธ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.

kd> r idtr

idtr=8003f400

kd> !idt

Dumping IDT: 8003f400

kd> dt _KIDTENTRY

ntdll!_KIDTENTRY

+0x000 Offset : Uint2B // ํ•˜์œ„ ์˜คํ”„์…‹

+0x002 Selector : Uint2B

+0x004 Access : Uint2B

+0x006 ExtendedOffset : Uint2B // ์ƒ์œ„ ์˜คํ”„์…‹

๊ทธ๋ฆผ 22. IDT ์ฃผ์†Œ์™€ ๊ฐ ์—”ํŠธ๋ฆฌ ๊ตฌ์กฐ

ํ•˜๋‚˜์˜ ์—”ํŠธ๋ฆฌ๊ฐ€ 8 ๋ฐ”์ดํŠธ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€

์ฐพ๊ณ ์ž ํ•˜๋Š” ์—”ํŠธ๋ฆฌ๋Š” 0x2E ๋ฒˆ์งธ ์—”ํŠธ๋ฆฌ์ด๋ฏ€๋กœ IDT Base Address ์— 0x170 ์„ ๋”ํ•œ

์œ„์น˜์— ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. ์•„๋ž˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™์ด 8003f570 ๋ถ€ํ„ฐ ํ•ด๋‹น ์—”ํŠธ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค.

ํ•˜์œ„ 2 ๋ฐ”์ดํŠธ์™€ ์ƒ์œ„ 2 ๋ฐ”์ดํŠธ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ INT 0x2E ์˜ ISR ์€ 8053f481 ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ

์ˆ˜ ์žˆ๋‹ค.

kd> db 8003f400 8003fC00

8003f400 9c 01 08 00 00 8e 54 80-14 03 08 00 00 8e 54 80 ......T.......T.

8003f410 3e 11 58 00 00 85 00 00-e4 06 08 00 00 ee 54 80 >.X...........T.

โ€ฆ(skip)

8003f560 80 fc 08 00 00 ee 53 80 - c0 05 08 00 00 ee 54 80 ......S.......T.

8003f570 81 f4 08 00 00 ee 53 80-80 27 08 00 00 8e 54 80 ......S..'....T.

โ€ฆ(skip)

๊ทธ๋ฆผ 23. IDT 0x2E ๋ฒˆ์งธ Entry

9 Assembly์˜ ๊ฒฝ์šฐ โ€œsidtโ€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ IDT์˜ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Page 19: Windows API Hooking

ํŽ˜์ด์ง€ 19 / 27

19 Windows API Hooking

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์ฃผ์†Œ(8003f570)๋ฅผ ํ›„ํ‚น ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•˜์œผ๋‹ˆ, ๋ณธ๊ฒฉ์ ์ธ ํ›„ํ‚น์„

์ง„ํ–‰ํ•ด๋ณด์ž. ์ด๋ฒˆ ํ›„ํ‚น ์—ญ์‹œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ

์œ„ํ•ด ์ปค๋„ ๋””๋ฒ„๊ฑฐ WinDBG ๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น 0x2E ์˜ ISR ์„ FFFFFFFF ๋กœ

์กฐ์ž‘ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ โ€œ0000โ€์œผ๋กœ ์ฑ„์šด ๊ณณ์€ ์˜คํ”„์…‹์ด ์•„๋‹Œ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ๋ถ„์„ ์œ„ํ•ด โ€œ0โ€์œผ๋กœ

์ฑ„์šด ๊ฒƒ์ด๋‹ค.

kd> !idt 2e // ๊ธฐ์กด 2E์˜ ISR ํ™•์ธ

2e: 8053f481 nt!KiSystemService

kd> ed 8003f570 // Windbg๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ˆ˜์ •

8003f570 0008f481 0000ffff

8003f574 0000ffff ffff0000

kd> !idt 2e // ์กฐ์ž‘๋œ 2E์˜ ISR ํ™•์ธ

2e: ffffffff

kd> db 8003f570 8003f580 // ์กฐ์ž‘๋œ IDT 2E Entry ํ™•์ธ

8003f570 ff ff 00 00 00 00 ff ff-80 27 08 00 00 8e 54 80 .........'....T.

๊ทธ๋ฆผ 24. IDT Entry 0x2E ํ›„ํ‚น

์ด์ฒ˜๋Ÿผ IDT ๊ฐ€ ํ›„ํ‚น ๋œ ์ƒํ™ฉ์—์„œ INT 0x2E ๋ฅผ ํ†ตํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ(System Call)์ด

๋ฐœ์ƒํ•˜๋ฉด ์‚ฌ์šฉ์ž ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ํ›„ํ‚น๋œ ์ฃผ์†Œ๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ

ํ›„ํ‚น๋„ ์ด์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ, ๋Œ€์‹  IDT ์˜ ์ฃผ์†Œ๋ฅผ ์–ป์„ ๋•Œ โ€œsidtโ€ ๋ช…๋ น์–ด๋ฅผ

์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์†Œ๋ฅผ ์–ป๋Š”๋‹ค. Sidt ๋ช…๋ น์–ด๋Š” IDT ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” IDTR ๋ ˆ์ง€์Šคํ„ฐ์˜

๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๊ฐ’์„ ์–ป์–ด ์˜จ๋‹ค. ๋˜ํ•œ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„

ํ†ตํ•ด ์ˆ˜์ •ํ•˜๊ณ ์ž ํ•  ๋•Œ, ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”(โ€œCLIโ€ ๋ช…๋ น์–ด)ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ›„ํ‚น์ด

์™„๋ฃŒ๋˜๋ฉด ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋‹ค์‹œ ํ™œ์„ฑํ™”(โ€œSTIโ€ ๋ช…๋ น์–ด) ์‹œ์ผœ ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™๋˜๊ฒŒ๋” ํ•ด์•ผ ํ•œ๋‹ค.

4.3 SYSENTER Hooking

์œˆ๋„์šฐ XP ์ด์ƒ์˜ ๋ฒ„์ „์—์„œ๋Š” INT 0x2E ๊ฐ€ ์•„๋‹Œ SYSENTER ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์‹œ์Šคํ…œ

ํ˜ธ์ถœ์ด ์š”์ฒญ๋˜๋ฉด NTDLL ์€ EAX ๋ ˆ์ง€์Šคํ„ฐ์— ํ•ด๋‹น ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ณ  EDX

๋ ˆ์ง€์Šคํ„ฐ์—๋Š” ์ธ์ž๋กœ ์‚ฌ์šฉ๋  ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  SYSENTER ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ปค๋„

์˜์—ญ์œผ๋กœ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ๋ฐ”๋กœ ์ปค๋„๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰๋  ์ปค๋„์˜

์ฃผ์†Œ(KiFastCallEntry)๋ฅผ SYSENTER_EIP(MSR 0x176 ๋ ˆ์ง€์Šคํ„ฐ)์—์„œ ์ฐธ์กฐํ•˜์—ฌ KiFastCallEntry

๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

MSR ์€ Model-Specific Register ๋กœ ๋””๋ฒ„๊น…์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ถ”์ , ์ปดํ“จํ„ฐ ์„ฑ๋Šฅ

๋ชจ๋‹ˆํ„ฐ๋ง, ํŠน์ • CPU ๊ธฐ๋Šฅ ์ „ํ™˜์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ข… ์ œ์–ด ๋ ˆ์ง€์Šคํ„ฐ x86 ๋ช…๋ น์–ด์˜ ์ง‘ํ•ฉ์ด๋‹ค.

Page 20: Windows API Hooking

ํŽ˜์ด์ง€ 20 / 27

20 Windows API Hooking

์ด๋Ÿฌํ•œ ์ง‘ํ•ฉ ์ค‘ MSR 0x176 ์—๋Š” IA_SYSENTER_EIP(KiFastCallEntry)๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,

MSR ์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” โ€œrdmsrโ€, โ€œwrmsrโ€ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€

์ฐพ์•„์•ผ ํ•  ๊ฒƒ์€ MSR 0x176์ด๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

kd> rdmsr 176

msr[176] = 00000000`8053f540

kd> u 8053f540

nt!KiFastCallEntry:

8053f540 b923000000 mov ecx,23h

8053f545 6a30 push 30h

โ€ฆ(skip)

๊ทธ๋ฆผ 25. Read MSR 0x176

MSR 0x176์ด ์ œ๋Œ€๋กœ KiFastCallEntry๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ”๋กœ ์ด

๋ถ€๋ถ„์˜ ๊ฐ’์„ ๋ฐ”๊พธ์–ด SYSENTER ๋ฅผ ํ›„ํ‚น10 ํ•  ์ˆ˜ ์žˆ๋‹ค. MSR ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ๋Š” rdmsr

๋ช…๋ น์–ด๋กœ ์ฝ์—ˆ๋‹ค๋ฉด, MSR ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” โ€œwrmsrโ€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

kd> wrmsr 176 11111111 // MSR 0x176์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ

kd> rdmsr 176 // MSR 0x176 ๊ฐ’ ๋ณ€๊ฒฝ ํ™•์ธ

msr[176] = 00000000`11111111

๊ทธ๋ฆผ 26. Write MSR 0x176

์‹ค์ œ๋กœ ์œ„์™€ ๊ฐ™์ด ์˜ณ์ง€ ์•Š์€ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹น์—ฐํžˆ ๋ธ”๋ฃจ ์Šคํฌ๋ฆฐ์„ ๋งž์ดํ•  ์ˆ˜ ์žˆ์„

๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด abexโ€™sCrackMe01.exe ๋ฅผ ๊ฐ€์ง€๊ณ  ์ง์ ‘ ์ฝ”๋“œ์˜ ํ๋ฆ„์„ ์กฐ์ž‘ํ•˜์—ฌ ๋ณด์ž.

์šฐ์„  ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์ธ ํ๋ฆ„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. Ntdll.dll ์˜ ํ•จ์ˆ˜๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋“ค์–ด๊ฐ€๋ณด๋ฉด

KiFastSystemCall ์ด๋ผ๋Š” ๋ถ€๋ถ„์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋Š” SYSENTER ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด

KiFastCallEntry ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ๋ถ€๋ถ„์ด๋‹ค. KiFastSystemCall ์—๋Š” SYSENTER ๋ช…๋ น์–ด๊ฐ€

์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ntdll!KiFastSystemCall:

001b:7c93e4f0 8bd4 mov edx,esp

001b:7c93e4f2 0f34 sysenter

10 SYSENTER Hooking์€ ๊ฒฐ๊ตญ MSR์„ ํ›„ํ‚น ํ•˜๋ฏ€๋กœ MSR Hooking์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

Page 21: Windows API Hooking

ํŽ˜์ด์ง€ 21 / 27

21 Windows API Hooking

kd> rdmsr 176 // MSR 0x176์˜ ์ฃผ์†Œ๋ฅผ ํ™•์ธ

msr[176] = 00000000`8053f540

kd> bp 8053f540 // MSR 0x176์˜ ์ฃผ์†Œ์— BP ์„ค์ •

kd> p // Kernel์˜ KiFastCallEntry ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง„์ž…

Breakpoint 3 hit

nt!KiFastCallEntry:

8053f540 b923000000 mov ecx,23h

๊ทธ๋ฆผ 27. ์ •์ƒ์ ์ธ SYSENTER ์ง„์ž…

์ •์ƒ์ ์ธ SYSENTER ์˜ ํ๋ฆ„์„ wrmsr ์„ ํ†ตํ•ด ์กฐ์ž‘ํ•ด๋ณด์ž. MSR 0x176 ๋ฅผ 11111111

๋กœ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ ๋น„์ •์ƒ์ ์ธ ํ๋ฆ„์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ „๊ณผ ๊ฐ™์ด

SYSENTER ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์›๋ž˜ MSR 0x176(KiFastCallEntry)์˜ ์ฃผ์†Œ์— BP ๋ฅผ

์„ค์ •ํ•œ ๋‹ค์Œ ์ง„ํ–‰์„ ํ•ด๋ณด์ž. ์ •์ƒ์ ์ธ ํ๋ฆ„์ด๋ผ๋ฉด KiFastCallEntry ์—์„œ ๋ฉˆ์ถ”์–ด์•ผ ํ•˜์ง€๋งŒ,

์กฐ์ž‘๋œ MSR 0x176์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ 11111111๋กœ ํ๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ๋‹ค.

ntdll!KiFastSystemCall:

001b:7c93e4f0 8bd4 mov edx,esp

001b:7c93e4f2 0f34 sysenter

kd> bp 8053f540 // ๊ธฐ์กด KiFastCallEntry์— BP ์„ค์ •

kd> wrmsr 176 11111111 // MSR 0x176 ์ฃผ์†Œ ์กฐ์ž‘

kd> p // ์กฐ์ž‘ํ•œ ์ฃผ์†Œ๋กœ ์ด๋™

Access violation - code c0000005 (!!! second chance !!!)

11111111 ?? ???

๊ทธ๋ฆผ 28. ํ›„ํ‚น ๋œ SYSENTER ์ง„์ž…

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด SYSENTER Hooking(๋˜๋Š” MSR Hooking)์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

์‹ค์ œ 11111111 ์— ํ›„ํ‚น ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ›„ํ‚น ํ•จ์ˆ˜๋ฅผ

์ง€๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค. ๊ณต๊ฒฉ์ž์˜ ์ž…์žฅ์—์„œ ์ด๋Ÿฌํ•œ System Call Hooking์„ ์ง„ํ–‰ํ•˜๋ฉฐ ํ›„ํ‚น ํ•จ์ˆ˜์—

๊ณผ๋„ํ•œ ์กฐ๊ฑด์„ ๊ฑธ์–ด๋†“๋Š”๋‹ค๋ฉด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ•˜๋ฝํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜

์žˆ์„ ๊ฒƒ์ด๋‹ค.

Page 22: Windows API Hooking

ํŽ˜์ด์ง€ 22 / 27

22 Windows API Hooking

4.4 SSDT Hooking

SSDT(System Service Dispatch Table)๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์š”์ฒญํ•œ ๋’ค, ์ „๋‹ฌ๋˜๋Š” ์„œ๋น„์Šค

๋ฒˆํ˜ธ์— ๋งž๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ๋•Œ ์ฐธ์กฐํ•œ๋‹ค. ์œ„ ๊ณผ์ •์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์š”์ฒญํ•˜๋Š” ๋‘ ๊ฐ€์ง€

๋ช…๋ น์–ด(INT 0x2E ์™€ SYSENTER)์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ, ๊ฒฐ๊ตญ ๋‘ ๋ช…๋ น์–ด ๋ชจ๋‘

KiSystemService(System Service Dispatcher)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•˜์˜€๋‹ค.

KiSystemService ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ EAX ์—๋Š” ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์š”์ฒญํ•œ ์„œ๋น„์Šค ๋ฒˆํ˜ธ๊ฐ€

์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ, EDX์—๋Š” ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค์— ์‚ฌ์šฉ๋  ์ธ์ž๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ

ํ˜ธ์ถœ ๋ฒˆํ˜ธ(EAX)์— ๋งž๊ฒŒ KeServiceDescriptorTalbe ์—์„œ Native API ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜จ๋‹ค.

๊ทธ ํ›„ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์‹œ ์‚ฌ์šฉ์ž ๋ชจ๋“œ๋กœ ๋ณต๊ท€ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๊ณผ์ •์€

์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 29. ์ „์ฒด์ ์ธ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ณผ์ •

๊ฒฐ๊ตญ SSDT(KiServiceTable)์—์„œ ์„œ๋น„์Šค ํ˜ธ์ถœ ๋ฒˆํ˜ธ์— ๋งž๋Š” ์ฃผ์†Œ๋ฅผ ์–ป์€ ๋‹ค์Œ ์ด๋ฅผ

ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด SSDT Hooking ์€ ์–ด๋Š ๋ถ€๋ถ„์„ ํ›„ํ‚นํ•ด์•ผ

ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ์œ„ ๊ทธ๋ฆผ์˜ ๊ณผ์ •์—์„œ ์„ค๋ช…ํ•˜์ž๋ฉด ๋ฐ”๋กœ GetFuncAddress ๊ณผ์ •์—์„œ

ํ›„ํ‚นํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. SYSENTER ๋ฅผ ํ†ตํ•ด KiFastCallEntry ๋กœ ์ง„์ž…ํ•œ ํ›„ ์„œ๋น„์Šค ๋ฒˆํ˜ธ์—

Page 23: Windows API Hooking

ํŽ˜์ด์ง€ 23 / 27

23 Windows API Hooking

๋งž๋Š” ์„œ๋น„์Šค ๋ฃจํ‹ด์„ SSDT ์—์„œ ์–ป์–ด์˜จ๋‹ค. ๋”ฐ๋ผ์„œ SSDT ์— ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฐ ์„œ๋น„์Šค

๋ฃจํ‹ด์˜ ์ฃผ์†Œ๋ฅผ ์กฐ์ž‘ํ•˜๋ฏ€๋กœ ํ›„ํ‚น์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 30. SSDT Hooking ๊ณผ์ •

ํ•ด๋‹น ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์„œ๋น„์Šค ๋ฃจํ‹ด์„ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ณผ์ •์—์„œ SSDT ๋ฅผ ์ฐธ์กฐํ•˜๋Š”๋ฐ,

SSDT ์˜ ํ•ด๋‹น ๋ฒˆํ˜ธ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Œ๋ฅผ ํ›„ํ‚นํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ๋ฆ„์œผ๋กœ ์กฐ์ž‘ํ•  ์ˆ˜

์žˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ์„ ์˜ˆ๋กœ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์š”์ฒญ๋˜์—ˆ์„ ๋•Œ ์„œ๋น„์Šค ๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š”

EAX ์˜ ๊ฐ’์ด 0xAD ๋ผ๋ฉด SSDT ์—์„œ 0xAD ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์„œ๋น„์Šค ๋ฃจํ‹ด์˜ ์ฃผ์†Œ

0xCCCCCCCC ๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด ์ด๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๊ณต๊ฒฉ์ž๊ฐ€ SSDT ๋ฅผ ํ›„ํ‚นํ•˜์—ฌ

0xDDDDDDDD ๋กœ ์„œ๋น„์Šค ๋ฃจํ‹ด์˜ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค๋ฉด, ์‹œ์Šคํ…œ ํ˜ธ์ถœ 0xAD ๊ฐ€ ๋ฐœ์ƒํ• 

๋•Œ๋งˆ๋‹ค 0xDDDDDDDD๋ฅผ ์ง€๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค.

KeServiceDescriptorTable ์€ ๋„ค ๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด

๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ค‘์š”ํ•œ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ๊ณผ ๋„ค ๋ฒˆ์งธ ํ•ญ๋ชฉ์— ๋Œ€ํ•˜์—ฌ

์•Œ์•„๋ณด์ž. ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ KiServiceTable(SSDT)์˜ ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ด ๊ฐ’์„

ํ†ตํ•ด SSDT ์— ์ ‘๊ทผํ•˜์—ฌ Native API ์˜ ์ฃผ์†Œ๋ฅผ ์–ป์„ ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ. ๋„ค ๋ฒˆ์งธ ํ•ญ๋ชฉ์€

ParamTableBase ๋Š” KiArgumentTable ์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋“ค ๊ฐ๊ฐ์€ SSDT ์˜

Native API์™€ ์ผ ๋Œ€ ์ผ๋กœ ๋Œ€์‘ํ•œ๋‹ค.

Page 24: Windows API Hooking

ํŽ˜์ด์ง€ 24 / 27

24 Windows API Hooking

kd> dd KeServiceDescriptorTable

80554fa0 80503b8c 00000000 0000011c 80504000 //ServiceDescriptor[0]

80554fb0 00000000 00000000 00000000 00000000 //ServiceDescriptor[1]

80554fc0 00000000 00000000 00000000 00000000 //ServiceDescriptor[2]

80554fd0 00000000 00000000 00000000 00000000 //ServiceDescriptor[โ€ฆ]

โ€ฆ(skip)

๊ทธ๋ฆผ 31. KeServiceDescriptorTable ๊ตฌ์กฐ11

SSDT ์˜ ์ฃผ์†Œ๋Š” ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์˜ ๊ฐ’์ธ 0x80503b8c ๋กœ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์—ฌ๋Ÿฌ

์ฃผ์†Œ๋“ค์ด ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๊ฐ’๋“ค์€ Native API ์˜

์‹ค์ œ ์ฃผ์†Œ์ด๋ฉฐ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด Native API์˜ ์ด๋ฆ„์„ ๊ฐ™์ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

kd> d 80503b8c // SSDT Base

80503b8c 8059b948 805e8db6 805ec5fc 805e8de8

80503b9c 805ec636 805e8e1e 805ec67a 805ec6be

80503bac 8060ddfe 8060eb50 805e41b4 805e3e0c

80503bbc 805ccde6 805ccd96 8060e424 805ad5ae

80503bcc 8060da3c 8059fdbe 805a7a00 805ce8c4

โ€ฆ(skip)

kd> u 8059b948

nt!NtAcceptConnectPort:

8059b948 689c000000 push 9Ch

8059b94d 6838b14d80 push offset nt!_real+0x128 (804db138)

8059b952 e8b9e5f9ff call nt!_SEH_prolog (80539f10)

๊ทธ๋ฆผ 32. SSDT ๋ฅผ ํ†ตํ•œ Native API ์ ‘๊ทผ

์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ปค๋„ ๋ชจ๋“œ๋กœ ์ง„์ž…ํ•  ๋•Œ EAX ์—๋Š” ์š”์ฒญํ•œ ์„œ๋น„์Šค ๋ฒˆํ˜ธ๋ฅผ

์ €์žฅํ•˜๊ณ  ์žˆ๊ณ  EDX ์—๋Š” ์ธ์ž๋กœ ์‚ฌ์šฉ๋  ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์˜€๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ

์–ด๋– ํ•œ Native API ๋ฅผ ์š”์ฒญํ•˜๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„  SSDT ์˜ ์ฃผ์†Œ์— [EAX*4]๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๊ทธ

์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ SSDT Hooking ๋„ ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ

์‹ค์ œ SSDT์˜ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

11 Windows ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค ๊ฐœ์˜ SSDT ๋ฅผ ๊ฐ–์ง€๋งŒ, Native ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๊ฒƒ๊ณผ

win32k.sys์˜ GUI ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ SSDT๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

Page 25: Windows API Hooking

ํŽ˜์ด์ง€ 25 / 27

25 Windows API Hooking

SSDT๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” Native API ํ•จ์ˆ˜ 5๊ฐœ์˜ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋ณด์ž. WinDBG๋ฅผ

์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์ฃผ์†Œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ โ€œedโ€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ, ๊ธฐ์กด์˜

์ฃผ์†Œ๋ฅผ ์•„๋ฌด ์˜๋ฏธ ์—†๋Š” ๊ฐ’๋“ค๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. ๊ทธ ํ›„ SSDT ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ์œ„ ๊ทธ๋ฆผ 32 ์—์„œ

ํ™•์ธํ•  ์ˆ˜ ์žˆ๋˜ ์ฃผ์†Œ๋“ค์ด ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•œ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kd> ed 80503b8c

80503b8c 8059b948 ffffffff

80503b90 805e8db6 00000000

80503b94 805ec5fc ffffffff

80503b98 805e8de8 00000000

80503b9c 805ec636 ffffffff

80503ba0 805e8e1e 11111111

kd> d 80503b8c

80503b8c ffffffff 00000000 ffffffff 00000000

80503b9c ffffffff 11111111 805ec67a 805ec6be

80503bac 8060ddfe 8060eb50 805e41b4 805e3e0c

80503bbc 805ccde6 805ccd96 8060e424 805ad5ae

๊ทธ๋ฆผ 33. SSDT Hooking

์ด๋ ‡๊ฒŒ ํ›„ํ‚น์„ ํ•˜๋ฉด ํ•ด๋‹น Native API ๊ฐ€ ์š”์ฒญ๋  ๋•Œ๋งˆ๋‹ค ํ›„ํ‚น๋œ ์ฃผ์†Œ๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์œ„ ์‹ค์Šต์€ ์•„์ฃผ ๊ทน๋‹จ์ ์ธ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๊ณผ์ •์œผ๋กœ ๋ฐ”๋กœ ๋ธ”๋ฃจ ์Šคํฌ๋ฆฐ์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

์‹ค์ œ ํ›„ํ‚น ๊ณต๊ฒฉ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฉ”๋ชจ๋ฆฌ ์“ฐ๊ธฐ ๋ณดํ˜ธ(Write Protect)๋ฅผ ํ•ด์ œํ•˜๋Š” ์ž‘์—…์„

์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ, ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ํ†ตํ•ด ๊ณต๊ฒฉ์„ ์ง„ํ–‰ํ•œ๋‹ค.

Page 26: Windows API Hooking

ํŽ˜์ด์ง€ 26 / 27

26 Windows API Hooking

5 Conclusion

์‚ฌ์šฉ์ž ์˜์—ญ ํ›„ํ‚น๊ณผ ์ปค๋„ ์˜์—ญ ํ›„ํ‚น์— ๋Œ€ํ•ด ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•ด๋ณด๋ฉฐ ์–ด๋–ป๊ฒŒ

ํ›„ํ‚น์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์•Œ์•„๋ณด์•˜๋‹ค. ์‹ค์ œ ๊ณต๊ฒฉ์„ ํ•˜๋Š”๋ฐ ์žˆ์–ด ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š”

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๊ณต๊ฒฉ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๊ธ€

๋Œ€๋ถ€๋ถ„์ด ์ด๋Ÿฌํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๋Š”์ง€, ์ฝ”๋“œ๊ฐ€

์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€ ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ดํ›„์— ์ฝ”๋“œ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„

ํ•™์Šตํ•˜๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ด๋‹ค.

ํ•„์ž๋„ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ฒ ๊ตฌ๋‚˜ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ง์ ‘ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ†ตํ•ด

์ ‘๊ทผํ•ด๋ณผ ๋•Œ๋งˆ๋‹ค โ€œ์—ฌ๊ธฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?โ€๋ผ๋Š” ๋“ฑ ์ข€ ๋” ๊นŠ์ด ์žˆ๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณผ

์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ดํ›„์—๋Š” ์—ฌ๊ธฐ์„œ ๋‹ค๋ฃจ์ง€ ๋ชปํ•œ ํ›„ํ‚น๋“ค์— ๋Œ€ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ํ•™์Šตํ•ด๋ณผ ๊ฒƒ์ด๋ฉฐ

์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๋” ๊ณต๋ถ€ํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.

Page 27: Windows API Hooking

ํŽ˜์ด์ง€ 27 / 27

27 Windows API Hooking

6 Reference

[+] ๋ฆฌ๋ฒ„์‹ฑ ํ•ต์‹ฌ ์›๋ฆฌ(์•…์„ฑ ์ฝ”๋“œ ๋ถ„์„๊ฐ€์˜ ๋ฆฌ๋ฒ„์‹ฑ ์ด์•ผ๊ธฐ) |์ด์Šน์›|์ธ์‚ฌ์ดํŠธ|2012.09.30

[+] http://blog.naver.com/ikariksj/140056467421

[+] http://www.codeproject.com/Articles/2082/API-hooking-revealed

[+] http://www.reversecore.com/23

[+] http://yokang90.tistory.com/58

[+] http://xcoolcat7.tistory.com/542

[+] http://egloos.zum.com/maxtrain/v/2775961

[+] http://kernel32.tistory.com/15

[+] https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx

[+] https://blogs.msdn.microsoft.com/kocoreinternals/2009/03/16/idt-isr/

[+] https://en.wikipedia.org/wiki/Model-specific_register

[+] http://amur.tistory.com/entry/์ปค๋„๋ชจ๋“œ์—์„œ-์œ ์ €๋ชจ๋“œ-๋ถ„์„ํ•˜๊ธฐ