์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜
WINDOWS VIA C/C++
Chapter06 : ์Šค๋ ˆ๋“œ์˜ ๊ธฐ๋ณธ
2018-01-02
์‹ ํฌ๋ฏผ
์Šค๋ ˆ๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ชจ์–‘์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
ํ”„๋กœ์„ธ์Šค : ํ”„๋กœ์„ธ์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์™€ ์ฃผ์†Œ ๊ณต๊ฐ„์œผ๋กœ ๊ตฌ์„ฑ
์Šค๋ ˆ๋“œ : ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์™€ ์Šค๋ ˆ๋“œ ์Šคํƒ์œผ๋กœ ๊ตฌ์„ฑ
ํ”„๋กœ์„ธ์Šค๋Š” ์Šค์Šค๋กœ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์—†๋‹ค.
๋‹จ์ˆœํžˆ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์Šค๋ ˆ๋“œ์˜ ์ €์žฅ์†Œ
์Šค๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ ๋‚ด์— ์ƒ์„ฑ๋˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์‚ด์•„ ์žˆ๋‹ค.
=์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
์Šค๋ ˆ๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๋“ค์€ ๋‹จ์ผ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.
- ์Šค๋ ˆ๋“œ๋“ค์€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋™์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค ํ…Œ์ด๋ธ”์€ ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋“ค์€ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค๋„ ๊ณต์œ 
ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ๋งŒ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ์— ๋น„ํ•ด ๋”์šฑ ๋” ๋งŽ์€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ
๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒ๋‹น๋Ÿ‰์˜ ์ •๋ณด๋ฅผ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์— ์ €์žฅํ•ด ๋‘๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•œ๋‹ค.
๋ฐ˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ ์€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.
์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๋ถ€ํ•˜๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์—,
ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ์ถ”๊ฐ€์ ์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์ข‹๋‹ค.
์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ๋Š” CPU๋ผ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
CPU๋ฅผ ์œ ํœด ์ƒํƒœ๋กœ ๋†”๋‘ฌ์•ผ ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, CPU๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
CPU๋ฅผ ๋†€๊ฒŒ ํ•˜๊ธฐ ์‹ซ์„ ๋•Œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ!
์ฒ˜์Œ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜
๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์ˆ˜ํ–‰์„ ์‹œ์ž‘ํ•  ์ง„์ž…์  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
ํ”„๋กœ์„ธ์Šค ๋‚ด์— ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ง„์ž…์  ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ์•ผํ•จ.
- ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์€ ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„์ˆ˜ํ–‰
- ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ์–ธ์  ๊ฐ€๋Š” ๋๋‚  ๊ฒƒ์ด๊ณ  ๋ฐ˜ํ™˜๋  ๊ฒƒ
- ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ์ ์— ์Šค๋ ˆ๋“œ๋Š” ์ˆ˜ํ–‰์„ ๋ฉˆ์ถ”๊ณ  ์Šคํƒ ๋ฐ˜ํ™˜
- ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉ ์นด์šดํŠธ ๊ฐ์†Œ
- ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉ 0์ด ๋˜๋ฉด ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ๊ดด
์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค
- ์ด ๊ฐ’์€ ๋‚˜์ค‘์— ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.
์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
- ์ •์  ๋ณ€์ˆ˜๋‚˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ,
๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ž˜๋ชป ๋ณ€๊ฒฝ๋˜๋Š” ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.
CreateThread ํ•จ์ˆ˜
๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฏธ ์ˆ˜ํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ CreateThread๋ฅผ ํ˜ธ์ถœ
CreateThread๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“ฃ๊ฐ€ ์‚ฌ์šฉํ•  ์Šคํƒ ํ™•๋ณด
์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ˆ˜ํ–‰
์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ์— ์กฐ์ฐจ ์ ‘๊ทผ ๊ฐ€๋Šฅ
= ๋™์ผ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์Šค๋ ˆ๋“œ๋“ค์€ ์†์‰ฝ๊ฒŒ ์ƒํ˜ธ ํ†ต์‹ 
CreateThread ํ•จ์ˆ˜
PSECURITY_ATTRIBUTES psa
- SECURITY_ATTRIBUTES ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
- ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ๋ณด์•ˆ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋ฉด NULL ์ „๋‹ฌ
- Child proces๋กœ ํ•ด๋‹น ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค์„ ์ƒ์†กํ•˜๋„๋ก ํ•˜๋ ค๋ฉด,
SECURITY_ATTRIBUTES ๊ตฌ์กฐ์ฒด์˜ bInhertHandle๋ฉค๋ฒ„๋ฅผ TRUE๋กœ ์ดˆ๊ธฐํ™”.
DWORD cbStackSize,
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์˜ ์Šคํƒ์„ ์œ„ํ•ด ์–ผ๋งˆ๋งŒํผ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์ง€์ •
- StackSize 0 ์ด์™ธ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์ง€์ •๋œ
- ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ์ปค๋ฐ‹
- ๋งŒ์ผ ์‹œ์Šคํ…œ์ด ์Šคํƒ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์žฌ๊ท€ํ˜ธ์ถœ์€ ์ ˆ๋Œ€๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Œ
CreateThread ํ•จ์ˆ˜
PTHREAD_START_ROUTINE pfnStartAddr
- pfnStartAddr ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒˆ๋กœ์ด ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜ธ์ถœํ•  ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ด
PVOID pvParam
- CreateThread ํ•จ์ˆ˜์˜ pvParam ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ
- CreateThread ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ์™ธ์—
๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
CreateThread ํ•จ์ˆ˜
DWORD dwCreateFlags
- dwCreateFlags ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์„ธ๋ถ€์ ์ธ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
- ๊ฐ’์œผ๋กœ 0์„ ์ „๋‹ฌํ•˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋˜๋Š” ์ฆ‰์‹œ CPU์— ์˜ํ•ด ์Šค์ผ€์ค„์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ
- ๊ฐ’์œผ๋กœ CREATE_SUSPENDED๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒ ํ•œ ํ›„ ์ผ์‹œ ์ •์ง€ ์ƒํƒœ ์œ ์ง€
PDWORD pdwThreadID
- pdwThreadID์—๋Š” ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋˜๋Š” ์Šค๋ ˆ๋“œ ID๊ฐ’์„ ์ €์žฅํ•  DWORD ๋ณ€์ˆ˜๋ฅผ
๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.
์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ
์Šค๋ ˆ๋“œ๋Š” 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ข…๋ฃŒ ๋  ์ˆ˜ ์žˆ๋‹ค.
1. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. (์ด ๋ฐฉ๋ฒ•์„ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœ)
2. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ExitThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (๋น„์ถ”์ฒœ)
3. ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ TerminateThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (๋น„์ถ”์ฒœ)
4. ์Šค๋ ˆ๋“œ๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. (๋น„์ถ”์ฒœ)
1. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜
ํ•ญ์ƒ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๊ฒƒ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•œ ์ž์›์„ ์ ์ ˆํžˆ
์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.
- ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒ์„ฑํ•œ C++ ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ํŒŒ๊ดด์ž๋ฅผ ํ†ตํ•ด ์ ์ ˆํžˆ ์ œ๊ฑฐ
- ์šด์˜์ฒด์ œ๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•˜์˜€๋˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜
- ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์„ค์ •
- ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ ์นด์šดํŠธ๋ฅผ ๊ฐ์†Œ
2. ExitThread ํ•จ์ˆ˜
ExitThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๊ณ  ์šด์˜ ์ฒด์ œ๊ฐ€ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ชจ๋“  ์šด์˜์ฒด์ œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๋„๋ก ํ•จ
- C/C++ ๋ฆฌ์†Œ์Šค๋Š” ์ •๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
- ExitThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š”๊ฒŒ ๋” ์ข‹๋‹ค.
- ExitThread ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— ๋‚˜์˜จ์€ ์ฝ”๋“œ๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
-
3. TerminateThread ํ•จ์ˆ˜
TerminateThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ExitThread ํ•จ์ˆ˜๊ฐ€ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์–ด๋– ํ•œ ์Šค๋ ˆ๋“œ๋ผ๋„ ์ข…๋ฃŒ
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” dwExitCode ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •
์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ ์นด์šดํŠธ๋Š” ๊ฐ์†Œ
- ์ž˜ ์„ค๊ณ„๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ์ ˆ๋Œ€๋กœ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
- ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ข…๋ฃŒ๋  ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ๊ณง ์ข…๋ฃŒ๋  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ „๋‹ฌ๋ฐ›์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ
-> ์ ์ ˆํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ณ , ์ข…๋ฃŒ ์ž์ฒด๋ฅผ ํšŒํ”ผํ•  ์ˆ˜๋„ ์—†๋‹ค.
4. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด
- ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ์œ ํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ
- ExitProcess์™€ TerminateProcess ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ
- ์ฐจ์ด์ ์€ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ
- ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ฆฌ์†Œ์Šค๋“ค๋„ ๋ชจ๋‘ ์ •๋ฆฌ
- ์Šค๋ ˆ๋“œ๋“ค์ด ์‚ฌ์šฉํ•˜๋˜ ์Šคํƒ๋“ค๋„ ์ •๋ฆฌ
- ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ๋‚ด์— ๋‚จ์•„์žˆ๋Š” ์Šค๋ ˆ๋“œ๋“ค์— ๋Œ€ํ•ด ๊ฐ๊ฐ TerminateThread ํ•จ์ˆ˜ ํ˜ธ์ถœ
- ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์™€ ๊ฐ™์ด ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋ฉด C++ ํŒŒ๊ดด์ž๊ฐ€ ํ˜ธ์ถœ๋˜์ง€๋„ ๋ชปํ•˜๊ณ  ์ž๋ฃŒ์ •๋ฆฌ๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ.
5. ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด
- ์Šค๋ ˆ๋“œ๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋˜ ๋ชจ๋“  ์œ ์ € ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค์ด ์‚ญ์ œ
- ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” STILL_ACTIVE์—์„œ ExitThead๋‚˜ TerminateThread์—์„œ ์ง€์ •ํ•œ ์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ
- ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ๊ฐ€ ์‹œ๊ทธ๋„ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
- ์ข…๋ฃŒ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋งˆ์ง€๋ง‰ ํ™œ์„ฑ ์Šค๋ ˆ๋“œ๋ผ๋ฉด ์‹œ์Šคํ…œ์€ ํ”„๋กœ์„ธ์Šค๋„ ๊ฐ™์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•จ
- ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ ์นด์šดํŠธ๊ฐ€ 1๋งŒํผ ๊ฐ์†Œ
์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€
์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ
๋‹ค๋ฅธ ์†์„ฑ๊ณผ ํ†ต๊ณ„ ์ •๋ณด
์‚ฌ์šฉ ์นด์šดํŠธ = 2
์ •์ง€ ์นด์šดํŠธ = 1
์ข…๋ฃŒ ์ฝ”๋“œ = STILL_ACTIVE
์‹œ๊ทธ๋„ ์ƒํƒœ = FALSE
์ปจํ…์ŠคํŠธ
SP
IP
๋‹ค๋ฅธ CPU ๋ ˆ์ง€์Šคํ„ฐ
์Šค๋ ˆ๋“œ ์Šคํƒ
pvParam
pfnStartAddr
.
.
.
NTDLL.dll
VOID RtlUserThreadStart(โ€ฆ)
{
โ€ฆ
}
์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€
CreateThread ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์Šค๋ ˆ๋“œ ์Šคํƒ์œผ๋กœ ํ™œ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น
์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ์Šคํƒ์œผ๋กœ ํ™œ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ๋Š”
ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์œผ๋กœ ํ• ๋‹น
์ดํ›„ ์‹œ์Šคํ…œ์€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ ์Šคํƒ์˜ ๊ฐ€์žฅ ์ƒ์œ„์— ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๊ธฐ๋ก
์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€
๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ CPU ๋ ˆ์ง€์Šคํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด๋ฅผ ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฆ„
์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์„ ๋‹น์‹œ์˜ ์Šค๋ ˆ๋“œ CPU ๋ ˆ์ง€์Šคํ„ฐ๊ฐ’์„ ๊ฐ€์ง
์ธ์Šคํ„ฐ๋Ÿญ์…˜ ํฌ์ธํ„ฐ(IP) ๋ ˆ์ง€์Šคํ„ฐ์™€ ์Šคํƒ ํฌ์ธํ„ฐ(SP) ๋ ˆ์ง€์Šคํ„ฐ
- ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜๋Š” ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ ˆ์ง€์Šคํ„ฐ
- ์Šค๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰
->ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ƒ์˜ ํŠน์ • ์œ„์น˜๋ฅผ ๊ฐ€๋ฅดํ‚ด
- ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด CONTEXT ๊ตฌ์กฐ์ฒด ๋‚ด์˜ ์Šคํƒ ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ๋Š”
pfnStartAddr๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒ์˜ ์ฃผ์†Œ๋กœ ์„ค์ •
์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€
- ์Šค๋ ˆ๋“œ์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹œ์Šคํ…œ์€ CreateThead ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ CREATE_SUSPENDED ํ”Œ๋ž˜๊ทธ๊ฐ€
์ „๋‹ฌ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
- ์Šค๋ ˆ๋“œ๊ฐ€ CPU ์‹œ๊ฐ„์„ ์–ป์œผ๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ๊ฐ’์„ CPU ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๋กœ๋“œ
ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•œ๋‹ค.
- ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์˜ IP๊ฐ€ RtlUserThreadStart๋กœ ์„ค์ • -> ์‹ค์งˆ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ดˆ ์œ„์น˜
- RtlUserThreadStartํ•จ์ˆ˜๋Š” ์‹œ์ž‘ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ข… ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์ง„์ž…์  ํ•จ์ˆ˜ ํ˜ธ์ถœ
- RtlUserThreadStart ๋‚ด์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ExitThread๋‚˜ ExitProcess๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์‚ฌ์‹ค
-> ์Šค๋ ˆ๋“œ๋Š” RtlUserThreadStart๋กœ ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋˜์ง€ ๋ชปํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์ข…๋ฃŒ
C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ ์ฐฐ
- ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ C/C++ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ ค๋ฉด C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋Š”
๊ฐ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์ ์ ˆํ•œ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
_beginthreadex
- ์šด์˜์ฒด์ œ๋Š” ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ํ• ๋‹นํ•ด์•ผ ํ•  ์ง€ ๋ชจ๋ฅธ๋‹ค.
- C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” _beginthreadex๋ฅผ ํ˜ธ์ถœ
_beginthreadex ํ•จ์ˆ˜์˜ ํŠน์ง•
- ๊ฐ ์Šค๋ ˆ๋“œ๋Š” C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํž™์— _tiddata๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ฐ€์ง
- _beginthreadex ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋Š” _tiddqata ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ๋‚ด์— ์ €์žฅ
- ๋‚ด๋ถ€์ ์œผ๋กœ CreateThreadํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
- ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ CreateThread์™€ ๋™์ผํ•˜๊ฒŒ ์Šค๋ ˆ๋“œ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์‹œ 0์„ ๋ฐ˜ํ™˜
C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ ์ฐฐ
_threadstartex
- ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋Š” RtlUserThreadStart๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  _threadstartex๋กœ ์ง„์ž…
- ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ์˜ _tiddata๋ธ”๋ก์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ
- ์‚ฌ์šฉ์ž ์ •์˜ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ํ˜ธ์ถœ
- ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ๋จ.
- _callthreadstartex๋Š” ๋‹จ์ˆœํžˆ _threadstartex๋กœ ๋ฐ˜ํ™˜๋˜๊ณ , ๊ณ„์†ํ•ด์„œ RtlUserThreadStart๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ตฌ์กฐ๊ฐ€
์•„๋‹˜์— ์ฃผ๋ชฉ. ๋งŒ์ผ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ๋˜๊ณ , ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ,
_tiddata ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์€ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. -> ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ ์ฐฐ
_endtreadex
- c/c++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์ธ _getpid_noexit ํ•จ์ˆ˜๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜
_tiddata ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์šด์˜์ฒด์ œ์˜ TlsGetValue ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
- _tiddata ๋ธ”๋ก์ด ์‚ญ์ œ๋˜๊ณ  ์šด์˜์ฒด์ œ์˜ ExitThreadํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์Šค๋ ˆ๋“œ๋ฅผ ํŒŒ๊ดด
์ด ๊ณผ์ •์—์„œ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •
- C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” _beginthreadex๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋จ.
์ž์‹ ์˜ ๊ตฌ๋ถ„์ž ์–ป๊ธฐ
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์ข…์ข… ์ž์‹ ์˜ ์ˆ˜ํ–‰ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•จ
- ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์˜ ์ˆ˜ํ–‰ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ๋Š”
์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์„ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๋‚˜ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ
์† ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต
- ์ด ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ด๋Š”
์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ํ—ˆ์œ„ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜
ํ—ˆ์œ„ ํ•ธ๋“ค์„ ์‹ค์ œ ํ•ธ๋“ค๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ
- ๋•Œ๋•Œ๋กœ ํ—ˆ์œ„ ํ•ธ๋“ค ๋Œ€์‹  ์‹ค์ œ ํ•ธ๋“ค ๊ฐ’์„ ์–ป์–ด ์™€์•ผ ํ•  ๋•Œ๋„ ์žˆ๋‹ค.
- ์Šค๋ ˆ๋“œ์˜ ํ—ˆ์œ„ ํ•ธ๋“ค์€ ํ•ญ์‹œ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ ํ•ธ๋“ค์ด๋‹ค
= ํ—ˆ์œ„ ํ•ธ๋“ค์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
- ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ—ˆ์œ„ ํ•ธ๋“ค์„ ์‹ค์ œ ํ•ธ๋“ค๋กœ ๋ณ€๊ฒฝ ํ•ด์•ผ ํ•œ๋‹ค.
DuplicateHandle ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค

Windows via c++ chapter6

  • 1.
    ์ œํ”„๋ฆฌ ๋ฆฌ์ฒ˜์˜ WINDOWS VIAC/C++ Chapter06 : ์Šค๋ ˆ๋“œ์˜ ๊ธฐ๋ณธ 2018-01-02 ์‹ ํฌ๋ฏผ
  • 2.
    ์Šค๋ ˆ๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋Š”๋งค์šฐ ์œ ์‚ฌํ•œ ๋ชจ์–‘์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค : ํ”„๋กœ์„ธ์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์™€ ์ฃผ์†Œ ๊ณต๊ฐ„์œผ๋กœ ๊ตฌ์„ฑ ์Šค๋ ˆ๋“œ : ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์™€ ์Šค๋ ˆ๋“œ ์Šคํƒ์œผ๋กœ ๊ตฌ์„ฑ ํ”„๋กœ์„ธ์Šค๋Š” ์Šค์Šค๋กœ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์—†๋‹ค. ๋‹จ์ˆœํžˆ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์Šค๋ ˆ๋“œ์˜ ์ €์žฅ์†Œ ์Šค๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ ๋‚ด์— ์ƒ์„ฑ๋˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์‚ด์•„ ์žˆ๋‹ค. =์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
  • 3.
    ์Šค๋ ˆ๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋‚ด์— ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ๋“ค์€ ๋‹จ์ผ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค. - ์Šค๋ ˆ๋“œ๋“ค์€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋™์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. - ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค ํ…Œ์ด๋ธ”์€ ํ”„๋กœ์„ธ์Šค๋ณ„๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋“ค์€ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค๋„ ๊ณต์œ  ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ๋งŒ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ์— ๋น„ํ•ด ๋”์šฑ ๋” ๋งŽ์€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ ๊ฐœ๋ณ„ ํ”„๋กœ์„ธ์Šค๋Š” ์ƒ๋‹น๋Ÿ‰์˜ ์ •๋ณด๋ฅผ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์— ์ €์žฅํ•ด ๋‘๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ํ•„์š”๋กœ ํ•œ๋‹ค. ๋ฐ˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ ์€ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค์— ๋น„ํ•ด ๋ถ€ํ•˜๊ฐ€ ์ ๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ์ถ”๊ฐ€์ ์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์ข‹๋‹ค.
  • 4.
    ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ๋Š” CPU๋ผ๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ. CPU๋ฅผ ์œ ํœด ์ƒํƒœ๋กœ ๋†”๋‘ฌ์•ผ ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, CPU๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. CPU๋ฅผ ๋†€๊ฒŒ ํ•˜๊ธฐ ์‹ซ์„ ๋•Œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ!
  • 5.
    ์ฒ˜์Œ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ์Šค๋ ˆ๋“œํ•จ์ˆ˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์ˆ˜ํ–‰์„ ์‹œ์ž‘ํ•  ์ง„์ž…์  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค ๋‚ด์— ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ง„์ž…์  ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ์•ผํ•จ. - ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์€ ์–ด๋–ค ๊ฒƒ์ด๋ผ๋„์ˆ˜ํ–‰ - ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ์–ธ์  ๊ฐ€๋Š” ๋๋‚  ๊ฒƒ์ด๊ณ  ๋ฐ˜ํ™˜๋  ๊ฒƒ - ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ์‹œ์ ์— ์Šค๋ ˆ๋“œ๋Š” ์ˆ˜ํ–‰์„ ๋ฉˆ์ถ”๊ณ  ์Šคํƒ ๋ฐ˜ํ™˜ - ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉ ์นด์šดํŠธ ๊ฐ์†Œ - ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์šฉ 0์ด ๋˜๋ฉด ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ๊ดด
  • 6.
    ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š”๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค - ์ด ๊ฐ’์€ ๋‚˜์ค‘์— ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. - ์ •์  ๋ณ€์ˆ˜๋‚˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์ˆ˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉฐ, ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ž˜๋ชป ๋ณ€๊ฒฝ๋˜๋Š” ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.
  • 7.
    CreateThread ํ•จ์ˆ˜ ๋‘ ๋ฒˆ์งธ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๋ฏธ ์ˆ˜ํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ CreateThread๋ฅผ ํ˜ธ์ถœ CreateThread๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“ฃ๊ฐ€ ์‚ฌ์šฉํ•  ์Šคํƒ ํ™•๋ณด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ˆ˜ํ–‰ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ์— ์กฐ์ฐจ ์ ‘๊ทผ ๊ฐ€๋Šฅ = ๋™์ผ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์Šค๋ ˆ๋“œ๋“ค์€ ์†์‰ฝ๊ฒŒ ์ƒํ˜ธ ํ†ต์‹ 
  • 8.
    CreateThread ํ•จ์ˆ˜ PSECURITY_ATTRIBUTES psa -SECURITY_ATTRIBUTES ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ - ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ๋ณด์•ˆ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋ฉด NULL ์ „๋‹ฌ - Child proces๋กœ ํ•ด๋‹น ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค์„ ์ƒ์†กํ•˜๋„๋ก ํ•˜๋ ค๋ฉด, SECURITY_ATTRIBUTES ๊ตฌ์กฐ์ฒด์˜ bInhertHandle๋ฉค๋ฒ„๋ฅผ TRUE๋กœ ์ดˆ๊ธฐํ™”. DWORD cbStackSize, - ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์˜ ์Šคํƒ์„ ์œ„ํ•ด ์–ผ๋งˆ๋งŒํผ์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์ง€์ • - StackSize 0 ์ด์™ธ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์ง€์ •๋œ - ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ์ปค๋ฐ‹ - ๋งŒ์ผ ์‹œ์Šคํ…œ์ด ์Šคํƒ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์žฌ๊ท€ํ˜ธ์ถœ์€ ์ ˆ๋Œ€๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Œ
  • 9.
    CreateThread ํ•จ์ˆ˜ PTHREAD_START_ROUTINE pfnStartAddr -pfnStartAddr ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ƒˆ๋กœ์ด ์ƒ์„ฑ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜ธ์ถœํ•  ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ด PVOID pvParam - CreateThread ํ•จ์ˆ˜์˜ pvParam ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ - CreateThread ํ•จ์ˆ˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • 10.
    CreateThread ํ•จ์ˆ˜ DWORD dwCreateFlags -dwCreateFlags ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์„ธ๋ถ€์ ์ธ ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ - ๊ฐ’์œผ๋กœ 0์„ ์ „๋‹ฌํ•˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑ๋˜๋Š” ์ฆ‰์‹œ CPU์— ์˜ํ•ด ์Šค์ผ€์ค„์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ - ๊ฐ’์œผ๋กœ CREATE_SUSPENDED๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋ฅผ ์™„๋ฃŒ ํ•œ ํ›„ ์ผ์‹œ ์ •์ง€ ์ƒํƒœ ์œ ์ง€ PDWORD pdwThreadID - pdwThreadID์—๋Š” ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋˜๋Š” ์Šค๋ ˆ๋“œ ID๊ฐ’์„ ์ €์žฅํ•  DWORD ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.
  • 11.
    ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์Šค๋ ˆ๋“œ๋Š” 4๊ฐ€์ง€๋ฐฉ๋ฒ•์œผ๋กœ ์ข…๋ฃŒ ๋  ์ˆ˜ ์žˆ๋‹ค. 1. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. (์ด ๋ฐฉ๋ฒ•์„ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœ) 2. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ExitThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (๋น„์ถ”์ฒœ) 3. ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์—์„œ TerminateThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (๋น„์ถ”์ฒœ) 4. ์Šค๋ ˆ๋“œ๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. (๋น„์ถ”์ฒœ)
  • 12.
    1. ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋ฐ˜ํ™˜ ํ•ญ์ƒ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๊ฒƒ์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•œ ์ž์›์„ ์ ์ ˆํžˆ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. - ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒ์„ฑํ•œ C++ ์˜ค๋ธŒ์ ํŠธ๋“ค์€ ํŒŒ๊ดด์ž๋ฅผ ํ†ตํ•ด ์ ์ ˆํžˆ ์ œ๊ฑฐ - ์šด์˜์ฒด์ œ๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•˜์˜€๋˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ - ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์„ค์ • - ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ ์นด์šดํŠธ๋ฅผ ๊ฐ์†Œ
  • 13.
    2. ExitThread ํ•จ์ˆ˜ ExitThreadํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. - ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•˜๊ณ  ์šด์˜ ์ฒด์ œ๊ฐ€ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ชจ๋“  ์šด์˜์ฒด์ œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๋„๋ก ํ•จ - C/C++ ๋ฆฌ์†Œ์Šค๋Š” ์ •๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. - ExitThread ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋Š”๊ฒŒ ๋” ์ข‹๋‹ค. - ExitThread ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„์— ๋‚˜์˜จ์€ ์ฝ”๋“œ๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. -
  • 14.
    3. TerminateThread ํ•จ์ˆ˜ TerminateThreadํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. - ExitThread ํ•จ์ˆ˜๊ฐ€ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์–ด๋– ํ•œ ์Šค๋ ˆ๋“œ๋ผ๋„ ์ข…๋ฃŒ - ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” dwExitCode ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์œผ๋กœ ์„ค์ • ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ ์นด์šดํŠธ๋Š” ๊ฐ์†Œ - ์ž˜ ์„ค๊ณ„๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ์ ˆ๋Œ€๋กœ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜์ง€ ์•Š๋Š”๋‹ค. - ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ข…๋ฃŒ๋  ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์ด ๊ณง ์ข…๋ฃŒ๋  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ „๋‹ฌ๋ฐ›์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ -> ์ ์ ˆํ•œ ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ณ , ์ข…๋ฃŒ ์ž์ฒด๋ฅผ ํšŒํ”ผํ•  ์ˆ˜๋„ ์—†๋‹ค.
  • 15.
    4. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด -ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ์œ ํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ - ExitProcess์™€ TerminateProcess ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ - ์ฐจ์ด์ ์€ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ - ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋˜ ๋ฆฌ์†Œ์Šค๋“ค๋„ ๋ชจ๋‘ ์ •๋ฆฌ - ์Šค๋ ˆ๋“œ๋“ค์ด ์‚ฌ์šฉํ•˜๋˜ ์Šคํƒ๋“ค๋„ ์ •๋ฆฌ - ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ๋‚ด์— ๋‚จ์•„์žˆ๋Š” ์Šค๋ ˆ๋“œ๋“ค์— ๋Œ€ํ•ด ๊ฐ๊ฐ TerminateThread ํ•จ์ˆ˜ ํ˜ธ์ถœ - ํ”„๋กœ์„ธ์Šค๋ฅผ ์ด์™€ ๊ฐ™์ด ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋ฉด C++ ํŒŒ๊ดด์ž๊ฐ€ ํ˜ธ์ถœ๋˜์ง€๋„ ๋ชปํ•˜๊ณ  ์ž๋ฃŒ์ •๋ฆฌ๋„ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ.
  • 16.
    5. ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด -์Šค๋ ˆ๋“œ๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋˜ ๋ชจ๋“  ์œ ์ € ์˜ค๋ธŒ์ ํŠธ ํ•ธ๋“ค์ด ์‚ญ์ œ - ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” STILL_ACTIVE์—์„œ ExitThead๋‚˜ TerminateThread์—์„œ ์ง€์ •ํ•œ ์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ - ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ๊ฐ€ ์‹œ๊ทธ๋„ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ - ์ข…๋ฃŒ๋˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ๋งˆ์ง€๋ง‰ ํ™œ์„ฑ ์Šค๋ ˆ๋“œ๋ผ๋ฉด ์‹œ์Šคํ…œ์€ ํ”„๋กœ์„ธ์Šค๋„ ๊ฐ™์ด ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•จ - ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ฌ์šฉ ์นด์šดํŠธ๊ฐ€ 1๋งŒํผ ๊ฐ์†Œ
  • 17.
    ์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ์ปค๋„์˜ค๋ธŒ์ ํŠธ ๋‹ค๋ฅธ ์†์„ฑ๊ณผ ํ†ต๊ณ„ ์ •๋ณด ์‚ฌ์šฉ ์นด์šดํŠธ = 2 ์ •์ง€ ์นด์šดํŠธ = 1 ์ข…๋ฃŒ ์ฝ”๋“œ = STILL_ACTIVE ์‹œ๊ทธ๋„ ์ƒํƒœ = FALSE ์ปจํ…์ŠคํŠธ SP IP ๋‹ค๋ฅธ CPU ๋ ˆ์ง€์Šคํ„ฐ ์Šค๋ ˆ๋“œ ์Šคํƒ pvParam pfnStartAddr . . . NTDLL.dll VOID RtlUserThreadStart(โ€ฆ) { โ€ฆ }
  • 18.
    ์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€ CreateThread ํ•จ์ˆ˜๊ฐ€ํ˜ธ์ถœ๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์Šค๋ ˆ๋“œ ์Šคํƒ์œผ๋กœ ํ™œ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ์Šคํƒ์œผ๋กœ ํ™œ์šฉํ•  ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์œผ๋กœ ํ• ๋‹น ์ดํ›„ ์‹œ์Šคํ…œ์€ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ ์Šคํƒ์˜ ๊ฐ€์žฅ ์ƒ์œ„์— ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๊ธฐ๋ก
  • 19.
    ์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€ ๊ฐ ์Šค๋ ˆ๋“œ๋Š”์ž์‹ ๋งŒ์˜ CPU ๋ ˆ์ง€์Šคํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด๋ฅผ ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฆ„ ์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ์„ ๋‹น์‹œ์˜ ์Šค๋ ˆ๋“œ CPU ๋ ˆ์ง€์Šคํ„ฐ๊ฐ’์„ ๊ฐ€์ง ์ธ์Šคํ„ฐ๋Ÿญ์…˜ ํฌ์ธํ„ฐ(IP) ๋ ˆ์ง€์Šคํ„ฐ์™€ ์Šคํƒ ํฌ์ธํ„ฐ(SP) ๋ ˆ์ง€์Šคํ„ฐ - ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜๋Š” ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ ˆ์ง€์Šคํ„ฐ - ์Šค๋ ˆ๋“œ๋Š” ํ•ญ์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ ->ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ƒ์˜ ํŠน์ • ์œ„์น˜๋ฅผ ๊ฐ€๋ฅดํ‚ด - ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋ฉด CONTEXT ๊ตฌ์กฐ์ฒด ๋‚ด์˜ ์Šคํƒ ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ๋Š” pfnStartAddr๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ ์Šคํƒ์˜ ์ฃผ์†Œ๋กœ ์„ค์ •
  • 20.
    ์Šค๋ ˆ๋“œ์˜ ๋‚ด๋ถ€ - ์Šค๋ ˆ๋“œ์˜์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์‹œ์Šคํ…œ์€ CreateThead ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ CREATE_SUSPENDED ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ „๋‹ฌ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ - ์Šค๋ ˆ๋“œ๊ฐ€ CPU ์‹œ๊ฐ„์„ ์–ป์œผ๋ฉด ์‹œ์Šคํ…œ์€ ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์ €์žฅ๋œ ๊ฐ’์„ CPU ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๋กœ๋“œ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•œ๋‹ค. - ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ์˜ IP๊ฐ€ RtlUserThreadStart๋กœ ์„ค์ • -> ์‹ค์งˆ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ดˆ ์œ„์น˜ - RtlUserThreadStartํ•จ์ˆ˜๋Š” ์‹œ์ž‘ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ์ข… ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์ง„์ž…์  ํ•จ์ˆ˜ ํ˜ธ์ถœ - RtlUserThreadStart ๋‚ด์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ExitThread๋‚˜ ExitProcess๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์‚ฌ์‹ค -> ์Šค๋ ˆ๋“œ๋Š” RtlUserThreadStart๋กœ ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋˜์ง€ ๋ชปํ•˜๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์ข…๋ฃŒ
  • 21.
    C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Œ€ํ•œ ๊ณ ์ฐฐ - ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ C/C++ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ ค๋ฉด C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์ ์ ˆํ•œ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. _beginthreadex - ์šด์˜์ฒด์ œ๋Š” ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ํ• ๋‹นํ•ด์•ผ ํ•  ์ง€ ๋ชจ๋ฅธ๋‹ค. - C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” _beginthreadex๋ฅผ ํ˜ธ์ถœ _beginthreadex ํ•จ์ˆ˜์˜ ํŠน์ง• - ๊ฐ ์Šค๋ ˆ๋“œ๋Š” C/C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํž™์— _tiddata๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ฐ€์ง - _beginthreadex ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋Š” _tiddqata ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ๋‚ด์— ์ €์žฅ - ๋‚ด๋ถ€์ ์œผ๋กœ CreateThreadํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ - ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ CreateThread์™€ ๋™์ผํ•˜๊ฒŒ ์Šค๋ ˆ๋“œ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์‹œ 0์„ ๋ฐ˜ํ™˜
  • 22.
    C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Œ€ํ•œ ๊ณ ์ฐฐ _threadstartex - ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ๋Š” RtlUserThreadStart๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  _threadstartex๋กœ ์ง„์ž… - ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ์˜ _tiddata๋ธ”๋ก์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ - ์‚ฌ์šฉ์ž ์ •์˜ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ํ˜ธ์ถœ - ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ๋จ. - _callthreadstartex๋Š” ๋‹จ์ˆœํžˆ _threadstartex๋กœ ๋ฐ˜ํ™˜๋˜๊ณ , ๊ณ„์†ํ•ด์„œ RtlUserThreadStart๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹˜์— ์ฃผ๋ชฉ. ๋งŒ์ผ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ์ข…๋ฃŒ๋˜๊ณ , ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, _tiddata ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์€ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. -> ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
  • 23.
    C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Œ€ํ•œ ๊ณ ์ฐฐ _endtreadex - c/c++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์ธ _getpid_noexit ํ•จ์ˆ˜๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜ _tiddata ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์šด์˜์ฒด์ œ์˜ TlsGetValue ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ - _tiddata ๋ธ”๋ก์ด ์‚ญ์ œ๋˜๊ณ  ์šด์˜์ฒด์ œ์˜ ExitThreadํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์Šค๋ ˆ๋“œ๋ฅผ ํŒŒ๊ดด ์ด ๊ณผ์ •์—์„œ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ • - C/C++ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” _beginthreadex๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋จ.
  • 24.
    ์ž์‹ ์˜ ๊ตฌ๋ถ„์ž ์–ป๊ธฐ -์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์ข…์ข… ์ž์‹ ์˜ ์ˆ˜ํ–‰ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•จ - ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์˜ ์ˆ˜ํ–‰ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ์„ ์†Œ์œ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๋‚˜ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์† ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณต - ์ด ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋‚˜ ์Šค๋ ˆ๋“œ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์Šค๋ ˆ๋“œ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ํ—ˆ์œ„ ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜
  • 25.
    ํ—ˆ์œ„ ํ•ธ๋“ค์„ ์‹ค์ œํ•ธ๋“ค๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ - ๋•Œ๋•Œ๋กœ ํ—ˆ์œ„ ํ•ธ๋“ค ๋Œ€์‹  ์‹ค์ œ ํ•ธ๋“ค ๊ฐ’์„ ์–ป์–ด ์™€์•ผ ํ•  ๋•Œ๋„ ์žˆ๋‹ค. - ์Šค๋ ˆ๋“œ์˜ ํ—ˆ์œ„ ํ•ธ๋“ค์€ ํ•ญ์‹œ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์˜ ํ•ธ๋“ค์ด๋‹ค = ํ—ˆ์œ„ ํ•ธ๋“ค์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ ์ž์‹ ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. - ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ—ˆ์œ„ ํ•ธ๋“ค์„ ์‹ค์ œ ํ•ธ๋“ค๋กœ ๋ณ€๊ฒฝ ํ•ด์•ผ ํ•œ๋‹ค. DuplicateHandle ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค