Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ°ΡΡΠΊΠ°Π· ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ΅Π±ΡΡΠ°ΠΌΠΈ ΠΈΠ· Π£Π½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ° ΠΠ½Π½ΠΎΠΏΠΎΠ»ΠΈΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Active Restore, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π½ΡΡΠ΅ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Π½Π° ΡΠ²ΠΎΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΡ. Π Π΅ΡΡ ΠΏΠΎΠΉΠ΄Π΅Ρ ΠΎ Π½Π°ΡΠΈΠ²Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Windows, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°. ΠΠΎΠ΄ ΠΊΠ°ΡΠΎΠΌ β Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°ΡΡ Π½Π°ΡΠΈΠ²Π½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π ΠΏΡΠΎΡΠ»ΡΡ
ΠΏΠΎΡΡΠ°Ρ
ΠΌΡ ΡΠΆΠ΅ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π»ΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅
- ΠΠ°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π½ΡΡΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ°ΠΌ ΡΠ΅ΡΠ²ΠΈΡ
- ΠΠ°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π½ΡΡΠ΅ ΡΠ²ΡΠ·Π°ΡΡΡΡ Ρ ΠΎΠ±Π»Π°ΠΊΠΎΠΌ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π»Π΅ΠΆΠΈΡ Π±ΡΠΊΠ°ΠΏ
- ΠΠ°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π½ΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° β Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈΠ»ΠΈ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ
- ΠΠ°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π·Π°ΡΠ°Π½Π΅Π΅
- ΠΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅ Π΅ΡΠ΅ Π±ΡΡΡΡΠ΅Π΅.
Π§ΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΡΠ°ΠΊΠΎΠ΅ Π½Π°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅?
Π§ΡΠΎΠ±Ρ ΠΎΡΠ²Π΅ΡΠΈΡΡ Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ, Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ²Π΅ΡΡΠ°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ».
Pavel Yosifovich β Windows Kernel Programming (2019)
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ Π½Π°ΡΠΈΠ²Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ntdll Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π½ΡΡΠ΅ kernel32. ΠΡΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π²Π΅Π΄Ρ kernel32 ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ ntdll Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ. ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Π½Π°ΡΠΈΠ²Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΌΠΎΠ³ΡΡ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ°Π½ΡΡΠ΅.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Windows Native Applications β ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π½Π° ΡΠ°Π½Π½Π΅ΠΌ ΡΡΠ°ΠΏΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Windows. ΠΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π’ΠΠΠ¬ΠΠ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ntdll. ΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
Π§ΡΠΎ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ?
DDK (Driver Development Kit), Π½ΡΠ½Π΅ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ WDK 7 (Windows Driver Kit).- ΠΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, 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 (Π΄Π»Ρ Π½Π΅Π΅ Π½ΡΠΆΠ½Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ runtime C). ΠΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π»ΠΈΡΡ ΡΡΡΠΊΠΎΠΌ. ΠΠΎ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π°Π»Π»ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π² ΠΊΡΡΠ΅ (Ρ.Π΅. heap). ΠΠΎΡΡΠΎΠΌΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄Π»Ρ ΡΠ΅Π±Ρ ΠΊΡΡΡ ΠΈ Π±ΡΠ΄Π΅ΠΌ Π±ΡΠ°ΡΡ ΠΈΠ· Π½Π΅Π΅ ΠΏΠ°ΠΌΡΡΡ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ.
ΠΠ»Ρ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ
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);
}
PS: ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΡΡΠ½ΠΊΡΠΈΡ DbgBreakPoint() Π΄Π»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² Π΄Π΅Π±Π°Π³Π³Π΅ΡΠ΅. ΠΡΠ°Π²Π΄Π° Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ WinDbg ΠΊ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ Π΄Π»Ρ ΠΊΠ΅ΡΠ½Π΅Π»ΡΠ½ΠΎΠΉ ΠΎΡΠ»Π°Π΄ΠΊΠΈ. ΠΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΈ ΡΠ±ΠΎΡΠΊΠ°
Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΎΠ±ΡΠ°ΡΡ Π½Π°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
Makefile
!INCLUDE $(NTMAKEENV)makefile.def
sources:
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 Π±ΡΠ΄Π΅Ρ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅, Π½Π° sources ΠΆΠ΅ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ ΡΡΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅. Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (ΡΠ°ΠΉΠ»Ρ .c), ΠΎΠΏΡΠΈΠΈ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ.
- TARGETNAME β ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ Π² ΠΈΡΠΎΠ³Π΅.
- TARGETTYPE β ΡΠΈΠΏ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ (.sys), ΡΠΎΠ³Π΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ DRIVER, Π΅ΡΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° (.lib), ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ LIBRARY. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΡΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» (.exe), ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ PROGRAM.
- UMTYPE β Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ: console Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, windows Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅. ΠΠΎ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ nt, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
- BUFFER_OVERFLOW_CHECKS β ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠΊΠ° Π½Π° ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ°, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ Π½Π΅ Π½Π°Ρ ΡΠ»ΡΡΠ°ΠΉ, Π²ΡΠΊΠ»ΡΡΠ°Π΅ΠΌ.
- MINWIN_SDK_LIB_PATH β Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ SDK_LIB_PATH, Π½Π΅ ΡΡΠΎΠΈΡ ΠΏΠ΅ΡΠ΅ΠΆΠΈΠ²Π°ΡΡ ΡΡΠΎ Ρ Π²Π°Ρ Π½Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ checked build ΠΈΠ· DDK, Π΄Π°Π½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π° ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
- SOURCES β ΡΠΏΠΈΡΠΎΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
- INCLUDES β Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ. Π’ΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Π°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ΄ΡΡ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ΅ Ρ DDK, Π½ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅.
- TARGETLIBS β ΡΠΏΠΈΡΠΎΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²Π°ΡΡ.
- USE_NTDLL β ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π² ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ 1. ΠΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ.
- USER_C_FLAGS β Π»ΡΠ±ΡΠ΅ ΡΠ»Π°Π³ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°Ρ ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ°ΠΊ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ x86 (ΠΈΠ»ΠΈ x64) Checked Build, ΡΠΌΠ΅Π½ΠΈΡΡ ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π½Π° ΠΏΠ°ΠΏΠΊΡ Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Build. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠΊΡΠΈΠ½ΡΠΎΡΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΡΠΎ Ρ Π½Π°Ρ ΡΠΎΠ±ΡΠ°Π»ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ».
ΠΠ°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ, ΡΠΈΡΡΠ΅ΠΌΠ° ΡΡΠ³Π°Π΅ΡΡΡ ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°Ρ Π΄ΡΠΌΠ°ΡΡ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ:
ΠΠ°ΠΊ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅?
Π ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°ΡΡΠ° autochk ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ° ΡΠ΅Π΅ΡΡΡΠ°:
HKLMSystemCurrentControlSetControlSession ManagerBootExecute
ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΠΈΠΈ ΠΏΠΎΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°. Π‘Π°ΠΌΠΈ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΡΠ΅ΡΡΠΈΠΈ ΠΈΡΠ΅Ρ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ system32. Π€ΠΎΡΠΌΠ°Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΡΡΠ° ΡΠ΅Π΅ΡΡΡΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
autocheck autochk *MyNative
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠ΅ΡΠΈΡΠ½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅, Π° Π½Π΅ Π² ΠΏΡΠΈΠ²ΡΡΠ½ΠΎΠΌ ASCII, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠ»ΡΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π²ΡΡΠ΅, Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΡΠΌΠ°Ρ:
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 Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠ°Π»ΡΡΠ΅ ΠΌΡ Ρ ΡΠ΅Π±ΡΡΠ°ΠΌΠΈ ΠΈΠ· Π£Π½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ° ΠΠ½Π½ΠΎΠΏΠΎΠ»ΠΈΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΡΡΠΎΠΈΡΡ ΡΠ΅ΡΠ²ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ win32 Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΠΎΠΌΡ ΡΠ΅ΡΠ²ΠΈΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ Π±ΡΠ» ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ (ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅
Π ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΊΠΎΡΠ½Π΅ΠΌΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ΅ΡΠ²ΠΈΡΠ° Active Restore, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ UEFI Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°. ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ΡΡ Π½Π° Π½Π°Ρ Π±Π»ΠΎΠ³, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΠΎΡΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com