anti-revering techniques

51
Anti-Revering Techniques [email protected] http://zer0day.tistory.com ๊น€ ํ˜• ์ฐฌ 2016/9/29

Upload: others

Post on 21-Feb-2022

3 views

Category:

Documents


0 download

TRANSCRIPT

Anti-Revering Techniques

[email protected]

http://zer0day.tistory.com

๊น€ ํ˜• ์ฐฌ

2016/9/29

Contents 1. Introduction ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 3

1.1 Reversing ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 3

1.2 Anti Reversing ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 3

2. Anti-Debugging ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 4 2.1 Based on API Calls ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 4

2.2 Based on Windows Internals ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 9

2.3 Based on Exception ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 16

2.4 Based on Break Points ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 21

2.5 Based on Flags ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 22

2.6 Based on VM Detection ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 26

2.7 Based on Timing ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 37

2.8 Based on Checksums ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 38

2.9 Etc ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 39

3. Anti-Disassembly ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 41 3.1 Code Obfuscating ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 41

3.2 Packing ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 43

3.3 Anti Dumping ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 44

3.4 Etc ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 47

4. Conclusion ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 50

5. Reference ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท 51

1. Introduction ์ด๋ฒˆ ๋ฌธ์„œ์—์„œ๋Š” ์•ˆํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๋‚ด์šฉ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‹ค๋ค„๋ณผ ๊ฒƒ์ด๋‹ค.

์ด์— ๋Œ€ํ•œ ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ์€ ์ธํ„ฐ๋„ท ๋“ฑ์— ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์„ธํ•œ

์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ๋‹ค.

1.1. Reversing

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋งํ•˜๋Š” Reversing ์€ Reverse Engineering ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์ค„์—ฌ ๋งํ•˜๋Š” ๊ฑฐ๋‹ค.

Reversing ์ด๋ž€ ๊ทธ ๋œป ๊ทธ๋Œ€๋กœ ์—ญ์œผ๋กœ ๋ถ„์„์„ ํ•˜๋Š” ๊ฑฐ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ํƒ€๊ฒŸ์œผ๋กœ ํ•˜๋Š”

๋ฆฌ๋ฒ„์‹ฑ ๋Œ€์ƒ์€ .dll, .exe, .sys ํŒŒ์ผ ๋“ฑ์ด ๋˜๊ฒ ๊ณ  ์ด๋Ÿฌํ•œ ์‹คํ–‰ ํŒŒ์ผ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ

์šฐ๋ฆฌ๋Š” ์›์‹œ ์ฝ”๋“œ๋“ค์„ ๋ถ„์„ํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ์ž‘์—…์„ ํ•œ๋‹ค.

๋ฌผ๋ก  ๋ถ„์„์„ ์œ„ํ•ด์„  ํ•ด๋‹น ํŒŒ์ผ๋งˆ๋‹ค ๋‹ค๋ฅธ ์–ธ์–ด, ๋‹ค๋ฅธ ์•„ํ‚คํ…์ณ์—์„œ ์ž‘์„ฑ ๋˜์—ˆ์œผ๋‹ˆ ๊ฐ

assembly ์–ธ์–ด๋„ ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

1.2. Anti Reversing

์ด๋ฒˆ์— ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฐ Anti-Reversing ์ด๋ž€ ์ฃผ์ œ๋Š” ๊ฐ„๋žตํ•˜๊ฒŒ ๋งํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„์„ํ• 

์‹œ์— ๋ถ„์„ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋ถ„์„์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ๋‚œ๋…ํ™” ํ•ด

๋‘๊ฑฐ๋‚˜ ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ๋””๋ฒ„๊น…์ด ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ๋˜๊ฐ€. ๊ทธ๋ž˜์„œ ์ฃผ๋กœ ์ด๋Ÿฐ ๊ธฐ๋ฒ•๋“ค์€

์ƒ์šฉ ๊ฒŒ์ž„์ด๋‚˜ ์˜์ƒ ๋ฐ ๋…ธ๋ž˜(DRM), ์•…์„ฑ์ฝ”๋“œ ๋“ฑ์— ์‚ฌ์šฉ๋˜์–ด ๋ถ„์„์ด ๋˜๋Š” ๊ฒƒ์„ ์ตœ๋Œ€ํ•œ

๋ฐฉ์ง€ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„๋Œ€์—๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•๋“ค์ด๋‚˜ ๊ธฐ์ˆ ๋“ค์ด ๋Œ€๋ถ€๋ถ„ ์•Œ๋ ค์ ธ

์žˆ๊ณ  ๋ถ„์„ํ•˜๋Š” ํˆด์ด ์ข‹์•„์ง€๊ณ  ๋ถ„์„๊ฐ€์˜ ์‹ค๋ ฅ์ด ๋‚˜๋‚ ์ด ๋†’์•„์ ธ ์•„๋ฌด๋ฆฌ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋„

ํฌ๋ž™์ด ๋˜๊ธฐ ๋‚˜๋ฆ„์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ˜„๋Œ€์— ์•ˆํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ๋ฒ•์˜ ๋ชฉ์ ์€ โ€œ๋šซ๋ฆฌ์ง€ ์•Š์€ ์žฅ์น˜โ€ ๊ฐ€

์•„๋‹Œ โ€œ์ตœ๋Œ€ํ•œ ๋ถ„์„์„ ์ง€์—ฐ์‹œํ‚ค๋Š”โ€ ์žฅ์น˜๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฒˆ ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃฐ ๊ธฐ๋ฒ•๋“ค์€ ์ž˜

์•Œ๋ ค์ ธ ์žˆ๋Š” ์•ˆํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ๋ฒ•๋ถ€ํ„ฐ ์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ธฐ๋ฒ•์ด๋‚˜ ์•…์„ฑ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๊ณ 

์žˆ๋Š” ์•ˆํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ๋ฒ• ๋“ฑ๊นŒ์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‹ค๋ค„ ๋ณผ ์˜ˆ์ •์ด๋‹ค. ๊ธฐ๋ฒ• ์„ค๋ช…์— ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ์„œ

ํฌ๊ฒŒ 2 ๋ถ„์•ผ๋กœ ๋‚˜๋ˆ ๋ณด์ž๋ฉด ์•ˆํ‹ฐ ๋””๋ฒ„๊น…๊ณผ ์•ˆํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ์ธ๋ฐ, ์•ˆํ‹ฐ ๋””๋ฒ„๊น…์—์„  ๋””๋ฒ„๊ฑฐ๋ฅผ

๋Œ€์ƒ์œผ๋กœ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ ์š”์ฆ˜ ์ฃผ๋กœ ๋ถ„์„ ํ™˜๊ฒฝ์ธ VM ์ด๋‚˜ Sandbox ์œ„์—์„œ์˜ ํƒ์ง€

๊ธฐ๋ฒ•๊นŒ์ง€ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ์•ˆํ‹ฐ ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒํŠธ ์—์„œ๋Š” ์ฝ”๋“œ ๋‚œ๋…ํ™”์˜ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ ์•ˆํ‹ฐ

๋คํ•‘๊นŒ์ง€ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

2. Anti-Debugging ์•„๋ž˜์ฒ˜๋Ÿผ ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์„ ํฌ๊ฒŒ 7 ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•ด ๋ดค๋‹ค. ์•„๋ž˜ ๊ธฐ๋ฒ•๋“ค์€ ์œˆ๋„์šฐ

๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ๊ธฐ๋ฒ•๋“ค์ด๋‹ค. ๋ฌผ๋ก  ํŠน์ • ์œˆ๋„์šฐ ๋ฒ„์ „(ex) Vista, NT ๊ณ„์—ด์ด ์•„๋‹Œ

Windows)์ด๋‚˜ ์•„ํ‚คํ…์ณ(x86, x64)์— ์ฐจ์ด๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Œ์„ ๋ช…์‹œํ•œ๋‹ค.

2.1. Based on API Calls A) CheckRemoteDebuggerPresent

์ด๋ฒˆ ํ•จ์ˆ˜๋Š” IsDebuggerPresent ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ์ ์€ ํ˜„์žฌ ์‹œ์ ์„

๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ ์ด๋‹ค. ์ฆ‰, ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ์–ป์–ด ์˜ค๊ธฐ ๋•Œ๋ฌธ์—

IsDebuggerPresent ์™€ ๋‹ฌ๋ฆฌ BeingDebugged ๊ฐ’์ด ์ˆ˜๋™์œผ๋กœ ๋ฐ”๊ฟ” ํƒ์ง€๋ฅผ ๋ชปํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ

๋ฌธ์ œ๋Š” ์—†์–ด์ง„๋‹ค.

๊ตฌํ˜„์„ ํ•ด ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { BOOL Debugged; CheckRemoteDebuggerPresent(GetCurrentProcess(), &Debugged); if (Debugged) printf("Debugged\n"); }

B) FindWindow

๋‹ค์Œ API ๋Š” ํ˜„์žฌ ์‹คํ–‰๋˜์–ด ์žˆ๋Š” ์œˆ๋„์šฐ ์ฐฝ์„ ํƒ€์ดํ‹€ ๋ช…์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ฆ‰.

์ด ํ•จ์ˆ˜๋กœ ํ˜„์žฌ ์‹คํ–‰๋˜์–ด ์žˆ๋Š” ๋””๋ฒ„๊ฑฐ์˜ ํƒ€์ดํ‹€ ๋ช… (ex) OLLYDBG, MyDEBUG, IDA, etcโ€ฆ)

์œผ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด ๋งŒ์•ฝ ์žˆ์œผ๋ฉด ๋””๋ฒ„๊ฑฐ ์‚ฌ์šฉ ์ค‘์ด๋ผ ํƒ์ง€๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ตฌํ˜„์„ ํ•ด ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { HWND ck = FindWindow(L"MyDEBUG", 0); if (ck != NULL) printf("Debugged"); }

C) OpenProcess

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ OpenProcess ํ•จ์ˆ˜๋กœ csrss.exe ๋ฅผ PROCESS_ALL_ACCESS ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•ด

๋งŒ์•ฝ ์‹คํŒจํ•˜๋ฉด ๋””๋ฒ„๊น… ์ค‘์ด ์•„๋‹Œ ๊ฒƒ์ด๊ณ  ์„ฑ๊ณตํ•˜๋ฉด ๋””๋ฒ„๊น… ์ค‘์ธ ๊ฒƒ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด

์ผ๋ฐ˜์ ์ธ ์‹คํ–‰ ๋•Œ๋Š” ํ•ด๋‹น ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰์„ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋””๋ฒ„๊น… ์‹œ์—๋Š” ์ด๋ฏธ ํ•ด๋‹น ๊ถŒํ•œ์„

์‚ฌ์šฉํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ attach ํ•˜๊ฑฐ๋‚˜ open ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๊ณต์ ์œผ๋กœ

PROCESS_ALL_ACCESS ๊ถŒํ•œ์œผ๋กœ ์—ด ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„์„ ํ•ด ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { FARPROC proc = GetProcAddress( GetModuleHandle(L"ntdll.dll"), "CsrGetProcessId" ); DWORD PID = proc(); // Get csrss.exe PID HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); if (h != NULL) // If it fails, return 0 printf("Debugged"); }

D) Self-Debugging

์ด ๊ธฐ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ์ž๊ธฐ ์ž์‹ ์€ ๋””๋ฒ„๊น… ํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ, ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ค๊ณ 

๊ทธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋””๋ฒ„๊น… ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง„๋‹ค. ํ•œ๋ฒˆ์— ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ

๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•ด ์™ธ๋ถ€ ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋””๋ฒ„๊น…์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€

๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ฒ•์˜ ๋‹จ์ ์€ EPROCESS ๊ตฌ์กฐ์ฒด์˜ DebugPort ๊ฐ’์„ 0 ์œผ๋กœ

์„ค์ •์„ ํ•˜๋ฉด ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌํ˜„์„ ํ•ด ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void Self_Debugging() { DEBUG_EVENT de; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&de, sizeof(DEBUG_EVENT)); ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); GetStartupInfo(&si); CreateProcess(NULL, GetCommandLine(), NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &si, &pi); // Create a Copy of itself

ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, DBG_CONTINUE); // Continue WaitForDebugEvent(&de, INFINITE); } void main() { Self_Debugging(); }

E) OutputDebugString

ํ•ด๋‹น API ๋Š” ๋งŒ์•ฝ debugging ์ค‘์ด๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๊ณ  ๋งŒ์•ฝ ์•„๋‹ˆ๋ฉด

์—๋Ÿฌ์ฝ”๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. (์ถœ๋ ฅ์„ ํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ DbgPrint ์‚ฌ์šฉ). ์ฆ‰ ์‚ฌ์šฉ ํ–ˆ์„ ์‹œ

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋Š” ๋œป์ด๋‹ค. ์ฐธ๊ณ ๋กœ OllyDbg ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€

๊ตฌ ๋ฒ„์ „์—์„  %s ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํฌ๋งท์ŠคํŠธ๋ง์„ OutputDebugString ์œผ๋กœ ๊ฑด๋„ค ์ฃผ๊ฒŒ ๋˜๋ฉด

crash ๊ฐ€ ๋‚˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ์—” ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ์งง์•„์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ SEH ๋„ ์ถ”๊ฐ€ํ•ด์„œ ๊พธ๋ฉฐ ๋ณด์•˜๋‹ค. ๋ฌผ๋ก  GetLastError

ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์ด 0 ์ผ ๋•Œ๋ฅผ ๋น„๊ตํ•ด ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋Š” ๊ฑธ ํŒ๋ณ„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

