์ค๋ ์ฐ๋ฆฌ๋ Innopolis University์ ์ง์๋ค๊ณผ ํจ๊ป ์ฌ์ฉ์๊ฐ ์ฅ์ ๋ฐ์ ํ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์์ ์ ์์ํ ์ ์๋๋ก Active Restore ๊ธฐ์ ์ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๊ณ์ํฉ๋๋ค. ์์ฑ ๋ฐ ์คํ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ๊ธฐ๋ณธ Windows ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ปท ์๋์๋ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๋ํ ๋ด์ฉ๊ณผ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ๋ฐฉ๋ฒ์ ๋ํ ์ค์ฉ์ ์ธ ๊ฐ์ด๋๊ฐ ๋์ ์์ต๋๋ค.
์ด์ ๊ฒ์๋ฌผ์์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง์ ๋ํด ์ด์ผ๊ธฐํ์ต๋๋ค.
- ํจ์ฌ ๋ ์ผ์ฐ ์๋น์ค ์์ฒด๋ฅผ ์์ํ์ญ์์ค.
- ํจ์ฌ ์ด์ ์ ๋ฐฑ์ ์ด ์์นํ ํด๋ผ์ฐ๋์ ๋ฌธ์ํ์ธ์.
- ์์คํ ์ด ์ด๋ค ๋ชจ๋์ ์๋์ง ์ดํดํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋น ๋ฆ ๋๋ค(์ผ๋ฐ ๋ถํ ๋๋ ๋ณต๊ตฌ).
- ๋ฏธ๋ฆฌ ๋ณต๊ตฌํ ํ์ผ ์๊ฐ ํจ์ฌ ์ ์ต๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋์ฑ ๋น ๋ฅด๊ฒ ์์ํ ์ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ ์ฑ์ด๋ ๋ฌด์์ธ๊ฐ์?
์ด ์ง๋ฌธ์ ๋๋ตํ๊ธฐ ์ํด ์๋ฅผ ๋ค์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ํ์ผ์ ์์ฑํ๋ ค๊ณ ์๋ํ๋ ๊ฒฝ์ฐ ์์คํ ์ด ํธ์ถํ๋ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Pavel Yosifovich - Windows ์ปค๋ ํ๋ก๊ทธ๋๋ฐ(2019)
ํ๋ก๊ทธ๋๋จธ๋ ๋ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ๋ณธ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ์ฅ์ ์ ntdll์ด kernel32๋ณด๋ค ํจ์ฌ ์ผ์ฐ ์์คํ ์ ๋ก๋๋๋ค๋ ๊ฒ์ ๋๋ค. kernel32๊ฐ ์๋ํ๋ ค๋ฉด ntdll์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ ผ๋ฆฌ์ ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์ฌ ๋ ์ผ์ฐ ์์ ์ ์์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Windows ๊ธฐ๋ณธ ์์ฉ ํ๋ก๊ทธ๋จ์ Windows ๋ถํ
์ด๊ธฐ์ ์์ํ ์ ์๋ ํ๋ก๊ทธ๋จ์
๋๋ค. ๊ทธ๋ค์ ntdll์ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์:
์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ๋ฌด์์ ๋๊น?
DDK (๋๋ผ์ด๋ฒ ๊ฐ๋ฐ ํคํธ), ํ์ฌ๋ WDK 7(Windows ๋๋ผ์ด๋ฒ ํคํธ)๋ก๋ ์๋ ค์ ธ ์์ต๋๋ค.- ๊ฐ์ ๋จธ์ (์: Windows 7 x64)
- ๊ผญ ํ์ํ ๊ฒ์ ์๋์ง๋ง ๋ค์ด๋ก๋ํ ์ ์๋ ํค๋ ํ์ผ์ด ๋์์ด ๋ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์
์ฝ๋์๋ ๋ฌด์์ด ๋ค์ด์๋์?
์กฐ๊ธ ์ฐ์ตํด์ ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
- ํ๋ฉด์ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค
- ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํฉ๋๋ค.
- ํค๋ณด๋ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฝ๋๋ค
- ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํฉ๋๋ค.
๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ง์ ์ ์ main์ด๋ winmain์ด ์๋๋ผ NtProcessStartup ํจ์์ ๋๋ค. ์ค์ ๋ก ์์คํ ์์ ์ ํ๋ก์ธ์ค๋ฅผ ์ง์ ์์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ๋ฉด์ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๊ฒ๋ถํฐ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค
//usage: WriteLn(L"Here is my textn");
void WriteLn(LPWSTR Message)
{
UNICODE_STRING string;
RtlInitUnicodeString(&string, Message);
NtDisplayString(&string);
}
์ฐ๋ฆฌ๋ ntdll์ ํจ์๋ง ์ฌ์ฉํ ์ ์๊ณ ์์ง ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ๋ฒ์ ํ์คํ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ ๋๋ค. new ์ฐ์ฐ์๋ ์์ง ์กด์ฌํ์ง ์์ผ๋ฉฐ(๋๋ฌด ๋์ ์์ค์ C++ ์ธ๊ณ์์ ์๊ธฐ ๋๋ฌธ์), malloc ํจ์๋ ์์ต๋๋ค(๋ฐํ์ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํจ). ๋ฌผ๋ก ์คํ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํด์ผ ํ๋ค๋ฉด ํ(์: ํ)์์ ์ํํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ์ค์ค๋ก ํ์ ๋ง๋ค๊ณ ํ์ํ ๋๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํฉ์๋ค.
์ด ์์
์ ์ ํฉํ ๊ธฐ๋ฅ์
๋๋ค
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;
}
}
์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ๋ฟ์
๋๋ค.
๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ ํจ์ ํธ์ถ๋ก ์ข
๋ฃ๋ฉ๋๋ค.
์๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ชจ๋ ์ฝ๋:
#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๋ฅผ ๊ฐ์ ๋จธ์ ์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ฐพ์ ์ ์์ต๋๋ค
์ปดํ์ผ ๋ฐ ์ด์ ๋ธ๋ฆฌ
๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ค์์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
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 ๋ช ๋ น์ ์คํํด์ผ ํฉ๋๋ค. ์คํฌ๋ฆฐ์ท์ ๊ฒฐ๊ณผ๋ ํ๋์ ์คํ ํ์ผ์ด ์์์ ๋ณด์ฌ์ค๋๋ค.
์ด ํ์ผ์ ๊ทธ๋ ๊ฒ ์ฝ๊ฒ ์์ํ ์ ์์ผ๋ฉฐ ์์คํ
์ ๋ค์ ์ค๋ฅ์ ํจ๊ป ํด๋น ๋์์ ๋ํด ์๊ฐํ๋๋ก ์ ์ฃผํ๊ณ ๋ณด๋
๋๋ค.
๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
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
์ ๋ชฉ์ ๋ณํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์จ๋ผ์ธ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํ๋ ค๋ฉด ๋ค์์ด ํ์ํฉ๋๋ค.
- ์คํ ํ์ผ์ system32 ํด๋์ ๋ณต์ฌํ์ธ์.
- ๋ ์ง์คํธ๋ฆฌ์ ํค ์ถ๊ฐ
- ๋จธ์ ์ ์ฌ๋ถํ ํ์ธ์
ํธ์๋ฅผ ์ํด ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ค์น๋ฅผ ์ํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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 Native ์์ค์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ํ์ ํ์ต๋๋ค. ๋ค์์ผ๋ก, Innopolis University์ ํ์๋ค๊ณผ ์ ๋ ์ด์ ํ๋ก์ ํธ ๋ฒ์ ๋ณด๋ค ํจ์ฌ ์ผ์ฐ ๋๋ผ์ด๋ฒ์์ ์ํธ ์์ฉ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ์๋น์ค๋ฅผ ๊ณ์ํด์ ๊ตฌ์ถํ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ win32 ์
ธ์ ์ถํ์ผ๋ก ์ด๋ฏธ ๊ฐ๋ฐ๋ ๋ณธ๊ฒฉ์ ์ธ ์๋น์ค๋ก ์ ์ด๊ถ์ ์ด์ ํ๋ ๊ฒ์ด ๋
ผ๋ฆฌ์ ์ผ ๊ฒ์
๋๋ค.
๋ค์ ๊ธฐ์ฌ์์๋ Active Restore ์๋น์ค์ ๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ธ UEFI ๋๋ผ์ด๋ฒ๋ฅผ ๋ค๋ฃจ๊ฒ ์ต๋๋ค. ๋ค์ ๊ฒ์๋ฌผ์ ๋์น์ง ์์ผ๋ ค๋ฉด ๋ธ๋ก๊ทธ๋ฅผ ๊ตฌ๋
ํ์ธ์.
์ถ์ฒ : habr.com