Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” Innopolis University์˜ ์ง์›๋“ค๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์ž๊ฐ€ ์žฅ์•  ๋ฐœ์ƒ ํ›„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก Active Restore ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ๊ธฐ๋ณธ Windows ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ปท ์•„๋ž˜์—๋Š” ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‚ด์šฉ๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ๊ฐ€์ด๋“œ๊ฐ€ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค

์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋ณต์›, ์ด๋…ธํด๋ฆฌ์Šค ํ•™์ƒ๋“ค์˜ ๋ฐœ์ „ ๊ณผ์ • ์„œ๋น„์Šค. ์˜ค๋Š˜ ์ €๋Š” ํ™œ์„ฑ ๋ณต๊ตฌ ์„œ๋น„์Šค๋ฅผ "๋งค์žฅ"ํ•˜๋ ค๋Š” ์ˆ˜์ค€๊นŒ์ง€ ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ›จ์”ฌ ๋” ์ผ์ฐ ์„œ๋น„์Šค ์ž์ฒด๋ฅผ ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค.
  • ํ›จ์”ฌ ์ด์ „์— ๋ฐฑ์—…์ด ์œ„์น˜ํ•œ ํด๋ผ์šฐ๋“œ์— ๋ฌธ์˜ํ•˜์„ธ์š”.
  • ์‹œ์Šคํ…œ์ด ์–ด๋–ค ๋ชจ๋“œ์— ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค(์ผ๋ฐ˜ ๋ถ€ํŒ… ๋˜๋Š” ๋ณต๊ตฌ).
  • ๋ฏธ๋ฆฌ ๋ณต๊ตฌํ•  ํŒŒ์ผ ์ˆ˜๊ฐ€ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋”์šฑ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

์ด ์งˆ๋ฌธ์— ๋Œ€๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์ด ํ˜ธ์ถœํ•˜๋Š” ์ˆœ์„œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค
Pavel Yosifovich - Windows ์ปค๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(2019)

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CreateFile, ํ—ค๋” ํŒŒ์ผ fileapi.h์—์„œ ์„ ์–ธ๋˜๊ณ  Kernel32.dll์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•จ์ˆ˜ ์ž์ฒด๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ž…๋ ฅ ์ธ์ˆ˜๋งŒ ํ™•์ธํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. NtCreateํŒŒ์ผ (์ ‘๋‘์‚ฌ Nt๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋ณธ ํ•จ์ˆ˜์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.) ์ด ํ•จ์ˆ˜๋Š” Winternl.h ํ—ค๋” ํŒŒ์ผ์— ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฉฐ ntdll.dll์— ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์šฐ์ฃผ๋กœ ๋›ฐ์–ด๋“ค ์ค€๋น„๋ฅผ ํ•œ ํ›„ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Kernel32๋Š” Ntdll์˜ ๋ž˜ํผ์ผ ๋ฟ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” Microsoft๊ฐ€ ๊ธฐ๋ณธ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Microsoft๋Š” ๊ธฐ๋ณธ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์„ ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์—.

๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์š” ์žฅ์ ์€ ntdll์ด kernel32๋ณด๋‹ค ํ›จ์”ฌ ์ผ์ฐ ์‹œ์Šคํ…œ์— ๋กœ๋“œ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. kernel32๊ฐ€ ์ž‘๋™ํ•˜๋ ค๋ฉด ntdll์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋…ผ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ›จ์”ฌ ๋” ์ผ์ฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ Windows ๋ถ€ํŒ… ์ดˆ๊ธฐ์— ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ntdll์˜ ๊ธฐ๋Šฅ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ˆ: ์˜คํ† ํฌ ๋ˆ„๊ฐ€ ๊ณต์—ฐํ•˜๋Š”๊ฐ€ chkdisk ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ฃผ์š” ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋””์Šคํฌ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” Active Restore ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • DDK (๋“œ๋ผ์ด๋ฒ„ ๊ฐœ๋ฐœ ํ‚คํŠธ), ํ˜„์žฌ๋Š” WDK 7(Windows ๋“œ๋ผ์ด๋ฒ„ ํ‚คํŠธ)๋กœ๋„ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์ƒ ๋จธ์‹ (์˜ˆ: Windows 7 x64)
  • ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋” ํŒŒ์ผ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—

์ฝ”๋“œ์—๋Š” ๋ฌด์—‡์ด ๋“ค์–ด์žˆ๋‚˜์š”?

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

  1. ํ™”๋ฉด์— ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค
  2. ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  3. ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค
  4. ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง„์ž…์ ์€ main์ด๋‚˜ winmain์ด ์•„๋‹ˆ๋ผ NtProcessStartup ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‹œ์Šคํ…œ์—์„œ ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง์ ‘ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ™”๋ฉด์— ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค NtDisplayString, UNICODE_STRING ๊ตฌ์กฐ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. RtlInitUnicodeString์€ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ™”๋ฉด์— ํ…์ŠคํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//usage: WriteLn(L"Here is my textn");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