void main() { __try { OutputDebugStringW(L"asdf"); __asm { mov ebx, [eax] } // EAX would be 0 or 1 // Windows XP, 10 -> 1, 7 -> 0 printf("Debugged"); } __except (EXCEPTION_EXECUTE_HANDLER) { ; } }

[+] ํ•˜๋‚˜ OutputDebugString ํ•จ์ˆ˜ ์›ํ˜•์— ๋Œ€ํ•ด ์žฌ๋ฏธ์žˆ๋Š” ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ. ์ด์ „

๋ฒ„์ „์˜ outputDebugString ํ•จ์ˆ˜ ์›ํ˜•์€ ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

void WINAPI OutputDebugStringA(LPCSTR lpOutputString) { ULONG_PTR args[2]; args[0] = (ULONG_PTR)strlen(lpOutputString) + 1; args[1] = (ULONG_PTR)lpOutputString; __try { RaiseException(0x40010006, 0, 2, args); printf("Debugged"); } __except (EXCEPTION_EXECUTE_HANDLER) {

; } }

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ DBG_PRINTEXCEPTION_C(0x4001006) ์˜€๋Š”๋ฐ ์ด๊ฒŒ Windows 10 ์œผ๋กœ

๋„˜์–ด์˜ค๋ฉด์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ƒˆ๋กœ์šด ๊ฒŒ ์ƒ๊ฒผ๋‹ค.

void WINAPI _OutputDebugString(LPCWSTR lpOutputString) { char outputDebugStringBuffer[1000] = { 0, }; ULONG_PTR args[4]; WideCharToMultiByte(CP_ACP, 0, lpOutputString, -1, outputDebugStringBuffer, sizeof(outputDebugStringBuffer), 0, 0); // Unicode args[0] = (ULONG_PTR)wcslen(lpOutputString) + 1; args[1] = (ULONG_PTR)lpOutputString; //Ansi for compatibility args[2] = (ULONG_PTR)wcslen(lpOutputString) + 1; args[3] = (ULONG_PTR)outputDebugStringBuffer; __try { RaiseException(0x4001000A, 0, 4, args); printf("Debugged"); } __except (EXCEPTION_EXECUTE_HANDLER) { ; } }

DBG_PRINTEXCEPTION_WIDE_C(0x4001000a)๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ฒผ๋‹ค. ๋˜ํ•œ Unicode ์ด์™ธ์— ANSI

๋ฒ„์ „์— ๋Œ€ํ•œ ๊ฐ’๋„ ์š”์ฒญ์„ ํ•œ๋‹ค.

F) BlockInput

์•„๋งˆ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ํ•จ์ˆ˜ ์ค‘์—์„œ ์‚ฌ์šฉ๋ฒ•์ด ์ œ์ผ ๊ฐ„๋‹จํ•œ ๊ธฐ๋ฒ•์ธ ๊ฑฐ ๊ฐ™๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ

ํ‚ค๋ณด๋“œ๋‚˜ ๋งˆ์šฐ์Šค์—์„œ ๋ฐœ์ƒ๋œ ์ด๋ฒคํŠธ ๋“ค์„ ๋ง‰์•„์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ธ์ž ๊ฐ’์œผ๋กœ 1 ์„ ๋„ฃ๊ฒŒ

๋˜๋ฉด block ๋ชจ๋“œ๊ฐ€ ๋˜๊ณ  0 ์„ ๋„ฃ์œผ๋ฉด unblock ๋ชจ๋“œ๊ฐ€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ Ctrl + Alt +

Delete ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์šฐํšŒ๊ฐ€ ๊ฐ„๋‹จํžˆ ๋œ๋‹ค.

์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

BlockInput(1); // block

BlockInput(0); // unblock

G) DeleteFiber

ํ•ด๋‹น API ๋Š” Fiber ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ง€์šฐ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ ๋ชจ๋“  ์ •๋ณด์—๋Š” ๋ฌผ๋ก 

์Šคํƒ ๋‚ด, ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ผ๋ถ€๋ถ„, ํ”ผ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ํŠน์ง•์œผ๋กœ ๋””๋ฒ„๊น… ์ค‘์— ํ•จ์ˆ˜ ์‚ฌ์šฉ

์‹œ ์—๋Ÿฌ ๋ฐ˜ํ™˜ ๊ฐ’์ด 0x57 ์ด ์•„๋‹Œ ๊ฐ’์ด ๋œ๋‹ค. ์ด๊ฑธ ์ด์šฉํ•ด์„œ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

MOV EAX,DWORD PTR FS:[18] // TEB Structure

MOV ECX,DWORD PTR DS:[EAX+10] // Access TIB Structure -> FiberData Area

MOV ESI,DWORD PTR SS:[EBP+8] // lpFiber Value

CMP ECX,ESI // compare lpFiber & FiberData

ํ›„์— NtFreeVirtualMemory ๋ฅผ ์‚ฌ์šฉํ•ด stack ์„ ๋น„์›Œ์ฃผ๊ณ  ExitThread ๋กœ ํ•จ์ˆ˜๋ฅผ

์ข…๋ฃŒํ•œ๋‹ค.

๊ตฌํ˜„์„ ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

void main() { char fiber[1024] = { 0, }; DeleteFiber(fiber); if (GetLastError() != 0x57) printf("Debugged"); }

H) LDR

์ด๋ฒˆ ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์œผ๋กœ๋Š” PEB ๊ตฌ์กฐ์ฒด์— 12 ๋ฒˆ์งธ์— ์žˆ๋Š” Ldr ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ

๋””๋ฒ„๊น…์„ ํƒ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋””๋ฒ„๊น… ๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ์— ์ž์‹ ์ด ๋””๋ฒ„๊น…

๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค ๋ผ๋Š” ํ‘œ์‹œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ Heap ์˜์—ญ์„ 0xfeeefeee ์™€ 0xabababab

๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค. ์ด Heap ์ฃผ์†Œ๊ฐ€ Ldr ์— ์ €์žฅ์ด ๋˜๊ณ , ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์™€ ๊ฐ™์€

๋ฐ์ดํ„ฐ๋“ค์„ ๊ฒ€์ƒ‰ํ•ด ๋””๋ฒ„๊น…์„ ํƒ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค.

- PEB Structure

- typedef struct _PEB {

- BYTE Reserved1[2];

- BYTE BeingDebugged;

- ...

- Struct _PEB_LDR_DATA * Lrd; // PEB+0xC

- } PEB, *PPEB;

๊ตฌํ˜„์„ ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

void main() { FARPROC proc = GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtCurrentTeb"); UINT teb = (UINT)proc(); // TEB Address UINT peb = *(UINT *)(teb + 0x30); // PEB Address UINT ldr = *(UINT *)(peb + 0xC); // PEB+0xC -> Ldr __try { for (int i = 0; ; ++i) { if (*(UINT *)(ldr + i) == 0xfeeefeee || *(UINT *)(ldr + i) == 0xabababab) printf("Debugged"); } } __except (EXCEPTION_EXECUTE_HANDLER) { ; } }

2.2. Based on Windows Internals A) NtQueryObject

๋จผ์ € NtQueyrObject ํ•จ์ˆ˜๋Š” Debug Object ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฝ‘์•„์˜ค๋Š” ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

Debug Object ๋ž€ XP ๋•Œ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚ฌ์œผ๋ฉฐ ๋””๋ฒ„๊น… ์‹œ์— ์ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ์ด ๋œ๋‹ค. ์ฆ‰ ํ•ด๋‹น

ํ•จ์ˆ˜๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฝ‘์•„์™€์„œ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŒ… ํ•ด์„œ ๋””๋ฒ„๊น…์„ ํƒ์ง€ ํ•  ์ˆ˜๊ฐ€

์žˆ๋‹ค. ๊ฐ์ฒด์˜ ๊ฐœ์ˆ˜๊ฐ€ 1 ๊ฐœ์ผ ๋•Œ๋งŒ ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์„ ๋•Œ์ด๋‹ค.

๊ตฌํ˜„์„ ํ•ด ๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING; typedef struct _OBJECT_TYPE_INFORMATION { UNICODE_STRING TypeName; ULONG TotalNumberOfHandles; ULONG TotalNumberOfObjects; } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; typedef struct _OBJECT_ALL_INFORMATION { ULONG NumberOfObjects;

OBJECT_TYPE_INFORMATION ObjectTypeInformation[1]; } OBJECT_ALL_INFORMATION, *POBJECT_ALL_INFORMATION; typedef NTSTATUS(NTAPI *pNtQueryObject)(HANDLE, UINT, PVOID, ULONG, PULONG); void main() { ULONG size = 0; pNtQueryObject nqo = (pNtQueryObject)GetProcAddress( GetModuleHandle(L"ntdll.dll"), "NtQueryObject"); NTSTATUS stat = nqo(NULL, 3, // ObjectAllTypesInformation &size, 4, &size); PVOID pMemory = VirtualAlloc(NULL, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); // Get Object List stat = nqo((HANDLE)-1, 3, pMemory, size, NULL); if (stat != 0) { VirtualFree(pMemory, 0, MEM_RELEASE); return; } POBJECT_ALL_INFORMATION pObjectAllInfo = (POBJECT_ALL_INFORMATION)pMemory; PUCHAR pObjInfoLocation = (PUCHAR)pObjectAllInfo->ObjectTypeInformation; ULONG NumObjects = pObjectAllInfo->NumberOfObjects; for (int i = 0; i < NumObjects; ++i) { POBJECT_TYPE_INFORMATION pObjectTypeInfo = (POBJECT_TYPE_INFORMATION)pObjInfoLocation; if (wcscmp(L"DebugObject", pObjectTypeInfo->TypeName.Buffer) == 0) { // Check num of Objects is 1 if (pObjectTypeInfo->TotalNumberOfObjects != 1) printf("Debugged or Debug Tool Found"); } pObjInfoLocation = (PUCHAR)pObjectTypeInfo->TypeName.Buffer; pObjInfoLocation += pObjectTypeInfo->TypeName.Length; ULONG tmp = ((ULONG)pObjInfoLocation) & -4; pObjInfoLocation = ((PUCHAR)tmp) + sizeof(ULONG); } VirtualFree(pMemory, 0, MEM_RELEASE); }

B) NtQuerySystemInformation

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์šด์˜์ฒด์ œ์˜ ์ •๋ณด๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜๋กœ ์ฃผ๋กœ ์šด์˜์ฒด์ œ๊ฐ€ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ

๋ถ€ํŒ… ๋ฌ๋Š”์ง€ ์•ˆ ๋ฌ๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค์—

์กด์žฌํ•˜๋Š” 35 ๋ฒˆ์งธ์— ์กด์žฌํ•˜๋Š” SystemKernelDebuggerInformation(0x23)์„ ์‚ฌ์šฉํ•˜๋ฉด

SYSTEM_KERNEL_DEBUGGER_INFORMATION ๊ตฌ์กฐ์ฒด์˜ DebuggerEnabled ๊ฐ’์ด ์ธ์ง€๋ฅผ ํ™•์ธ

ํ•œ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋ก  EAX ์— ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ al ์— KdDebuggerEnabled ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ , ah

์— KdDebuggerNotPresent ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ฆ‰ ah ์— 0 ์ด ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฉด ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋Š”

๋œป์ด๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION { BOOLEAN KdDebuggerEnabled; BOOLEAN KdDebuggerNotPresent; } SYSTEM_KERNEL_DEBUGGER_INFORMATION; typedef NTSTATUS(WINAPI *ntqsi)(ULONG, PVOID, ULONG, PULONG); void main() { SYSTEM_KERNEL_DEBUGGER_INFORMATION skdi; ntqsi qsi = (ntqsi)GetProcAddress( GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"); qsi(0x23, // SystemKernelDebuggerInformation &skdi, 2, NULL); if (skdi.KdDebuggerEnabled && !skdi.KdDebuggerNotPresent) printf("Debugged"); }

C) NtSetInformationThread

Windows 2000 ์ฏค์— ์•ˆํ‹ฐ ๋””๋ฒ„๊น…์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„(?) class ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ

NtQueryInformationThread ๋‹ค. ์ด๋ฒˆ์— ๋‹ค๋ค„ ๋ณผ ๊ฒƒ์€ ThreadInformationClas ์—

์กด์žฌํ•˜๋Š” 17 ๋ฒˆ์งธ ๋ฉค๋ฒ„์ธ ThreadHideFromDebugger ์ด๋‹ค. ํ•ด๋‹น ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด

ํ”„๋กœ๊ทธ๋žจ์ด ๊ณ„์† ์‹คํ–‰์ด ๋˜๋„ ๋””๋ฒ„๊ฑฐ๋Š” ํ•ด๋‹น Thread ๋กœ๋ถ€ํ„ฐ ์–ด๋Š ์ด๋ฒคํŠธ๋„ ๋ฐ›์ง€ ์•Š๊ฒŒ

์ผ์ข…์˜ ์€๋‹‰์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

typedef NTSTATUS(NTAPI *ntsit)(HANDLE, UINT, PVOID, ULONG); void main() { ntsit sit = (ntsit)GetProcAddress( GetModuleHandle(L"ntdll.dll"), "NtSetInformationThread"); NTSTATUS stat = sit(GetCurrentThread(), 0x11, // ThreadHideFromDebugger 0, 0); if (stat == 0) printf("Hide"); }

๋ฌผ๋ก  GetCurrentThread ๋กœ ํ˜„์žฌ Thread ๋ฅผ ๋„ฃ๋Š” ๋Œ€์‹  ์ž์‹ ์ด ๋„ฃ๊ณ  ์‹ถ์€ Thread ๋ฅผ

๋„ฃ์–ด๋„ ๋œ๋‹ค.

D) NtSetDebugFilterState

์ด ํ•จ์ˆ˜๋Š” ๋””๋ฒ„๊ทธ ํ•„ํ„ฐ๋ฅผ ์ˆ˜์ • ํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, ๋””๋ฒ„๊น… ์‹œ์—๋Š” ์ด ํ•„ํ„ฐ ๊ฐ’ ๋ณ€๊ฒฝ์ด

๋ถˆ๊ฐ€๋Šฅํ•œ ์ ์„ ์ด์šฉํ•ด ๋””๋ฒ„๊ฑฐ๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋””๋ฒ„๊น… ์ค‘ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜๋ฉด

STATUS_ACCESS_DENIED(0xc0000022)์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ์ด ๊ธฐ๋ฒ•์œผ๋กœ๋Š”

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊ฑฐ์— attach ๋œ ๊ฒฝ์šฐ์—๋งŒ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

typedef NTSTATUS(WINAPI *ntsdfs)(ULONG, ULONG, BOOLEAN); void main() { ntsdfs sdfs = (ntsdfs)GetProcAddress( GetModuleHandle(L"ntdll.dll"), "NtSetDebugFilterState"); NTSTATUS stat = sdfs(0, 0, TRUE); if (stat == 0) printf("Debugged"); }

E) NtQueryInformationProcess

์ด๋ฒˆ์— ์†Œ๊ฐœ ํ•  ํ•จ์ˆ˜๋กœ๋Š” ํฌ๊ฒŒ 4 ๊ฐ€์ง€๋ฅผ ์ด์šฉํ•ด ์•ˆํ‹ฐ ๋””๋ฒ„๊น…์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ProcessBasicInformation(0x0)

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ ์•ฝ๊ฐ„ Aggressive ํ•œ ๊ธฐ๋ฒ•์ธ๋ฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์œˆ๋„์šฐ ์ƒ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„

์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋“ค(์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ)๋“ค์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” explorer.exe ๋‹ค.

(๋ฌผ๋ก  ์•„๋‹Œ ๊ฒฝ์šฐ๋„ ์žˆ์Œ). ์ด๋ฅผ ์ด์šฉํ•ด ๋””๋ฒ„๊น… ์‹œ์—๋Š” ๋””๋ฒ„๊ฑฐ ํ”„๋กœ์„ธ์Šค์— ์ž์‹์œผ๋กœ

attach ํ•˜๋‹ˆ๊นŒ ํ˜„์žฌ ์ž์‹ ์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค PID ๋ฅผ explorer.exe ํ•˜๊ณ  ๋น„๊ตํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

ํ•ด๋‹น ์ธ์ž๋กœ NtQueryInformationProcess ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ

PROCESS_BASIC_INFORMATION ๊ตฌ์กฐ์ฒด๊ฐ€ ๋ฆฌํ„ด ๋˜๋Š”๋ฐ, ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์—์„œ

typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; PVOID PebBaseAddress; PVOID AffinityMask; PVOID BasePriority; ULONG_PTR UniqueProcessId; ULONG_PTR ParentProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;

์ฃผ์˜ ๊นŠ๊ฒŒ ๋ณผ ๊ฑด ๋งˆ์ง€๋ง‰ ๋ฉค๋ฒ„์ธ InheritedFromUniqueProcessId ๋‹ค. ํ•ด๋‹น ๋ฉค๋ฒ„์—” ๋ถ€๋ชจ

ํ”„๋กœ์„ธ์Šค์˜ pid ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ์ด ๊ฐ’๊ณผ explorer.exe pid ๋ฅผ ๋น„๊ตํ•ด ๋งŒ์•ฝ ํ‹€๋ฆฌ๋ฉด ๋””๋ฒ„๊น…

์ค‘์ด๋ผ ํŒ๋‹จ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; PVOID PebBaseAddress; PVOID AffinityMask; PVOID BasePriority; ULONG_PTR UniqueProcessId; ULONG_PTR ParentProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; typedef NTSTATUS(WINAPI *qip)(HANDLE, UINT, PVOID, ULONG, PULONG); DWORD ExplorerPID() { DWORD pid = 0; GetWindowThreadProcessId(GetShellWindow(), &pid); return pid; } DWORD ParentProcessPID() { PROCESS_BASIC_INFORMATION pbi;

ZeroMemory(&pbi, 24); qip proc = (qip)GetProcAddress( GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess" ); NTSTATUS stat = proc(GetCurrentProcess(), 0, // ProocessBasicInformation &pbi, 24, 0); if (stat == 0) return pbi.ParentProcessId; return 0; } BOOL IsParentExplorerExe() { return ParentProcessPID() == ExplorerPID(); } void main() { if (!IsParentExplorerExe()) printf("Debugged"); }

- ProcessDebugPort(0x7)

์ด ๊ธฐ๋ฒ•์€ ์ด๋ฏธ ๊ฐ„์ ‘์ ์œผ๋กœ ํ•œ๋ฒˆ ์ ‘ํ–ˆ๋˜ ๋ฐฉ๋ฒ•์ด๋‹ค. ์œ„์—์„  ์ž์„ธํžˆ ์„ค๋ช…์„ ์•ˆ ํ–ˆ์ง€๋งŒ,

CheckRemoteDebuggerPresent ํ•จ์ˆ˜ ๋‚ด๋ถ€๋ฅผ ๋ถ„์„ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ

NtQueryInformationProcess ๋ฅผ ์‚ฌ์šฉํ•ด Debug Port ๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋””๋ฒ„๊น… ์ค‘์ผ ๋•Œ Debug Port ๊ฐ€ ํ• ๋‹น๋˜๊ฒŒ ๋˜๋Š”๋ฐ ๋งŒ์•ฝ ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋ฉด -1 ์„

์ฃผ๊ณ  ๋””๋ฒ„๊น… ์ค‘์ด ์•„๋‹ˆ๋ฉด 0 ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

typedef NTSTATUS(WINAPI *ntqip)(HANDLE, UINT, PVOID, ULONG, PULONG); void main() {

DWORD flag; ntqip qip = (ntqip)GetProcAddress(

GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");

NTSTATUS stat = qip(GetCurrentProcess(),

0x7, // DebugPort &flag, 4, NULL);

if (stat == 0 && flag == -1)

printf("Debugged"); }

- ProcessDebugObjectHandle(0x1e)

Windows XP ๋ถ€ํ„ฐ, ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๋””๋ฒ„๊น…์ด ๋˜๋ฉด ๋””๋ฒ„๊น… ์„ธ์…˜์ด ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ๊ฐ์ฒด์—

๋Œ€ํ•œ ํ•ธ๋“ค๋„ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ ํ•ธ๋“ค์€ ๋””๋ฒ„๊น…์ด ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ์ฆ‰,

NtQueryInformationProcess ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ ๊ฐ์ฒด์— ์ ‘๊ทผ ํ•ด ํ•ธ๋“ค ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€

๋””๋ฒ„๊น…์„ ํƒ์ง€ ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 0x1e ๋ฒˆ์งธ ๋ฉค๋ฒ„๋ฅผ ๋ณด๋ฉด ProcessDebugObjectHandl ์ด๋ž€

๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

typedef NTSTATUS(WINAPI *ntqip)(HANDLE, UINT, PVOID, ULONG, PULONG); void main() {

HANDLE h; ntqip qip = (ntqip)GetProcAddress(

GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess");

NTSTATUS stat = qip(GetCurrentProcess(),

0x1e, // ProcessDebugObjectHandle &h, 4, NULL);

if (stat == 0 && h) printf("Debugged");

}

- ProcessDebugFlags(0x1f)

๋‹ค์Œ์€ ProcessDebugFlags ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. 3 ๋ฒˆ์งธ ์ธ์ž์— EPROCESS ๊ตฌ์กฐ์ฒด์˜

NoDebugInherit ๊ฐ’์˜ ์—ญ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰ ๋ฆฌํ„ด ๊ฐ’์ด 0 ์ด๋ฉด ๋””๋ฒ„๊น… ์ค‘ ์ธ ๊ฒƒ์ด๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

typedef NTSTATUS(WINAPI *ntqip)(HANDLE, UINT, PVOID, ULONG, PULONG); void main() { DWORD nodebug; ntqip qip = (ntqip)GetProcAddress( GetModuleHandle(L"ntdll.dll"), "NtQueryInformationProcess"); NTSTATUS stat = qip(GetCurrentProcess(), 0x1f, // ProcessDebugFlags &nodebug, 4, NULL); if (stat == 0 && !nodebug) printf("Debugged"); }

2.3. Based on Exception A) UnHandledExceptionFilter

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋“ฑ๋ก๋œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฌธ ์ด๋‚˜ SEH Chain ์ด ์—†๋‹ค๋ฉด ์ตœํ›„์˜

๋ณด๋ฃจ(?)๋กœ UnHandledExceptionFilter ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค. ํ•œ๋งˆ๋””๋กœ Top Level ์˜ˆ์™ธ

์ฒ˜๋ฆฌ ์žฅ์น˜๋‹ค. ๋งŒ์•ฝ ๋””๋ฒ„๊ฑฐ๊ฐ€ attach ๋˜๋ฉด ๋‹ค๋ฅธ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์™€ ๋‹ค๋ฅด๊ฒŒ ๊ณ„์† ์‹คํ–‰๋˜์ง€ ์•Š๊ณ 

๋ฐ”๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค. ๊ทธ ๋””๋ฒ„๊ฑฐ๋ฅผ ํƒ์ง€ํ•  ๋•Œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ

NtQueryInformationProcess ํ•จ์ˆ˜์™€ ProcessDebugPort ๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

Divide by zero ๋ฅผ ์˜ˆ์‹œ๋กœ ๊ตฌํ˜„์„ ํ•ด ๋ณด๋ฉด

LONG WINAPI UnhandledExcepFilter(PEXCEPTION_POINTERS pExcepPointers) { SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER) pExcepPointers->ContextRecord->Eax); pExcepPointers->ContextRecord->Eip += 2; // Skip Exception Codes return EXCEPTION_CONTINUE_EXECUTION; } int main() { SetUnhandledExceptionFilter(UnhandledExcepFilter); __asm {xor eax, eax} __asm {div eax} // Divide by zero printf("Not Debugged"); }

B) CloseHandle

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ‰์†Œ์—๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋“ฏ์ด ์‚ฌ์šฉ๋œ ํ•ธ๋“ค์„ ์ข…๋ฃŒํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ•˜์ง€๋งŒ

์ƒ์„ฑ๋˜์ง€ ์•Š์€ ํ•ธ๋“ค์„ ์ข…๋ฃŒํ•˜๊ฒŒ ํ•จ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋””๋ฒ„๊ฑฐ๋ฅผ ํƒ์ง€ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰์„ ํ•˜๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ ์—†์ด ์ง€๋‚˜๊ฐ€์ง€๋งŒ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์กด์žฌํ•  ์‹œ์—๋Š”

EXCEPTION_INVALID_HANDLE(0xc0000008)์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ x64 ์šด์˜์ฒด์ œ ์—์„œ๋Š”

EXCEPTION_HANDLE_NOT_CLOSABLE(0xc0000235)๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void main() { __try { CloseHandle((HANDLE)0x12345678); } __except (EXCEPTION_EXECUTE_HANDLER) { printf("Debugged");

} }

C) INT 3

INT 3 ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ Software Break Point ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” break point ์ค‘

ํ•˜๋‚˜๋‹ค. ๋งŒ์•ฝ ๋””๋ฒ„๊น… ์ค‘์ด๋ผ๋ฉด ์ด ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์‹คํ–‰๋  ๋•Œ break point ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ ๋˜๋ฉด์„œ

์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ BP ๋กœ ์ธ์‹ํ•ด ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜์ง€๋งŒ ์•„๋‹ ๋•Œ๋Š” STATUS_BREAKPOINT(0x80000003)

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์˜ˆ์™ธ ๊ตฌ๋ฌธ์— ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __try { __asm { int 3 } } __except (EXCEPTION_EXECUTE_HANDLER) { printf("Not Debugged"); } }

D) INT 2D

INT 2d ์€ ๋…ํŠนํ•˜๊ฒŒ ์‹คํ–‰์ด ๋  ๋•Œ ์˜ˆ์™ธ ์ฃผ์†Œ๋กœ ํ˜„์žฌ EIP ์ฃผ์†Œ๋ฅผ ์“ฐ๊ณ  1 ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

ํ•˜์ง€๋งŒ EAX ๊ฐ’์— 1, 3, 4 ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ๋งŒ์ด๋‹ค(Vista ๋งŒ 5). ๋˜ํ•œ ๋””๋ฒ„๊ฑฐ๊ฐ€ ์กด์žฌํ•  ๋•Œ

์‹คํ–‰๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ค๊ณ  ์•„๋‹ ๋• ๋ฐœ์ƒ์„ ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __try { __asm { int 0x2d } } __except (EXCEPTION_EXECUTE_HANDLER) { printf("Not Debugged"); } }

E) INT 41

์ด ์ธ์ŠคํŠธ๋Ÿญ์…˜์€ ์ปค๋„ ๋””๋ฒ„๊ฑฐ๋ฅผ ํƒ์ง€ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด๋‹ค. ์ฃผ๋กœ ์ด

๋ช…๋ น์€ ring 3 ๋ชจ๋“œ ์ฆ‰ ์œ ์ € ๋ชจ๋“œ์—์„œ ์‹คํ–‰์ด ์•ˆ๋˜๋Š” ๋ช…๋ น์ด๋‹ค. ๋งŒ์•ฝ ์‹คํ–‰์„ ํ•˜๊ฒŒ ๋˜๋ฉด

int d ๊ฐ€ ์ˆ˜ํ–‰ ๋˜ EXCEPTION_ACCESS_VIOLATION(0xc0000005)์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ int 41 ์€ ์ฃผ๋กœ DPL ๊ฐ’์„ 0 ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ๋ช‡๋ช‡ ๋””๋ฒ„๊ฑฐ ๋“ค์€ ์ด ์ธ์ŠคํŠธ๋Ÿญ์…˜์„

ring 3 ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด 3 ์œผ๋กœ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __try { __asm { int 0x41 } } __except (EXCEPTION_EXECUTE_HANDLER) { printf("Not Debugged"); } }

F) Prefix Handling

Prefix handling ๊ธฐ๋ฒ•์€ prefix ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‚ฌ์šฉํ•ด ๋””๋ฒ„๊น… ํ•  ๋•Œ๋Š” prefix rep ๋ช…๋ น์€

์ƒ๋žต, step over ๊ฐ€ ๋˜์„œ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€ ์ง€๋Š”๋ฐ ๋’ค์— 0xf1 ์ธ์ŠคํŠธ๋Ÿญ์…˜(ice breakpoint)๋„

์ƒ๋žต ๋˜๊ฒŒ ๋˜ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—” SINGLE_STEP_EXCEPTION ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ

ICE ๋Š” In-Circuit-Emulator ์˜ ์•ฝ์ž๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __try { __asm __emit 0xf3 __asm __emit 0x64 // prefix rep __asm __emit 0xf1 // ice break point } __except (EXCEPTION_EXECUTE_HANDLER) { printf("Not Debugged"); } }

G) CMPXCHG8B and LOCK Prefix

LOCK prefix๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ํ”„๋กœ์„ธ์„œ์— ํŠน๋ณ„ํ•œ pin์‹ ํ˜ธ๋ฅผ ์ฃผ๊ฒŒ ๋˜์–ด

ํ”„๋กœ์„ธ์„œ๋ฅผ LOCKํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด๋‹ค. ๋˜ํ•œ CMPXCHG8B prefix๋Š” CMPํ•˜๊ณ 

XCHG, ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ๊ฐ™์ด

์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•„ EXCEPTION_ILLEGAL_INSTRUCTION

(0xc000001d)์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋””๋ฒ„๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ ํ•ด๋‹น ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋ก  ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์–ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void error(void) { printf("Not Debugged");

}

void main() { SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)error); __asm { __emit 0xf0 __emit 0xf0 // LOCK prefix __emit 0xc7 __emit 0xc8 // CMPXCHG8B prefix }

}

H) Guard Pages

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ PAGE_GUARD ๋ชจ๋“œ๋กœ ๋ณดํ˜ธ๊ฐ€ ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋””๋ฒ„๊ฑฐ๊ฐ€ ์ ‘๊ทผ์„ ํ•  ๋•Œ ์˜ˆ์™ธ๋ฅผ

๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ์ด์šฉํ•œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. EXCEPTION_GUARD_PAGE(0x80000001)์˜ˆ์™ธ๊ฐ€

๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๊ณ„์† ๋””๋ฒ„๊น…์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๊ทธ๋ƒฅ ์ง€๋‚˜์น˜๊ฒŒ ๋œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { DWORD oProt; PVOID func = VirtualAlloc(NULL, 0x10, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

memset(func, 0x10, 0xc3); // filled with c3 : ret VirtualProtect(func, 0x10, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &oProt); FARPROC proc = (FARPROC)func;

__try { proc(); }

__except (EXCEPTION_EXECUTE_HANDLER) {

printf("Not Debugged"); } }

I) CLI & STI

ํ•ด๋‹น ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์€ ring 3(์œ ์ € ๋ชจ๋“œ) ๊ฐ€ ์•„๋‹Œ ring 0(์ปค๋„ ๋ชจ๋“œ)์šฉ ์–ด์…ˆ๋ธ”๋ฆฌ๋“ค์ด๋‹ค.

์ด ๋ช…๋ น์–ด๋“ค์„ ring 3 ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด STATUS_PRIVILEGED_INSTRUCTION(0xc0000096)

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ cli ๋Š” ์ธํ„ฐ๋ŸฝํŠธ๋“ค์„ disable ํ•˜๊ณ  sti ๋Š” ๊ทธ ๋ฐ˜๋Œ€์˜ ์—ญํ• ์„

ํ•œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ด๊ณ  ์ง์ ‘ SEH ๋‚˜ VEH ๋“ฑ ์ง์ ‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

๋ฃจํ‹ด์„ ์ œ์ž‘ํ•ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

void main() { __try { __asm { sti cli } } __except (EXCEPTION_EXECUTE_HANDLER) { printf("ring 3"); } }

J) SEH

์ด๋ฒˆ์—๋Š” asm ์œผ๋กœ ๊ฐ„๋‹จํ•œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” SEH ๋ฅผ ์ œ์ž‘ํ•ด ๋ณผ ๊ฑฐ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ€์›จ์–ด๋‚˜

ํŒจ์ปค์—์„œ๋Š” ์ฝ”๋“œ ๋‚œ๋…ํ™”๋‚˜ ์•ˆํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ๋“ฑ์˜ ๋ชฉ์ ์œผ๋กœ custom seh handler ๋ฅผ

์ง์ ‘ ๋งŒ๋“ค์–ด ์ฝ”๋“œ encrypt ๋‚˜ decrypt, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋“ฑ์„ ํ•œ๋‹ค.

Closehandle ํ•จ์ˆ˜์˜ INVALID_HANDLE ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

EXCEPTION_DISPOSITION handler(PEXCEPTION_RECORD pExceptionRecord, PVOID pEstablisherFrame, PCONTEXT pContextRecord, PVOID pDispatcherContext) { if (EXCEPTION_INVALID_HANDLE == pExceptionRecord->ExceptionCode) printf("debugged"); return ExceptionContinueExecution; } void main() { __asm { push handler // seh handler push fs : [0] mov fs : [0], esp nop push 0xdeadbeef

call CloseHandle // EXCEPTION_INVALID_HANDLE nop mov eax, [esp] // restore handler mov fs : [0], eax add esp, 8 } }

2.4. Based on Break Points A) Hardware Break Point

ํ•˜๋“œ์›จ์–ด breakpoint ๋Š” ์ธํ…” ์•„ํ‚คํ…์ณ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๊ฒƒ๋“ค์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด

Dr0 ~ Dr7 ์˜ ํŠน์ˆ˜ํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Dr0 ๋ถ€ํ„ฐ Dr3 ๋ ˆ์ง€์Šคํ„ฐ๋Š” 32bit ๋ ˆ์ง€์Šคํ„ฐ๋กœ

breakpoint ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š”๋ฐ ์‚ฌ์šฉ๋˜๊ณ , Dr4 ~ Dr5 ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์œ„ํ•ด ์˜ˆ์•ฝ๋œ

๋ ˆ์ง€์Šคํ„ฐ, Dr6 ~ Dr7 ์€ breakpoint ์˜ ํ–‰๋™์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ํ•˜๋“œ์›จ์–ด

breakpoint ๋ฅผ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„  Dr0 ๋ถ€ํ„ฐ Dr3 ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํ™•์ธํ•ด ๊ฐ’์ด ๋“ค์–ด์žˆ์œผ๋ฉด

ํ•˜๋“œ์›จ์–ด breakpoint ๊ฐ€ ์„ค์ •๋œ ๊ฒƒ์ด๋‹ค.

๊ตฌํ˜„ ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { UINT bps = 0; CONTEXT c; ZeroMemory(&c, sizeof(CONTEXT)); c.ContextFlags = CONTEXT_DEBUG_REGISTERS; if (GetThreadContext(GetCurrentThread(), &c) != 0) { if (c.Dr0 != 0) ++bps; if (c.Dr1 != 0) ++bps; if (c.Dr2 != 0) ++bps; if (c.Dr3 != 0) ++bps; } printf("%d bps", bps); }

2.5. Based on Flags A) BeingDebugged

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” TEB(Thread Environment Block)๊ณผ PEB(Process Environment Block)๋ฅผ

์‚ฌ์šฉํ•˜๋Š”๋ฐ, PEB ๊ตฌ์กฐ์ฒด์— BeingDebugged flag ๋ฅผ ๊ฒ€์‚ฌํ•ด ๋””๋ฒ„๊น…์„ ํ™•์ธ ํ›„ ๋””๋ฒ„๊น…

์ค‘์ด๋ฉด TRUE, ์•„๋‹ˆ๋ฉด FALSE ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

- PEB Structure

- typedef struct _PEB {

- BYTE Reserved1[2];

- BYTE BeingDebugged;

- ...

- } PEB, *PPEB;

ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ disassemble ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ง์ ‘ PEB ๊ตฌ์กฐ์ฒด์—

์ ‘๊ทผํ•ด์„œ BeingDebugged ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

mov eax, fs:[0x18] // TEB ์ ‘๊ทผ, FS:[18] ์—” TEB ์ฃผ์†Œ๊ฐ€ ์žˆ์Œ

mov eax, ds:[eax+0x30] // PEB ์ ‘๊ทผ, TEB 0x30 ์— PEB ๊ฐ€ ์žˆ์Œ

movzx eax, ds:[eax+0x2] // PEB 2๋ฒˆ์งธ BeingDebugged ๊ฐ’์„ eax ์— ๋„ฃ์Œ

์ฝ”๋“œ๋กœ ๊ตฌํ˜„์„ ํ•ด ๋ณด์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { if (IsDebuggerPresent()) printf("Debugged\n"); }

B) Trap Flag

TF(Trap Flag)๋Š” EFLAGS ๋ ˆ์ง€์Šคํ„ฐ์— 9 ๋ฒˆ์งธ bit ์— ์กด์žฌํ•˜๋ฉฐ ํ•ด๋‹น ๊ฐ’์„ 1 ๋กœ ์„ธํŒ…์„ ํ•˜๋ฉด

CPU ๋Š” Single Step mode ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ , ์ด ๋ชจ๋“œ์ผ ๊ฒฝ์šฐ์—” ๋ช…๋ น์–ด๋ฅผ 1 ๊ฐœ ์‹คํ–‰ํ•˜๊ณ 

EXCEPTION_SINGLE_STEP(0x80000004)๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ทธ ํ›„ TF ๊ฐ’์„ ๋‹ค์‹œ 0 ์œผ๋กœ

์„ธํŒ…ํ•œ๋‹ค. ๋””๋ฒ„๊น… ์ค‘์—๋Š” ํ•ด๋‹น ๋ ˆ์ง€์Šคํ„ฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ์ฆ‰ ์˜ˆ์™ธ๋Š” ๋ฐœ์ƒํ•˜์ง€

์•Š์„ ๊ฒƒ์ด๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

void main() { __try {

__asm { pushf mov [esp], 0x100 // Set TF to 1 popf } } __except (EXCEPTION_EXECUTE_HANDLER) { printf("Not Debugged"); } }

C) NtGlobal Flag

ํ•ด๋‹น Flag ๋Š” PEB ๊ตฌ์กฐ์ฒด 0x68 ๋ฒˆ์จฐ์— ์กด์žฌํ•˜๋Š” ๋ฉค๋ฒ„๋กœ, ๋””๋ฒ„๊ฑฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด 0 ์ด ์•„๋‹Œ

๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ  ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด 0x0 ์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

- PEB Structure

- typedef struct _PEB {

- ...

- ULONG NumberOfProcessors;

- ULONG NtGlobalFlag;

- UNION _LARGE_INTEGER CriticalSectionTimeout;

- ...

- } PEB, *PPEB;

ํ™•์ธํ•ด ๋ณด๋ฉด 0x70 ์ด๋ž€ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋Š”

FLG_HEAP_ENABLE_TAIL_CHECK 0x10

FLG_HEAP_ENABLE_FREE_CHECK 0x20

FLG_HEAP_ENABLE_VALIDATE_PARAMETERS 0x40

์ด 3 ๊ฐœ ๊ฐ’์ด ํ•ฉ์ณ ์ €์„œ 0x70 ์ด ๋œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __asm { mov eax, fs:[0x30] mov eax, [eax + 0x68] cmp eax, 0x0 jne debug push 1 call exit debug: }

printf("Debugged"); }

D) Heap Flag

PEB ๊ตฌ์กฐ์ฒด์— 0x18 ์— ์กด์žฌํ•˜๋Š” ProcessHeap ๊ตฌ์กฐ์ฒด์— Flags ์™€ ForceFlags ๋‘ flag ๋ฅผ

์ด์šฉํ•ด์„œ ๋””๋ฒ„๊น… ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. Flags ๋Š” 0xc ์— ์œ„์น˜ํ•˜๊ณ  ForceFlags ๋Š” 0x10 ์—

์œ„์น˜ํ•œ๋‹ค.

- PEB Structure

- typedef struct _PEB {

- ...

- ULONG MaximumNumberOfHeaps ;

- PPVOID *ProcessHeap;

- PVOID GdiSharedHandleTable;

- ...

- } PEB, *PPEB;

Flags ๋Š” ๋””๋ฒ„๊น… ์ค‘์ด๋ฉด 0x50000062 ๋กœ ๊ฐ’์ด ์„ค์ •๋˜๊ณ  ์•„๋‹Œ ๊ฒฝ์šฐ์—” 0x2 ๋กœ ์„ค์ •๋œ๋‹ค.

ForceFlags ๊ฐ™์€ ๊ฒฝ์šฐ์—” ๋””๋ฒ„๊น… ์ค‘์ด๋ฉด 0x40000060 ์•„๋‹Œ ๊ฒฝ์šฐ์—” 0x0 ์œผ๋กœ ์„ค์ •๋œ๋‹ค.

- ProcessHeap Structure

- typedef struct _ProcessHeap {

- Entry _HEAP_ENTRY

- UINT Signature;

- UINT Flags;

- UINT ForceFlags;

- UINT VirtualMemoryThreshold;

- ...

- } ProcessHeap;

๊ฐ’๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์ •์˜๋œ ๊ฐ’์œผ๋กœ ์„ค์ •์ด ๋œ๋‹ค.

HEAP_GROWABLE 0x2

HEAP_TAIL_CHECKING_ENABLED 0x20

HEAP_FREE_CHECKING_ENABLED 0x40

HEAP_SKIP_VALIDATION_CHECKS 0x10000000

HEAP_VALIDATE_PARAMETERS_ENABLED 0x40000000

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- Flags Example

void main() { __asm {

mov eax, fs:[0x30] mov eax, [eax + 0x18] mov eax, [eax + 0xc] cmp eax, 0x2 jne debug

push 1 call exit

debug: } printf("debugged");

}

- ForceFlags Example

void main() { __asm { mov eax, fs:[0x30] mov eax, [eax + 0x18] mov eax, [eax + 0x10] cmp eax, 0x0 jne debug push 1 call exit debug : } printf("debugged");

}

2.6. Based on VM Detection A) Red Pill

- SIDT

IDT(Interrupt Descriptor Table)๋ž€ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ์— ๊ด€ํ•œ ๋””์Šคํฌ๋ฆฝํ„ฐ๋“ค์„ ๋ชจ์•„๋‘”

๊ตฌ์กฐ์ฒด์ด๋‹ค. ํ”„๋กœ์„ธ์„œ๋‹น 1 ๊ฐœ์˜ IDT ๋ ˆ์ง€์Šคํ„ฐ(IDTR)๊ฐ€ ์กด์žฌํ•˜๊ณ  Guest OS ์™€ Host OS ๊ฐ€

๊ตฌ๋™ ์ค‘์ด๋ฉด IDT ๋Š” ์žฌ๋ฐฐ์น˜ ๋œ๋‹ค. IDTR ๋กœ IDT ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํ†ตํ•ด์„œ

VM ์„ ํƒ์ง€ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. SIDT(Store Interrupt Descriptor Table)๋ช…๋ น์œผ๋กœ IDTR ์„

๊ฐ€์ ธ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. VMware ๋‚˜ VirtualPC ๋“ฑ์˜ VM ์—์„œ๋Š” ์ฃผ๋กœ 0xd0000000 ์ด์ƒ์˜ ์ฃผ์†Œ๊ฐ€

๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๊ฐ€์ƒ ๋จธ์‹ ์œผ๋กœ ํƒ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ฒ•์€

๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์„œ๊ฐ™์ด IDT ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด ์˜ค์ž‘๋™ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋˜ํ•œ

์š”์ฆ˜ VM ๋“ค์˜ EPT ๊ธฐ๋Šฅ ๊ฐ™์ด ๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ID ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฐธ๊ณ ๋กœ VMware ๋Š” 0xffxxxxxx ์˜ ์ฃผ์†Œ๊ณ , VirtualPC ๋Š” 0xe8xxxxxx. ๋กœ์ปฌ์—์„œ ์œˆ๋„์šฐ๋Š”

0x80xxxxxx, ๋ฆฌ๋ˆ…์Šค๋Š” 0xc0xxxxxx.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { unsigned char idt[6]; __asm { sidt idt } if ((int)idt[5] >= 0xd0) printf("VM"); }

B) No Pill

No Pill ๊ธฐ๋ฒ•์€ Red Pill ๊ธฐ๋ฒ•๊ณผ ๋‹ค๋ฅด๊ฒŒ IDT ๊ตฌ์กฐ์ฒด๋ฅผ ์šด์˜์ฒด์ œ๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์„ธ์„œ์—

ํ• ๋‹นํ•˜๋Š”๊ฒŒ ์ฐจ์ด์ด๋‹ค. Host OS ์—์„œ๋Š” LDT ์œ„์น˜๋Š” 0 ์ด๊ณ  VM ์—์„œ๋Š” 0 ์ด ์•„๋‹ˆ๋‹ค.

- SGDT

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ SGDT(Store Global Descriptor Table)๋ช…๋ น์œผ๋กœ GDTR(Global Descriptor

Table Register)์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์œ„์— LDT ๋ฅผ ์ด์šฉํ•œ ํƒ์ง€์™€ ๋น„์Šทํ•˜๊ฒŒ ์ตœ์ƒ์œ„ ๋ฐ”์ดํŠธ๊ฐ€

0xff ์ธ ๊ฒƒ์„ ํ™•์ธํ•ด VM ์„ ํŒ๋ณ„ํ•œ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { UCHAR gdt[6]; __asm { sgdt gdt } UINT gdta = *((PULONG)&gdt[2]); if ((gdta >> 24) == 0xff) printf("VM"); }

- SLDT

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ SLDT(Store Local Descriptor Table)๋ช…๋ น์œผ๋กœ LDTR(Local Descriptor

Table Register)๋กœ ๋ถ€ํ„ฐ Segment Selector ๋ฅผ ๊ตฌํ•ด, ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„  ์ฃผ์†Œ๊ฐ€

0x0000 ์ด๋‹ˆ ๋งŒ์•ฝ ์ด ๊ฐ’์ด ์•„๋‹ˆ๋ฉด VM ์œผ๋กœ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { UCHAR ldt[2]; __asm { sldt ldt } USHORT ldta = *((PUSHORT)&ldt); if (ldta != 0x0000) printf("VM"); }

C) I/O Port

I/O ํฌํŠธ๋Š” Guest OS ํ•˜๊ณ  Host OS ๊ฐ€ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ต์‹  ์ฑ„๋„์ด๋‹ค. I/O ์—

์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋Š” EFLAGS ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰๋˜๋Š”๋ฐ ์ด๋Š” ์ปค๋„ ๋ ˆ๋ฒจ์—์„œ๋งŒ ๋™์ž‘์„

ํ•œ๋‹ค. ์œ ์ € ๋ ˆ๋ฒจ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. I/O ๋ฅผ ์œ„ํ•œ ๋ช…๋ น์—์„œ๋Š” in ๊ณผ out ์ด

์žˆ๋Š”๋ฐ, Guest OS ์—์„œ in ๋ช…๋ น ์‹คํ–‰ ์‹œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

- verison

void main() { UINT a = 0, b = 0; __try { __asm { pushad mov eax, 0x564d5868 // vmware magic valu, VMXh

mov ecx, 0xa // vmware version mov dx, 0x5658 // vmware I/O port, VX in eax, dx mov a, ebx // check is it VM mov b, ecx // get version popad } } __except (EXCEPTION_EXECUTE_HANDLER) { return; } if (a == 'VMXh') { printf("VM, version : "); switch (b) { case 1: printf("Express"); break; case 2: printf("ESX"); break; case 3: printf("GSX"); break; case 4: printf("Workstation"); break; default: printf("Unknown"); break; } } }

- memory size

void main(void) { __try { __asm { pushad mov eax, 0x564d5868 // vmware magic value : VMXh mov ecx, 0x14 // memory size mov dx, 0x5658 // vmware I/O port : VX in eax, dx cmp eax, 0 jbe notvm push 1 call exit notvm : popad } printf("Not VM"); } __except (EXCEPTION_EXECUTE_HANDLER) { return; } }

D) STR

STR(Store Task Register)๋ช…๋ น์œผ๋กœ Task Register ๊ฐ’์„ ๋ฐ›์•„์˜ค๋Š”๋ฐ, ์ฒ˜์Œ์ด

0x0040 ์œผ๋กœ ์‹œ์ž‘์„ ํ•˜๊ฒŒ ๋˜๋ฉด VM ์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { UCHAR mem[4] = { 0, }; __asm { str mem } if (mem[0] == 0x00 && mem[1] == 0x40) printf("VM"); }

E) SMSW

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ SMSW(Store Machine Status Word)๋ช…๋ น์œผ๋กœ ๋จธ์‹ ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์ €์žฅํ•˜๋Š”

๋ช…๋ น์ด๋‹ค. CR0 ๋ ˆ์ง€์Šคํ„ฐ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค. ์šด์˜์ฒด์ œ๋งˆ๋‹ค ๊ฐ’์ด ๋‹ค๋ฅด๊ณ  Host ์™€ Guest ์—

๋”ฐ๋ผ ๋˜ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Windows 10 ์—์„œ๋Š” 0x80050033 ๊ฐ’์„ ๊ฐ€์ง€๊ณ  VM Windows

10 ์—์„œ๋Š” 0x80050031 ์ด๋ž€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  VM Windows 7 ์—์„œ๋Š” 0x80010031 ์„ ๊ฐ€์ง„๋‹ค.

์ด๋Ÿฐ ๊ฐ’๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __asm { xor eax, eax smsw eax; cmp eax, 0x80050031 // Windows 10 on VM je vm cmp eax, 0x80010031 // Windows 7 on VM je vm push 1 call exit vm: } printf("VM"); }

F) CPUID

CPUID ๋ช…๋ น์–ด๋Š” CPU ์‹๋ณ„์„ ์œ„ํ•œ ๋ช…๋ น์–ด์ด๋‹ค. ํŒŒ๋ผ๋ฉ”ํ„ฐ(EAX ๊ฐ’)์— ํŠน์ • ๊ฐ’์„ ๋„ฃ์–ด ์ •๋ณด๋ฅผ

์–ป์–ด ํฌ๊ฒŒ 2 ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ VM ํƒ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, EAX ์— 1 ์„ ๋„ฃ์—ˆ์„ ๋•Œ ํ•˜๊ณ 

0x40000000 ์ผ ๋•Œ์ด๋‹ค. ๋จผ์ € EAX ์— 1 ์„ ๋„ฃ์—ˆ์„ ๋•Œ๋Š”, Guest OS ๊ฐ€ ์ผœ์ ธ ์žˆ์ง€ ์•Š์€

ํ‰์ƒ์‹œ๋ผ๋ฉด EAX ๊ฐ’์ด 1 ์ผ ๋•Œ CPUID ์‹คํ–‰ ์‹œ 3 ๋ฒˆ์งธ ECX ๊ฐ’์€ 0 ์ด์—ฌ์•ผํ•œ๋‹ค. Guest OS ๊ฐ€

์ผœ์ ธ ์žˆ์œผ๋ฉด ECX ๋Š” VMware ์—์„œ ์ง€์ •ํ•ด์ค€ serial ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์žˆ์–ด 1 ์ผ ๊ฒƒ์ด๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __asm { mov eax, 1 xor ecx, ecx push ebx cpuid pop ebx sar ecx, 0x1f cmp cl, 1 je detect push 1 call exit detect: } printf("VM"); }

๋‘๋ฒˆ์จฐ๋กœ EAX ๊ฐ’์ด 0x40000000 ์ผ ๋•Œ, 12 ๋ฐ”์ดํŠธ ๊ธธ์ด์˜ ๋ฌธ์ž์—ด์„ EBX, ECX, EDX ์—

๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋ฌธ์ž์—ด์—๋Š” ์žฅ์น˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š”๋ฐ ๋กœ์ปฌ ๋จธ์‹ ์ผ ๊ฒฝ์šฐ์—” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ž์—ด์ด

๋ณด์ด์ง€ ์•Š์ง€๋งŒ VM ์ผ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น VM ์— ๊ด€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

- VMware : โ€œVMwareVMwareโ€

- VirtualBox : โ€œVBoxVBoxVBoxโ€

- Parallels : โ€œprl hyperv โ€œ

- KVM : โ€œKVMKVMKVM\0\0\0โ€

- Xen : โ€œXenVMM XenVMMโ€

- Microsoft Hyper-V, Windows Virtual PC : โ€œMicrosoft Hvโ€

ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ฒ• ๋˜ํ•œ CPU ๊ฐ€ Hyper Thread ๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ Guest OS ๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

์˜ค์ž‘๋™ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

G) MAC Address

VM ์žฅ์น˜๋“ค์ด ๊ฐ–๋Š” ๊ณ ์œ ํ•œ MAC Address ์˜ ์ผ๋ถ€๋ฅผ ์ฒดํฌํ•ด ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ์ฃผ๋กœ ๋งฅ

์ฃผ์†Œ์˜ ๋งจ ์•ž์˜ 3 ๊ฐœ์˜ ํ•„ํŠธ์—๋Š” ์ œ์กฐ์‚ฌ์˜ ํŠน์ • ๊ฐ’์„ ๋„ฃ๊ฒŒ ๋˜๋Š”๋ฐ ๋ฌผ๋ก  VMware ๋‚˜

Virtual PC ๊ฐ™์€ VM ๋“ค๋„ ํŠน์ • ๊ฐ’๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

00:05:69 (VMware)

00:0C:29 (VMware)

00:1C:14 (VMware)

00:50:56 (VMware)

08:00:27 (VirtualBox)

00:03:ff (Virtual PC)

00:0d:3a (Virtual PC)

00:50:f2 (Virtual PC)

7c:1e:52 (Virtual PC)

00:12:5a (Virtual PC)

00:15:5d (Virtual PC)

00:17:fa (Virtual PC)

28:18:78 (Virtual PC)

7c:ed:8d (Virtual PC)

00:1d:d8 (Virtual PC)

00:22:48 (Virtual PC)

00:25:ae (Virtual PC)

60:45:bd (Virtual PC)

dc:b4:c4 (Virtual PC)

00:1c:42 (Parallels)

๋งฅ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { ULONG len = 0; PIP_ADAPTER_INFO p; if (GetAdaptersInfo(p, &len) == ERROR_BUFFER_OVERFLOW) { p = (PIP_ADAPTER_INFO)new char[len]; GetAdaptersInfo(p, &len);

printf("MAC : %#x\n", p->Address); // VM Detect with MAC if (p->Address[0] == 0x08 && p->Address[1] == 0x00 &&

p->Address[2] == 0x27) printf("Virtual Box"); delete p; } }

H) ETC

์œ„์— ์†Œ๊ฐœ๋œ ๊ธฐ๋ฒ• ์ด์™ธ์—๋„ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•œ ๊ธฐ๋ฒ•๋“ค์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ๋‹ค. ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•ด

๋ณด๊ฒ ๋‹ค.

- VM Process

VM ํ™˜๊ฒฝ์—์„œ์ฃผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์ด ์žˆ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค ์กด์žฌ ์œ ๋ฌด๋กœ VM ํ™˜๊ฒฝ์ž„์„

์•Œ ์ˆ˜ ์žˆ๋‹ค.

VMtoolsd.exe (VMware)

VMwaretrat.exe (VMware)

VMwareUser.exe (VMware)

VMwareService.exe (VMware)

VMwareTray.exe (VMware)

Vmacthlp.exe (VMware)

vboxservice.exe (VirtualBox)

vboxtray.exe (VirtualBox)

- VM Files

๋‹ค์Œ์€ VM ์— ์žˆ๋Š” ์ฃผ์š” ํŒŒ์ผ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•ด๋‹น ํŒŒ์ผ ์œ ๋ฌด๋กœ VM ์„

ํŒ๋ณ„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๋Œ€ํ‘œ์  ํŒŒ์ผ๋“ค์„ ์ ์–ด๋ณด์•˜๋‹ค.

C:\Windows\System32\Driver\Vmmouse.sys (VMware)

C:\Windows\System32\Driver\vm3dgl.dll (VMware)

C:\Windows\System32\Driver\vmdum.dll (VMware)

C:\Windows\System32\Driver\vm3dver.dll (VMware)

C:\Windows\System32\Driver\vmtray.dll (VMware)

C:\Windows\System32\Driver\VMToolsHook.dll (VMware)

C:\Windows\System32\Driver\vmmousever.dll (VMware)

C:\Windows\System32\Driver\vmhgfs.dll (VMware)

C:\Windows\System32\Driver\vmGuestLib.dll (VMware)

C:\Windows\System32\Driver\VmGuestLibJava.dll (VMware)

C:\Windows\System32\Driversvmhgfs.dll (VMware)

C:\Windows\System32\Driver\VBoxMouse.sys (VirtualBox)

C:\Windows\System32\Driver\VBoxGuest.sys (VirtualBox)

C:\Windows\System32\Driver\VBoxSF.sys (VirtualBox)

C:\Windows\System32\Driver\VBoxVideo.sys (VirtualBox)

C:\Windows\System32\vboxdisp.dll (VirtualBox)

C:\Windows\System32\vboxhook.dll (VirtualBox)

C:\Windows\System32\mrxnp.dll (VirtualBox)

C:\Windows\System32\vboxogl.dll (VirtualBox)

C:\Windows\System32\vboxoglarrayspu.dll (VirtualBox)

C:\Windows\System32\vboxoglerrorspu.dll (VirtualBox)

C:\Windows\System32\vboxoglfeedbackspu.dll (VirtualBox)

C:\Windows\System32\vboxoglpackspu.dll (VirtualBox)

C:\Windows\System32\vboxoglpassthroughspu.dll (VirtualBox)

C:\Windows\System32\vboxservice.exe (VirtualBox)

C:\Windows\System32\vboxtray.exe (VirtualBox)

C:\Windows\System32\VBoxControl.exe (VirtualBox)

dbghelp.dll (Sandboxie)

sbiedll.dll (Sandboxie)

- Running Services

์ด๋ฒˆ์—๋Š” ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์„œ๋น„์Šค๋“ค๋กœ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ํ”„๋กœ์„ธ์Šค๋“ค์ด ํ˜„์žฌ

์‹คํ–‰ ์ค‘์ด๋ฉด VM ์œผ๋กœ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ๋Œ€ํ‘œ์  VM ๊ด€๋ จ ์„œ๋น„์Šค๋“ค์ด๋‹ค.

VMTools (VMware)

Vmxnet (VMware)

Vmvss (VMware)

Vmscsi (VMware)

Vmhgfs (VMware)

Vmmouse (VMware)

VMMEMCTL (VMware)

Vmrawdsk (VMware)

Vmx_svga (VMware)

Vmware Tools (VMware)

Vmware Physical Disk Helper Service (VMware)

- Registry

VM ์œ„์—์„œ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋„ Host OS ์™€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๋˜ํ•œ VM ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—

์ผ๋ถ€ ์ €์žฅ๋˜์–ด ์žˆ์œผ๋‹ˆ ๊ฐ’์„ ํ™•์ธํ•ด VM ํŒ๋ณ„์ด ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค.

SYSTEM\CurrentControlSet\Services\disk\Enum โ€“ 0 (VMware) [Hard Disk]

ํ•ด๋‹น ํ•„๋“œ์— VMware ๊ฐ€ ์žˆ์œผ๋ฉด VMware.

SYSTEM\CurrentControlSet\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001 (VMware) [Hard Disk Driver]

VMware ๋Š” DiskVMware_Virtual_IDE_Hard_Drive___________00000001 ๊ผด์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง.

SYSTEM\CurrentControlSet\Control\Class\{4D36E968~}\0000 - DriverDesc (VMware) [Video Driver]

VMware ๋Š” vmx_svga ๋ผ๋Š” ๋น„๋””์˜ค ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉ. ํ•ด๋‹น ํ•„๋“œ์— VMware ๋ฌธ์ž์—ด์ด ์žˆ๋Š”์ง€ ํ™•์ธ.

VMware SVGA 3D ์ด๋Ÿฐ ํ˜•์‹์˜ ๊ฐ’์ด ๋“ค์–ด์žˆ์Œ.

SYSTEM\CurrentControlSet\Control\VirtualDeviceDrivers (VMware)

ํ•ด๋‹น ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” Windows 7 ์—๋Š” ์กด์žฌํ•˜๊ณ  Windows 10 ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\root#vmwvmcihostdev โ€“ ClassGUID or Service (VMware)

ํ•ด๋‹น ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋Š” Windows 7 ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ Windows 10 ๋ถ€ํ„ฐ๋Š”

CriticalDeviceDatabase ์ž์ฒด๊ฐ€ ์—†๋‹ค. Service ์—๋Š” vmci ๋ผ๋Š” ๊ฐ’์ด ๋“ค์–ด์žˆ๋‹ค.

SYSTEM\CurrentControlSet\Enum\SCSI\Disk&Ven_VMware_&Prod_Vmware_Virtual_S โ€“ [5&22be343f&0&000000] (VMware)

VMware ์ธ ๊ฒฝ์šฐ์—” SCSI ์•„๋ž˜ ์ €๋Ÿฐ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์ง€๋งŒ ๋กœ์ปฌ๋จธ์‹ ์—์„  SCSI ์ž์ฒด๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

HARDWARE\DEVICEMAP\Scsi\Scsi Port 2\Scsi Bus 0\Target Id 0\Logical Unit Id 0 - Identifier (VMware)

VMware ๋Š” VMware, Vmware Virtual S1.0 ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„๋‹ค. ๋˜ ์œˆ๋„์šฐ 7 ๊ฐ™์€ ๊ฒฝ์šฐ์—” Scsi

Port 2 ์ง€๋งŒ, ์œˆ๋„์šฐ 10 ์ธ ๊ฒฝ์šฐ์—” Scsi Port 0 ์ด๋‹ค.

HKLM\SOFTWARE\Vmware Inc.\\\Vmware Tools (VMware)

- Invalid API Parameters

๋Œ€๋ถ€๋ถ„์˜ API ํ•จ์ˆ˜๋“ค์€ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ธ์ž๋ฅผ ๋„˜๊ฒจ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฑฐ๋‹ค.

ํ•˜์ง€๋งŒ ์ƒŒ๋“œ๋ฐ•์Šค ๊ฐ™์€ ์•ˆํ‹ฐ ๋ฉ€์›จ์–ด ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋Š” ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ์ ์ด

์žˆ๋‹ค.

- Modern CPU Instructions

์˜ˆ๋ฅผ ๋“ค์–ด ์ธํ…” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์…‹๋“ค ์ค‘ MMX, FPU, SSE ๊ฐ™์€ ๋ช…๋ น์–ด ์…‹๋“ค์„ VM ์—์„œ ์ง€์›ํ•˜์ง€

์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ์ธ์ŠคํŠธ๋Ÿญ์…˜ ํ•ด์„์œผ๋กœ

์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

- Undocumented Instructions

๋ฌธ์„œํ™” ๋˜์ง€ ์•Š์€ ๋ช…๋ น์–ด๋“ค์„ VM ์—์„œ ์ง€์›์ด ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฆ‰ ๋งŒ์•ฝ ์‹คํ–‰์ด

๋˜๋ฉด ์•„๋ฌด ์ž‘๋™์„ ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘์— ํ•˜๋‚˜์ผ ๊ฒƒ์ด๋‹ค.

์•„๋ž˜๋Š” ๊ทธ๋Ÿฌํ•œ ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์ด๋‹ค.

db 0xf1; // icebp db 0xd6; // setalc // salc db 0xc0, 0xf0 // sal db 0xf7, 0xc8 // test db 0xf, 0x20 // mov eax, cr2

- Time Locks

๋Œ€๋ถ€๋ถ„ ๋ฉ€์›จ์–ด ์ž๋™ํ™” ๊ฒ€์‚ฌ ์‹œ์Šคํ…œ(ex) malwares.com, virustotal.com)๋“ค์€ time

out ์ด๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์— ์ œํ•œ์ด ์žˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์˜ˆ๋ฅผ ๋“ค์–ด time

out ์ด max ๊ฐ’์ด 30 ์ดˆ๋ผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์„ 30 ์ดˆ๊ฐ„ sleep ๋“ฑ์œผ๋กœ ๋ฉˆ์ถฐ ์žˆ๋‹ค 30 ์ดˆ๊ฐ€ ์ง€๋‚œ

ํ›„์— ์ž‘๋™์„ ํ•˜๊ฒŒ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ช‡๋ช‡ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์ด ๊ณผ์ •์„ ์ž๋™์œผ๋กœ ๋„˜์–ด๊ฐ€์ง€๊ฒŒ

ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ๋ฌด์˜๋ฏธํ•œ ์ž‘์—…์„ ์˜ค๋ž˜ํ•˜๋Š” ๊ณผ์ •์˜ ์‹œ๊ฐ„์„ ์ธก์ •ํ•ด ๋‘์—ˆ๋‹ค

์ด๊ฒŒ ์ง€๋‚˜์น˜๊ฒŒ ์งง์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์œผ๋ฉด ์ด ๊ณผ์ •์„ ์ง€๋‚˜์ณค๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __asm { rdtsc xchg ebx, eax mov ecx, 0x121212 // set loop cnt up: loop up rdtsc sub eax, ebx cmp eax, 0x1000 // must over 0x1000 jbe emul push 1 call exit emul: } printf("Emulator"); }

- ETC

์œ„์—์„œ Red Pill, No Pill ๋“ฑ ์—์„œ ์†Œ๊ฐœํ•œ ๋ช…๋ น์–ด ์ด์™ธ์—๋„ MM7, FST ๋“ฑ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ  ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋ฒ•๋“ค์ด ์žˆ๋‹ค.

2.7. Based on Timing A) RDTSC

๋™์  ๋ถ„์„์„ ํ•  ๋•Œ ์ฃผ๋กœ ์—ฌ๋Ÿฌ ๊ณณ์— breakpoint ๋ฅผ ์„ธํŒ…ํ•ด ๋†“๊ณ  ๋ถ„์„์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ

์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ช…๋ น์ธ rdtsc ์™€ rdtsc ์‚ฌ์ด์— ์žˆ๋Š” ์ฝ”๋“œ์— breakpoint ๋ฅผ ์„ค์น˜ํ•˜๊ณ 

๊ฐ’์„ ๋ณด๊ณ  ๋„˜์–ด๊ฐ„๋‹ค ํ–ˆ์„ ๋•Œ ์•„๋ฌด๋ฆฌ ๋นจ๋ผ๋„ ์•„๋ฌด๋Ÿฐ ๋ฐฉํ•ด ์—†์ด ์‹คํ–‰๋  ๋•Œ์™€ 0.x ์ดˆ์˜

์ฐจ์ด๋Š” ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ๊ฑธ ์ด์šฉํ•œ ๊ธฐ๋ฒ•์ด ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ํƒ์ง€

๊ธฐ๋ฒ•์ด๋‹ค. RDTSC(ReaD Time Stamp Counter)๋ช…๋ น์–ด ๋ง๊ณ ๋„ API ํ•จ์ˆ˜๋กœ๋Š” GetTickCount,

QueryPerformanceTime ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋…ํŠนํ•˜๊ฒŒ

CreateTransaction ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋„ ๊ตฌํ˜„์„ ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void count() { for (int i = 0; i < 10000; ++i); } void main() { UINT start, end; __asm { rdtsc mov start, eax call count // do something! loop 0 ~ 9999 rdtsc mov end, eax mov eax, end sub eax, start cmp eax, 0x1000 // time jbe notdebug push 1 call exit notdebug: mov start, eax } printf("diff %lu", start); }

2.8. Based on Checksums A) Hash Checking

์ด๋Ÿฐ ์ ์„ ์ด์šฉํ•ด Hash Checking ๊ธฐ๋ฒ•์€ ํ•จ์ˆ˜ ์ฝ”๋“œ๋“ค์˜ Hash ๊ฐ’์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด ๋‘” ๋‹ค์Œ์—

๊ทธ ๊ฐ’๊ณผ ์‹คํ–‰ ์ค‘๊ฐ„์— ํ™•์ธ ํ•œ Hash ๊ฐ’๊ณผ ๊ฐ™์€ ์ง€ ํ™•์ธ ํ•ด ํŒจ์นญ์ด ๋ฌ๋Š”์ง€ ํƒ์ง€ ํ•  ์ˆ˜

์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void func(void) { printf("Hello!");

} void main() { DWORD checksum = 0x5792b8ac; // pre-calculated __asm { pushad mov ecx, offset main mov esi, offset func sub ecx, esi // func size - loop cnt xor eax, eax // checksum xor ebx, ebx calc : // checksum calc algorithm movzx ebx, ds:[esi] add eax, ebx rol eax, 1 inc esi loop calc cmp eax, checksum // compare jne debug push 1 call exit debug : popad } printf("Debugged"); }

2.9. Etc A) Stack Segment

SS(Stack Segment)๋ฅผ push ํ•˜๊ณ  pop ํ•˜๊ฒŒ ๋˜๋ฉด ๋””๋ฒ„๊ฑฐ๊ฐ€ ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์ž˜๋ชป ํ•ด์„ํ•ด ๋ฐ”๋กœ

๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์€ ๋˜์ง€๋งŒ step over ๋˜๊ณ  ๊ทธ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์˜ฎ๊ฒจ์ง„๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void stepover() { __asm { mov eax, 0xdeadbeef } } void main() { __asm { push ss pop ss call stepover // This would be stepped over xor eax, eax } }

B) TLS Callback

TLS(Thread Local Storage)๋ž€ EP(Entry Point)๊ฐ€ ์‹œ์ž‘ ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ๋ฃจํ‹ด์ด๋‹ค.

๋น„์œ ํ•˜๋ฉด ๋ฆฌ๋ˆ…์Šค์— ctors ๊ฐ™์€ ์กด์žฌ๋‹ค. ์ง์ ‘ PE ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด TLS ๊ธฐ๋Šฅ์„ ๋„ฃ์œผ๋ฉด

tls section ์ด ๋”ฐ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ main ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ํ•ด๋‹น callback ์ด

์‹คํ–‰๋˜๋Š” ์ ์„ ์ด์šฉํ•ด ํ•ด๋‹น ํ•จ์ˆ˜ ์•ˆ์— ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•๋“ค์„ ์ฃผ๋กœ ๋„ฃ์–ด๋‘๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.

data_seg ๋Š” .CRT$XL? ํ˜•์‹์œผ๋กœ ?์— B~Z ๊นŒ์ง€ ๋„ฃ์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  A ๋Š” ์‚ฌ์šฉ์ด

๋ถˆ๊ฐ€ํ•˜๋‹ค๋Š” ๊ฒƒ.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์‹คํ–‰๊ฒฐ๊ณผ main ์—์„œ๋Š” ๋ณผ ์ˆ˜ ์—†์—ˆ๋˜ ์—ฐ์‚ฐ์ธ ++stat;

์‹คํ–‰์œผ๋กœ 0 ์ด ์•„๋‹Œ 1 ์ด ์ถœ๋ ฅ๋  ๊ฑฐ๋‹ค.

int stat = 0; #pragma comment(linker, "/INCLUDE:__tls_used") void NTAPI tls(PVOID instance, DWORD reason, PVOID reserved) { ++stat; } #pragma data_seg(".CRT$XLB") PIMAGE_TLS_CALLBACK TLS = tls; // PIMAGE_TLS_CALLBACK TLS[] = { tls, 0 }; #pragma data_seg() void main() { printf("State : %d\n", stat);

}

C) CC Scanning

์ฃผ๋กœ ๋””๋ฒ„๊น… ์‹œ์— breakpoint ๋ฅผ ์„ค์ •ํ•ด์„œ ๋™์  ๋ถ„์„์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ด ๋•Œ breakpoint ๋ฅผ

์„ค์ •์„ ํ•˜๋ฉด 0xcc(int 3) ๋ž€ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค. ์ด ๊ฐ’์„ ์ง€์ •ํ•ด์ค€ ํ•จ์ˆ˜(์•„๋ž˜์—์„ 

func)๋ฅผ 1 ๋ฐ”์ดํŠธ์”ฉ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void func() { __asm { mov eax, 0xdeadbeef } } void main() { __asm { popad mov ecx, offset main mov esi, offset func sub ecx, esi // size of func() xor ebx, ebx scan : movzx ebx, ds : [esi] // one by one cmp ebx, 0xcc // compare with 0xcc(bp) je bpx inc esi cmp ecx, 0 je end loop scan end : jmp nobpx bpx : rdtsc call eax // go somewhere nobpx : call func // no breakpoints are detected popad } }

3. Anti-Disassembly ์•ˆํ‹ฐ ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒํŠธ์—์„œ๋Š” ์ฝ”๋“œ๋ฅผ ๋‚œ๋…ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋””๋ฒ„๊ฑฐ ๊ฐ™์€ ๋ถ„์„ํˆด์ด ์ œ๋Œ€๋กœ

๋ถ„์„ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

3.1. Code Obfuscating - Code Virtualizing

์ด๋ฒˆ ๋ฌธ์„œ์—์„œ๋Š” ์ฝ”๋“œ ๊ฐ€์ƒํ™”์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๊ณ  ๊ตฌํ˜„ ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๊ธฐ์—” ๋งŽ์•„ ์ž์„ธํ•œ

์„ค๋ช…์€ ๋‹ค๋ฃจ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ ๊ฐ€์ƒํ™”๋ž€ ์ฃผ๋กœ ์šฐ๋ฆฌ๋Š” ์ธํ…” ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์…‹์— ์ฃผ์–ด์ง„ ๋Œ€๋กœ ์ •์˜๋œ opcode ์—

๋ช…๋ น์–ด๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ธฐ๋ฒ•์€ ์ง์ ‘ ์ž์‹ ์ด opcode ๋‚˜ register ๋ฅผ ๊ฐ€์ƒํ™” ์‹œ์ผœ

์ƒˆ๋กœ์šด ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ฒด๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด opcode 0x1 ๋ฅผ mov ๋กœ ์ •ํ•ด๋†“๊ณ 

์ง์ ‘ ์ด์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฑฐ๋‹ค.

์•„๋งˆ ํ•ด๋‹น ๊ธฐ์ˆ ์— ๋Œ€ํ•ด์„  ๋‹ค์Œ ๋ฌธ์„œ์—์„œ ์ •๋ฆฌํ•ด ๋‹ค๋ฃจ๊ฒŒ ๋  ์˜ˆ์ •์ด๋‹ค.

- VFTables

VFTable(Virtual Function Table)์ด๋ž€ ํด๋ž˜์Šค์— ์„ ์–ธ ์‹œ ๊ฐ€์ƒ ํ•จ์ˆ˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธํ•˜๊ฒŒ

๋˜๋ฉด vftable ์ด๋ž€ ๊ณณ์— ๊ฐ€์ƒ ํ•จ์ˆ˜๋“ค์˜ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์ด๋‹ค. ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด

vftable ์ฃผ์†Œ๊ฐ€ ์žˆ๋Š” __vfptr ๋ฅผ ์ฐธ์กฐ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ๋˜๋ฉด ์ผ์ข…์˜ ์ฝ”๋“œ

๋‚œ๋…ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ตฌ์ฒด์ ์ธ vftable ์— ๊ด€ํ•œ ์„ค๋ช…์€ class ์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ ๊ฐ€์ƒ ํ•จ์ˆ˜์—

๊ด€ํ•œ ์„ค๋ช…์„ ์ฐพ์•„๋ณด๊ธธ ๋ฐ”๋ž€๋‹ค.

์•„๋ž˜๋Š” PoC ์ฝ”๋“œ์ด๋‹ค.

class _vft1 { public: virtual int add(int a, int b) { return a + b; } virtual int sub(int a, int b) { return a - b; } }; void main() {

_vft1 v; PVOID *vf = (PVOID *)(&v); PVOID *vft = (PVOID *)*(&vf[0]); // point __vfptr auto add = reinterpret_cast<int(__thiscall *)(PVOID, int, int)>(vft[0]); auto sub = reinterpret_cast<int(__thiscall *)(PVOID, int, int)>(vft[1]); printf("%d\n", add(&v, 2, 2)); printf("%d\n", sub(&v, 3, 1)); }

- Dummy Codes

๋”๋ฏธ ์ฝ”๋“œ๋ž€ ๊ฒฐ๋ก ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์—ญํ• ์„ ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ๋ญ‰์น˜๋กœ, ์ฝ”๋“œ ์‚ฌ์ด์‚ฌ์ด์— ์‚ฝ์ž…ํ•ด

์ฝ”๋“œ ๋‚œ๋…ํ™”๋ฅผ ์‹œํ‚ค๊ฑฐ๋‚˜ ๋ถ„์„ํˆด์ด ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์„ ์ž˜๋ชป ํ•ด์„ํ•˜๊ฒŒ ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•๊ณผ ๋”๋ฏธ ์ฝ”๋“œ๋ฅผ ์„ž์–ด ๋งŒ๋“ค์–ด ๋ณธ ์˜ˆ์ œ ์ฝ”๋“œ์ด๋‹ค. ์ฝ”๋“œ์—์„œ

๊ฐ•์กฐํ•œ ๋ถ€๋ถ„์ด ์‹ค์ œ๋กœ ํ•˜๋Š” ์—ญํ• ์ด๊ณ  ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ์ „๋ถ€ hexray ๋ฐฉํ•ด ์ฝ”๋“œ, ๋”๋ฏธ

์ฝ”๋“œ๋“ค์ด๋‹ค. ์‹ค์ œ๋กœ ์‹คํ–‰ ํ•ด ๋ณด๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ถ„์„ ํˆด์—์„œ๋Š” ๋ถ„์„์—

์‹คํŒจํ•  ๊ฒƒ์ด๋‹ค.

void main() { __asm { pushad xor ebx, ebx shr ebx, 4 add esi, ebx mov eax, fs:[0x18] // TEB mov ecx, 0xdeadbeef cmp ecx, 0xdead jne jumping add esp, 0x100 call esp // never gonna happen jumping: sub ecx, ebx push offset gogo + 10 add ecx, esi lea edx, [esi+ecx] mov eax, ds:[eax + 0x30] // TEB->PEB retn shr edx, 5 mov esi, edx gogo: add esp, 0xfff call esp call ebx // never gonna happen movzx eax, ds:[eax + 2] // jump to here, TEB->PEB->IsDebugged lea ebx, [eax + ecx] xor ecx, ecx

test eax, eax // check IsDebugged push esi lea esi, [esp + 0xc] pop edi push eax jnz debug push 1 jmp goout popad debug: rdtsc call eax // go somewhere goout: popad } printf("Not Debugged"); }

3.2. Packing A) Benchmark

์ฝ”๋“œ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Packing ์ด๋ž€ ๋ฐฉ๋ฒ•์ด ํ•œ๊ฐ€์ง€ ๋” ์žˆ๋‹ค. Packing ์ด๋ž€

์‹คํ–‰ํŒŒ์ผ์„ ์••์ถ• ๋ฐ ์•”ํ˜ธํ™” ํ•ด์„œ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. ๋ฌผ๋ก  ์••์ถ•ํ•˜๊ณ  ์•”ํ˜ธํ™”๋ฅผ ํ•ด

์ €์žฅํ•  ๋•Œ ๋‹ค๋ฅธ ์„น์…˜์„ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ณณ์— ๋ณตํ˜ธํ™”ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ €์žฅํ•ด ๋‘์–ด ์‹คํ–‰ ์‹œ

์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™” ํ›„ ์‹คํ–‰ํ•ด ์‹คํ–‰์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

- UPX

์ผ๋‹จ ํ”„๋ฆฌ์›จ์–ด๊ณ  ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ ๋‹ค์–‘ํ•œ ํฌ๋งท์„ ์ง€์›ํ•˜๊ณ  ํšจ์œจ์ด ์ข‹์œผ๋ฉฐ ๋งŽ์ด ์“ฐ์ด๋Š” ํŒจ์ปค ์ค‘

ํ•˜๋‚˜์ด๋‹ค. ํŒจํ‚น ์‹œ UPX0 ํ•˜๊ณ  UPX1 ์„น์…˜์ด ์ƒ์„ฑ๋˜๊ณ  UPX0 ์—๋Š” Section ๋ฐ ๊ธฐํƒ€ ์ •๋ณด

์ดˆ๊ธฐํ™” ๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  UPX1 ์—๋Š” ๋ณตํ˜ธํ™” ๋ฃจํ‹ด์ด ์กด์žฌํ•œ๋‹ค.

- ASPack/ASProtect

์ƒ์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๊ณ , x86, x64 ์œˆ๋„์šฐ ์‹คํ–‰ํŒŒ์ผ ํƒ€์ž… ๋‘˜ ๋‹ค ์ง€์›์„ ํ•œ๋‹ค. ์ฝ”๋“œ ์••์ถ•๋ฅ 

๋“ฑ์—์„œ๋Š” ๋ณ„๋กœ ์ข‹์ง„ ๋ชปํ•˜์ง€๋งŒ ์•”ํ˜ธํ™”๋Š” ์ž˜ ๋˜์–ด์žˆ๋‹ค. Stolen Bytes ๊ธฐ๋ฒ•์ด ์ตœ์ดˆ๋กœ ๊ตฌํ˜„๋œ

ํŒจ์ปค๋‹ค.

- Themida

๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ํŒจ์ปค ์ค‘ ํ•˜๋‚˜๋กœ ์•ˆํ‹ฐ ๋””๋ฒ„๊น…, ์•ˆํ‹ฐ ๋คํ•‘, ์•ˆํ‹ฐ VM ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„

์ง€์›ํ•˜๋ฉฐ ์ง์ ‘ ์ปค์Šคํ…€ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Section ๋“ค์˜ ์ด๋ฆ„์€ ๋žœ๋ค์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์—ฌ๋Ÿฌ ์ƒ์šฉ

ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ์‚ฌ์šฉ ์ค‘์ด๋‹ค. ํ˜„์žฌ ์นด์นด์˜คํ†ก ๊ฐ™์€ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ๋“ค๋„ Themida ํŒจ์ปค๋ฅผ

์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

3.3. Anti-Dumping

A) Erase PE Header

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜๋Š” PE Header ๋ฅผ ์ง€์›Œ dumping ์„ ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐฉํ•ดํ•  ์ˆ˜

์žˆ๋‹ค.

๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { DWORD oProt = 0; PCHAR base = (PCHAR)GetModuleHandle(NULL); // base address VirtualProtect(base, 4096, // x86 page size PAGE_READWRITE, &oProt); memset(base, 0, 4096); }

B) PE Header Modification

๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์˜ฌ๋ผ์™€ ์žˆ๋Š” PE ์ •๋ณด๋“ค์„ ์ง€์šฐ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด dumping ์„ ๋ฐฉํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•๋„

์žˆ์ง€๋งŒ, ์ง์ ‘ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ PE ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ๊ฐ™์ด strict ํ•œ PE ๊ฒ€์‚ฌ ๋ฃจํ‹ด์„

๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ ํˆด๋“ค์„ ๋ฌด๋ ฅํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ PE Header(IMAGE_OPTIONAL_HEADER)๊ตฌ์กฐ๋‹ค.

- Magic: 0x010B (HDR32_MAGIC) - MajorLinkerVersion: 0x0e - MinorLinkerVersion: 0x00 -> 14.00 - SizeOfCode: 0x00001400 - SizeOfInitializedData: 0x00001200 - SizeOfUninitializedData: 0x00000000 - AddressOfEntryPoint: 0x00001470 - BaseOfCode: 0x00001000 - BaseOfData: 0x00003000 - ImageBase: 0x00400000

- SectionAlignment: 0x00001000 - FileAlignment: 0x00000200 - MajorOperatingSystemVersion: 0x0006 - MinorOperatingSystemVersion: 0x0000 -> 6.00 - MajorImageVersion: 0x0000 - MinorImageVersion: 0x0000 -> 0.00 - MajorSubsystemVersion: 0x0006 - MinorSubsystemVersion: 0x0000 -> 6.00 - Win32VersionValue: 0x00000000 - SizeOfImage: 0x00007000 - SizeOfHeaders: 0x00000400 - CheckSum: 0x00000000 - Subsystem: 0x0003 (WINDOWS_CUI) - DllCharacteristics: 0x8000 - SizeOfStackReserve: 0x00100000 - SizeOfStackCommit: 0x00001000 - SizeOfHeapReserve: 0x00100000 - SizeOfHeapCommit: 0x00001000 - LoaderFlags: 0x00000000 - NumberOfRvaAndSizes: 0x00000010

- ImageBase

๊ธฐ๋ณธ์ ์œผ๋กœ Win32 ํ”„๋กœ๊ทธ๋žจ์—์„  ImageBase ๊ฐ’์€ 0x400000 ์œผ๋กœ ์„ธํŒ…์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด

๊ฐ’์„ ์กฐ์ž‘ํ•ด์„œ ์ผ๋ถ€ ๋ถ„์„ํˆด์—์„œ ๋กœ๋”ฉ์ด ์•ˆ๋˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๋ถ„์„์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

- EntryPoint RVA

PE Header ์— AddressOfEntryPoint ์ธ EntryPoint RVA ๊ฐ’์„ 0 ์œผ๋กœ ์„ธํŒ…์„ ํ•˜๊ฒŒ ๋˜๋ฉด

ํŒŒ์ผ์— ๋งจ ์ฒ˜์Œ์ธ โ€˜MZโ€™ ๋ถ€ํ„ฐ ์‹คํ–‰๋  ๊ฑฐ๋‹ค. ์ฆ‰, MZ ๋ถ€ํ„ฐ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋‹ˆ opcode ๋กœ dec

ebx, pop edx ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ์…ˆ์ด๋‹ค. ๋ฌผ๋ก  EntryPoint ๊ฐ€ 0 ์ธ ํ”„๋กœ๊ทธ๋žจ์€ ์ดํ›„์— ๋‹ค์‹œ

OEP ๋กœ ๋ณต๊ท€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํฌ๋ž˜์‰ฌ๊ฐ€ ๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๊ธฐ๋ฒ•์€ ์ฃผ๋กœ ํŒจ์ปค๋“ค์—์„œ

๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

- SizeOfImage

์ผ๋ถ€ ๋ถ„์„ํˆด(๊ตฌ๋ฒ„์ „ LordPE, ๋“ฑ)์—์„œ PE ํ—ค๋”์— SizeOfImage ๊ฐ€ ์›๋ž˜ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ฉด

ํฌ๋ž˜์‰ฌ๊ฐ€ ๋‚˜๊ธฐ๋„ ํ–ˆ์—ˆ๋‹ค. ํ˜„์žฌ SizeOfImage ๊ฐ’๋ณด๋‹ค ์•ฝ๊ฐ„ ํฐ ๊ฐ’์œผ๋กœ ์ˆ˜์ •ํ•ด ํˆด์—์„œ

๋ถ„์„๋˜๋Š”๊ฑธ ๋ฐฉํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ’์€ PEB->PEB_LDR_DATA->InOrderModuleList ์—

SizeOfImage ๊ฐ’์„ ์ˆ˜์ •ํ•ด ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

- PEB_LDR_DATA Structure

- typedef struct _PEB_LDR_DATA {

- ULONG Length;

- UCHAR Initialized[4];

- ULONG SsHandle;

- mLIST InLoadOrderList;

- mLIST InMemOrderList;

- mLIST InInitOrderList;

- UCHAR EntryInProgress;

- } PEB_LDR_DATA;

PoC ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

void main() { __asm { mov eax, fs:[0x30] // PEB mov eax, [eax + 0xc] // PEB_LDR_DATA mov eax, [eax + 0xc] // InOrderModuleList add [eax + 0x20], 0x3000 // SizeOfImage } }

- LoderFlags & NumberOfRvaAndSizes

๊ตฌ๋ฒ„์ „ ์˜ฌ๋ฆฌ๋””๋ฒ„๊ทธ ๊ฐ™์€ ๋ช‡๋ช‡ ๋””๋ฒ„๊ฑฐ์—์„œ๋Š” ์—„๊ฒฉํ•œ PE ๊ตฌ์กฐ ๊ฒ€์‚ฌ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ’๋“ค์„

์ˆ˜์ •ํ•ด ํŒŒ์ผ์„ ์—ด๊ฒŒ ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋ป—๊ธฐ๋„ ํ–ˆ๋‹ค. NumberOfRvaAndSizes ์—๋Š” ๋’ค์—

์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ธ๋ฐ, ์ตœ๋Œ€ 0x10 ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ๊ฐ€์งˆ ์ˆ˜

์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๊ฐ’์„ 0x10 ์ด์ƒ์œผ๋กœ ์ˆ˜์ •์„ ํ•ด๋„ ์‹คํ–‰์‹œ์—๋Š” ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์ด๋ฅผ

์ด์šฉํ•ด 0x10 ์ด์ƒ์˜ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

C) Sections Modification

- SizeOfRawData

Section Table ์—์„œ SizeOfRawData ๊ฐ’์„ ์ •์ƒ ๊ฐ’์ธ VirtualAddress ์™€ VirtualSIze ์˜

์ฐจ๊ฐ€ ์•„๋‹Œ ๋น„์ •์ƒ์ ์œผ๋กœ ํฐ ๊ฐ’์„ ๋„ฃ์–ด์„œ ์—ฌ๋Ÿฌ ๋ถ„์„ ํˆด์—์„œ ํฌ๋ž˜์‰ฌ๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ ๋ฒ„์ „ IDA ์—์„œ๋Š” section ํฌ๊ธฐ๋ฅผ ์ž˜๋ชป ์ธ์‹ํ•˜๊ฒŒ ๋ผ ์—„์ฒญ๋‚˜๊ฒŒ ํฌ๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ

ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๋‹ค.

- No Section Table

PE Header ์— SectionAlignment ๊ฐ’์ด 4000(0xfa0)๋ณด๋‹ค ์ž‘์•„์ง€๋ฉด, PE Header ๋Š”

writeable, excutable ํ•œ ์˜์—ญ์ด ๋˜๊ณ , Section Table ์ด ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ  ์˜ต์…˜์ด ๋˜๊ฒŒ

๋œ๋‹ค. ์ฆ‰, ๋ชจ๋“  Section ๋“ค์ด ์—†๋Š” ๊ฑฐ๋ž‘ ๋งˆ์ฐฌ๊ฐ€์ง€๊ฐ€ ๋œ๋‹ค.

D) Stolen Bytes โ€“ Asprotect

OEP ์ฃผ๋ณ€์— ๋ช‡ ๊ฐœ์˜ ๋ฐ”์ดํŠธ๋“ค์„(์ธ์ŠคํŠธ๋Ÿญ์…˜) ๋ถ„๋ฆฌ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋”ฐ๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ์— ๊ทธ ๊ฒƒ์„

์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ•์„ Stolen Bytes ๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•˜๊ฒŒ ์•„๋ฌด๋ฐ์„œ๋‚˜ ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์„

๋ณต์‚ฌํ•ด ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†๊ณ  ๊ทธ ์ฝ”๋“œ๋“ค์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๊ณ ์žˆ์–ด์•ผ ์ž˜๋ชป๋œ ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์ด

๋˜์ง€ ์•Š๊ณ  ์˜ˆ์™ธ์—†์ด ์ œ๋Œ€๋กœ ์‹คํ–‰์ด ๋  ๊ฑฐ๋‹ค. PoC ์ฝ”๋“œ๋Š” ์•„๋ž˜ Reference ์— ์ฐธ๊ณ  ๋งํฌ๋ฅผ

ํ™•์ธํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

E) Nanomites โ€“ Armadillo

ํ•ด๋‹น ๊ธฐ๋ฒ•์€ Armadillo ํŒจ์ปค์—์„œ ์ฒ˜์Œ์œผ๋กœ ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์œผ๋กœ ๋ชจ๋“  ์ ํ”„๊ตฌ๋ฌธ(jmp, je, jz,

๋“ฑ)์„ ์œ„์น˜๋‚˜ ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ์ €์žฅํ•ด ๋†“๊ณ  int 3(0xcc)๋กœ ๊ต์ฒดํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๋ณตํ˜ธํ™” ๊ณผ์ •์—์„œ๋Š” SEH ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ๋†” 0xcc ๋ฅผ ๋งŒ๋‚  ๋•Œ ๋งˆ๋‹ค, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค

ํ•˜๋‚˜์”ฉ ๋ณตํ˜ธํ™”๋ฅผ ํ•ด ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค. PoC ์ฝ”๋“œ๋Š” ์•„๋ž˜ Reference ์— ์ฐธ๊ณ  ๋งํฌ๋ฅผ

ํ™•์ธํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

3.4. Etc

A) Fake Signatures

Fake Signature ๋ž€ PEID ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ถ„์„ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹ค์ œ ์ •๋ณด์™€๋Š” ๋‹ค๋ฅธ ์ •๋ณด๋กœ

์ธ์‹๋˜๊ฒŒ ์•„๋‹ˆ๋ฉด ์ธ์‹๋˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด UPX ๋กœ ํŒจํ‚น๋˜์ง€ ์•Š์€

์–ด๋–ค ํŒŒ์ผ์—์„œ UPX ์—์„œ ์“ฐ์ด๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด UPX packed ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ์ง€๋งŒ

UPX packed ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํƒ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜๋Š” ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

void main() { }

extern "C" __declspec(naked) void fake(void) { __asm { // UPX signature __emit 0x60 __emit 0xbe __emit 0x0 __emit 0x80 __emit 0x40 __emit 0x0 __emit 0x8d __emit 0xbe __emit 0x0 __emit 0x90 __emit 0xff __emit 0xff __emit 0x57 __emit 0x83 __emit 0xcd __emit 0xff __emit 0xeb __emit 0x10 __emit 0x90 __emit 0x90 __emit 0x90 __emit 0x90 __emit 0x90 __emit 0x90 __emit 0x8a __emit 0x6 __emit 0x46 __emit 0x88 __emit 0x7 __emit 0x47 __emit 0x1 __emit 0xdb __emit 0x75 __emit 0x7 __emit 0x8b __emit 0x1e __emit 0x83 __emit 0xee __emit 0xfc __emit 0x11 __emit 0xdb __emit 0x72 __emit 0xed __emit 0xb8 __emit 0x1 __emit 0x0 __emit 0x0 __emit 0x0 __emit 0x1 __emit 0xdb __emit 0x75

__emit 0x7 __emit 0x8b __emit 0x1e __emit 0x83 __emit 0xee __emit 0xfc __emit 0x11 __emit 0xdb __emit 0x11 __emit 0xc0 __emit 0x1 __emit 0xdb __emit 0x73 __emit 0xef __emit 0x75 __emit 0x9 __emit 0x8b __emit 0x1e __emit 0x83 __emit 0xee __emit 0xfc __emit 0x11 __emit 0xdb __emit 0x73 __emit 0xe4 __emit 0x31 __emit 0xc9 __emit 0x83 __emit 0xe8 __emit 0x3 __emit 0x72 __emit 0xd __emit 0xc1 __emit 0xe0 __emit 0x8 push eax popad call main } }

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํ•  ๋•Œ, EP ๋ฅผ fake ํ•จ์ˆ˜๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„  /ENTRY:fake ๋ผ๋Š” ์˜ต์…˜์„

๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ PEID ๋กœ ์—ด์–ด scan ์„ ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo

4. Conclusion ์ง€๊ธˆ๊นŒ์ง€ ์—ฌ๋Ÿฌ ์•ˆํ‹ฐ ๋””๋ฒ„๊น…, ์–ด์…ˆ๋ธ”๋ฆฌ, ๋คํ•‘ ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋ฒ•๋“ค์„ ์•Œ์•„๋ณด์•˜๋‹ค.

์œ„์—์„œ ์†Œ๊ฐœํ•œ ๊ธฐ๋ฒ•๋“ค์— ๋Œ€ํ•œ ์•ฝ๊ฐ„ ๋น„๊ด€์ ์ธ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜์ž๋ฉด ๋Œ€๋ถ€๋ถ„์ด ์ด๋ฏธ ์˜ค๋ž˜์ „์—

๋ฐœ๊ฒฌ ๋ฌ๊ฑฐ๋‚˜ ๋˜ํ•œ ์ด๋ฅผ ์ž๋™์œผ๋กœ ์šฐํšŒํ•ด ์ฃผ๋Š” ๋””๋ฒ„๊ฑฐ๋“ค์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ(ex) idastealth,

ollyadvance)๋“ค๋„ ๋งŽ์ด ์ƒ๊ธด ์ง€ ์˜ค๋ž˜๋‹ค. ๊ทธ๋ž˜์„œ ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ• ๋งŒ์œผ๋กœ๋Š” ํ™•์‹คํžˆ

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