์šฐ๋ฆฌ๋Š” ntdll์˜ ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์•„์ง ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ๋ฒ•์— ํ™•์‹คํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. new ์—ฐ์‚ฐ์ž๋Š” ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ(๋„ˆ๋ฌด ๋†’์€ ์ˆ˜์ค€์˜ C++ ์„ธ๊ณ„์—์„œ ์™”๊ธฐ ๋•Œ๋ฌธ์—), malloc ํ•จ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค(๋Ÿฐํƒ€์ž„ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ). ๋ฌผ๋ก  ์Šคํƒ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํž™(์˜ˆ: ํž™)์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์šฐ๋ฆฌ ์Šค์Šค๋กœ ํž™์„ ๋งŒ๋“ค๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•ฉ์‹œ๋‹ค.

์ด ์ž‘์—…์— ์ ํ•ฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค RtlCreateHeap. ๋‹ค์Œ์œผ๋กœ RtlAllocateHeap ๋ฐ RtlFreeHeap์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•˜๊ณ  ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;

// create heap in order to allocate memory later
memory = RtlCreateHeap(
  HEAP_GROWABLE, 
  NULL, 
  1000, 
  0, NULL, NULL
);

// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
  memory, 
  HEAP_ZERO_MEMORY, 
  bufferSize
);

// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);

RtlDestroyHeap(memory);

ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๋„˜์–ด ๊ฐ‘์‹œ๋‹ค.

// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//...

HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;

// inialize variables
RtlInitUnicodeString(&keyboard, L"DeviceKeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

// open keyboard device
NtCreateFile(&hKeyBoard,
			SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
			&ObjectAttributes,
			&Iosb,
			NULL,
			FILE_ATTRIBUTE_NORMAL,
			0,
			FILE_OPEN,FILE_DIRECTORY_FILE,
			NULL, 0);

// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);

while (TRUE)
{
	NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
	NtWaitForSingleObject(hEvent, TRUE, NULL);

	if (kbData.MakeCode == 0x01)    // if ESC pressed
	{
			break;
	}
}

์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. NtReadํŒŒ์ผ ์—ด๋ ค ์žˆ๋Š” ์žฅ์น˜์—์„œ ํ‚ค๋ณด๋“œ๊ฐ€ ์–ด๋–ค ํ‚ค๋ผ๋„ ๋ˆŒ๋Ÿฌ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค. ESC ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ž‘์—…์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ์žฅ์น˜๋ฅผ ์—ด๋ ค๋ฉด NtCreateFile ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(DeviceKeyboardClass0์„ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค). ์šฐ๋ฆฌ๋„ ์ „ํ™”ํ• ๊ฒŒ NtCreate์ด๋ฒคํŠธ๋Œ€๊ธฐ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” KEYBOARD_INPUT_DATA ๊ตฌ์กฐ๋ฅผ ์ง์ ‘ ์„ ์–ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž‘์—…์ด ๋” ์‰ฌ์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. NtTerminateํ”„๋กœ์„ธ์Šค์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ๋‹จ์ˆœํžˆ ์šฐ๋ฆฌ ์ž์‹ ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์†Œ๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๋ชจ๋“  ์ฝ”๋“œ:

#include "ntifs.h" // WinDDK7600.16385.1incddk
#include "ntdef.h"

//------------------------------------
// Following function definitions can be found in native development kit
// but I am too lazy to include `em so I declare it here
//------------------------------------

NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess(
  IN HANDLE               ProcessHandle OPTIONAL,
  IN NTSTATUS             ExitStatus
);

NTSYSAPI 
NTSTATUS
NTAPI
NtDisplayString(
	IN PUNICODE_STRING String
);

NTSTATUS 
NtWaitForSingleObject(
  IN HANDLE         Handle,
  IN BOOLEAN        Alertable,
  IN PLARGE_INTEGER Timeout
);

NTSYSAPI 
NTSTATUS
NTAPI
NtCreateEvent(
    OUT PHANDLE             EventHandle,
    IN ACCESS_MASK          DesiredAccess,
    IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
    IN EVENT_TYPE           EventType,
    IN BOOLEAN              InitialState
);



// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//----------------------------------------------------------
// Our code goes here
//----------------------------------------------------------

// usage: WriteLn(L"Hello Native World!n");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

void NtProcessStartup(void* StartupArgument)
{
	// it is important to declare all variables at the beginning
	HANDLE hKeyBoard, hEvent;
	UNICODE_STRING skull, keyboard;
	OBJECT_ATTRIBUTES ObjectAttributes;
	IO_STATUS_BLOCK Iosb;
	LARGE_INTEGER ByteOffset;
	KEYBOARD_INPUT_DATA kbData;
	
	PVOID memory = NULL;
	PVOID buffer = NULL;
	ULONG bufferSize = 42;

	//use it if debugger connected to break
	//DbgBreakPoint();

	WriteLn(L"Hello Native World!n");

	// inialize variables
	RtlInitUnicodeString(&keyboard, L"DeviceKeyboardClass0");
	InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

	// open keyboard device
	NtCreateFile(&hKeyBoard,
				SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
				&ObjectAttributes,
				&Iosb,
				NULL,
				FILE_ATTRIBUTE_NORMAL,
				0,
				FILE_OPEN,FILE_DIRECTORY_FILE,
				NULL, 0);

	// create event to wait on
	InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
	NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
	
	WriteLn(L"Keyboard readyn");
	
	// create heap in order to allocate memory later
	memory = RtlCreateHeap(
	  HEAP_GROWABLE, 
	  NULL, 
	  1000, 
	  0, NULL, NULL
	);
	
	WriteLn(L"Heap readyn");

	// allocate buffer of size bufferSize
	buffer = RtlAllocateHeap(
	  memory, 
	  HEAP_ZERO_MEMORY, 
	  bufferSize
	);
	
	WriteLn(L"Buffer allocatedn");

	// free buffer (actually not needed because we destroy heap in next step)
	RtlFreeHeap(memory, 0, buffer);

	RtlDestroyHeap(memory);
	
	WriteLn(L"Heap destroyedn");
	
	WriteLn(L"Press ESC to continue...n");

	while (TRUE)
	{
		NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
		NtWaitForSingleObject(hEvent, TRUE, NULL);

		if (kbData.MakeCode == 0x01)    // if ESC pressed
		{
				break;
		}
	}

	NtTerminateProcess(NtCurrentProcess(), 0);
}

์ถ”์‹ : ์ฝ”๋“œ์—์„œ DbgBreakPoint() ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊ฑฐ์—์„œ ์ด๋ฅผ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ปค๋„ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด์„œ๋Š” WinDbg๋ฅผ ๊ฐ€์ƒ ๋จธ์‹ ์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์— ๋˜๋Š” ๊ทธ๋ƒฅ ์‚ฌ์šฉ ๊ฐ€์ƒKD.

์ปดํŒŒ์ผ ๋ฐ ์–ด์…ˆ๋ธ”๋ฆฌ

๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DDK (๋“œ๋ผ์ด๋ฒ„ ๊ฐœ๋ฐœ ํ‚คํŠธ). ์ตœ์‹  ๋ฒ„์ „์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ณ  Visual Studio์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๊ณ ๋Œ€ ์ผ๊ณฑ ๋ฒˆ์งธ ๋ฒ„์ „์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. DDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ์—๋Š” Makefile๊ณผ ์†Œ์Šค๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Makefile

!INCLUDE $(NTMAKEENV)makefile.def

์ถœ์ฒ˜ :

TARGETNAME			= MyNative
TARGETTYPE			= PROGRAM
UMTYPE				= nt
BUFFER_OVERFLOW_CHECKS 		= 0
MINWIN_SDK_LIB_PATH		= $(SDK_LIB_PATH)
SOURCES 			= source.c

INCLUDES 			= $(DDK_INC_PATH); 
				  C:WinDDK7600.16385.1ndk;

TARGETLIBS 			= $(DDK_LIB_PATH)ntdll.lib	
				  $(DDK_LIB_PATH)nt.lib

USE_NTDLL			= 1

Makefile์€ ์™„์ „ํžˆ ๋™์ผํ•˜์ง€๋งŒ ์†Œ์Šค๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค(.c ํŒŒ์ผ), ๋นŒ๋“œ ์˜ต์…˜ ๋ฐ ๊ธฐํƒ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • TARGETNAME โ€“ ์ตœ์ข…์ ์œผ๋กœ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • TARGETTYPE โ€“ ์‹คํ–‰ ํŒŒ์ผ ์œ ํ˜•. ๋“œ๋ผ์ด๋ฒ„(.sys)์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•„๋“œ ๊ฐ’์€ DRIVER์—ฌ์•ผ ํ•˜๋ฉฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.lib)์ธ ๊ฒฝ์šฐ ๊ฐ’์€ LIBRARY์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰ ํŒŒ์ผ(.exe)์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ฐ’์„ PROGRAM์œผ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • UMTYPE โ€“ ์ด ํ•„๋“œ์— ๊ฐ€๋Šฅํ•œ ๊ฐ’: ์ฝ˜์†” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ์ฝ˜์†”, ์ฐฝ ๋ชจ๋“œ ์ž‘์—…์šฉ ์ฐฝ. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์–ป์œผ๋ ค๋ฉด nt๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • BUFFER_OVERFLOW_CHECKS โ€“ ์Šคํƒ์—์„œ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ๋ฏ€๋กœ ๋•๋‹ˆ๋‹ค.
  • MINWIN_SDK_LIB_PATH โ€“ ์ด ๊ฐ’์€ SDK_LIB_PATH ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ์„ ์–ธ๋œ ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๊ฐ€ ์—†๋‹ค๊ณ  ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. DDK์—์„œ ๊ฒ€์‚ฌ๋œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ณ  ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • SOURCES โ€“ ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
  • INCLUDES - ์–ด์…ˆ๋ธ”๋ฆฌ์— ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ DDK์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ์ถ”๊ฐ€๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • TARGETLIBS - ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
  • USE_NTDLL์€ ๋ช…๋ฐฑํ•œ ์ด์œ ๋กœ 1๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • USER_C_FLAGS โ€“ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ•  ๋•Œ ์ „์ฒ˜๋ฆฌ๊ธฐ ์ง€์‹œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋นŒ๋“œํ•˜๋ ค๋ฉด x86(๋˜๋Š” x64) Checked Build๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ๋ณ€๊ฒฝํ•œ ํ›„ Build ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์˜ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ ์‹คํ–‰ ํŒŒ์ผ์ด ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค

์ด ํŒŒ์ผ์€ ๊ทธ๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ํ•ด๋‹น ๋™์ž‘์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋„๋ก ์ €์ฃผํ•˜๊ณ  ๋ณด๋ƒ…๋‹ˆ๋‹ค.

Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค

๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

autochk๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘ ์ˆœ์„œ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ‚ค ๊ฐ’์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

HKLMSystemCurrentControlSetControlSession ManagerBootExecute

์„ธ์…˜ ๊ด€๋ฆฌ์ž๋Š” ์ด ๋ชฉ๋ก์˜ ํ”„๋กœ๊ทธ๋žจ์„ ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๊ด€๋ฆฌ์ž๋Š” system32 ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹คํ–‰ ํŒŒ์ผ ์ž์ฒด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ‚ค ๊ฐ’ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

autocheck autochk *MyNative

๊ฐ’์€ ์ผ๋ฐ˜์ ์ธ ASCII๊ฐ€ ์•„๋‹Œ XNUMX์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ์œ„์— ํ‘œ์‹œ๋œ ํ‚ค์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

์ œ๋ชฉ์„ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜จ๋ผ์ธ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด.

Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค
๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹คํ–‰ ํŒŒ์ผ์„ system32 ํด๋”์— ๋ณต์‚ฌํ•˜์„ธ์š”.
  2. ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‚ค ์ถ”๊ฐ€
  3. ๋จธ์‹ ์„ ์žฌ๋ถ€ํŒ…ํ•˜์„ธ์š”

ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์น˜๋ฅผ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

install.bat๋ฅผ

@echo off
copy MyNative.exe %systemroot%system32.
regedit /s add.reg
echo Native Example Installed
pause

add.reg

REGEDIT4

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession Manager]
"BootExecute"=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

์„ค์น˜ ๋ฐ ์žฌ๋ถ€ํŒ… ํ›„ ์‚ฌ์šฉ์ž ์„ ํƒ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜๊ธฐ ์ „์—๋„ ๋‹ค์Œ ๊ทธ๋ฆผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Windows ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ Acronis Active Restore ์„œ๋น„์Šค

ํ•ฉ๊ณ„

์ด๋Ÿฌํ•œ ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” Windows Native ์ˆ˜์ค€์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, Innopolis University์˜ ํŒ€์›๋“ค๊ณผ ์ €๋Š” ์ด์ „ ํ”„๋กœ์ ํŠธ ๋ฒ„์ „๋ณด๋‹ค ํ›จ์”ฌ ์ผ์ฐ ๋“œ๋ผ์ด๋ฒ„์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๊ณ„์†ํ•ด์„œ ๊ตฌ์ถ•ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  win32 ์…ธ์˜ ์ถœํ˜„์œผ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ๋œ ๋ณธ๊ฒฉ์ ์ธ ์„œ๋น„์Šค๋กœ ์ œ์–ด๊ถŒ์„ ์ด์ „ํ•˜๋Š” ๊ฒƒ์ด ๋…ผ๋ฆฌ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—).

๋‹ค์Œ ๊ธฐ์‚ฌ์—์„œ๋Š” Active Restore ์„œ๋น„์Šค์˜ ๋˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์ธ UEFI ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ์„ ๋†“์น˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ธ”๋กœ๊ทธ๋ฅผ ๊ตฌ๋…ํ•˜์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€