์•…์„ฑ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•ˆํ‹ฐ ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•์œผ๋กœ๋Š” API ํ›„ํ‚น์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ Anti-Hook ์„

์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ breakpoint ๋ฅผ scanning ํ•˜๋Š” ์ฝ”๋“œ๋“ค ์ •๋„ ๋“ฑ ์ธ๊ฑฐ ๊ฐ™๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ ๊ฐ€์ƒํ™”์™€ Anti Dumping, Packing, Anti Sandbox, VM ๋“ฑ์˜ ์ฝ”๋“œ๋“ค์ด

์‚ฌ์šฉ๋˜๋Š” ์ถ”์„ธ์ด๋‹ค. ์‹ค์ œ๋กœ ๋ฉ€์›จ์–ด๋“ค์„ ๋ถ„์„ํ•˜๋‹ค ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์ด ๊ตฌํ˜„๋œ ๊ฒƒ๋“ค์„

ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์ด๋ฒˆ ๋ฌธ์„œ์—์„œ๋Š” ์œˆ๋„์šฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋งŽ์ด ๋‹ค๋ค˜๋Š”๋ฐ ๋ฌผ๋ก  ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ๋„ ๋‹ค์–‘ํ•œ

์•ˆํ‹ฐ ๋ฆฌ๋ฒ„์‹ฑ ๊ธฐ๋ฒ•๋“ค์ด ์กด์žฌํ•˜๊ณ  ์žฌ๋ฐŒ๋Š” ๊ธฐ๋ฒ•๋“ค๋„ ๋งŽ๋‹ค.

5. Reference - PEB Structure :

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

- NtQueryInformationProcess :

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

- OutputDebugString :

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

- OutputDebugString โ€“ new :

- https://ntquery.wordpress.com/2015/09/07/windows-10-new-anti-debug-

outputdebugstringw/#more-32

- BlockInput :

- http://ezbeat.tistory.com/357

- DeleteFiber :

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

- Anti-Reversing Techniques :

- http://www.codeproject.com/Articles/30815/An-Anti-Reverse-Engineering-Guide

- http://pferrie.host22.com/papers/antidebug.pdf

- http://www.slideshare.net/tylerxshields/antidebugging-a-developers-view

- Anti-VM :

- http://blog.cyberbitsolutions.com/anti-vm-and-anti-sandbox-explained/

- Stolen Bytes & Nanomites :

- http://resources.infosecinstitute.com/anti-memory-dumping-techniques/