Windows Native Applications ื•ืฉื™ืจื•ืช Acronis Active Restore

ื”ื™ื•ื ืื ื—ื ื• ืžืžืฉื™ื›ื™ื ืืช ื”ืกื™ืคื•ืจ ืฉืœ ืื™ืš ืื ื—ื ื•, ื™ื—ื“ ืขื ื”ื—ื‘ืจ'ื” ืžืื•ื ื™ื‘ืจืกื™ื˜ืช Innopolis, ืžืคืชื—ื™ื ืืช ื˜ื›ื ื•ืœื•ื’ื™ื™ืช Active Restore ื›ื“ื™ ืœืืคืฉืจ ืœืžืฉืชืžืฉ ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ืขืœ ื”ืžื—ืฉื‘ ืฉืœื• ื‘ื”ืงื“ื ื”ืืคืฉืจื™ ืœืื—ืจ ืชืงืœื”. ื ื“ื‘ืจ ืขืœ ื™ื™ืฉื•ืžื™ Windows ืžืงื•ืจื™ื™ื, ื›ื•ืœืœ ืชื›ื•ื ื•ืช ื”ื™ืฆื™ืจื” ื•ื”ื”ืฉืงื” ืฉืœื”ื. ืžืชื—ืช ืœื—ื™ืชื•ืš ื™ืฉ ืงืฆืช ืขืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื ื•, ื›ืžื• ื’ื ืžื“ืจื™ืš ืžืขืฉื™ ื›ื™ืฆื“ ืœื›ืชื•ื‘ ื™ื™ืฉื•ืžื™ื ืžืงื•ืจื™ื™ื.

Windows Native Applications ื•ืฉื™ืจื•ืช Acronis Active Restore

ื‘ืคื•ืกื˜ื™ื ืงื•ื“ืžื™ื ื›ื‘ืจ ื“ื™ื‘ืจื ื• ืขืœ ืžื” ื–ื” ืฉื—ื–ื•ืจ ืคืขื™ืœ, ื•ื›ื™ืฆื“ ืžืชืคืชื—ื™ื ืชืœืžื™ื“ื™ื ืžืื™ื ื•ืคื•ืœื™ืก ืฉืจื•ืช. ื”ื™ื•ื ืื ื™ ืจื•ืฆื” ืœื”ืชืžืงื“ ื‘ื™ื™ืฉื•ืžื™ื ืžืงื•ืจื™ื™ื, ืฉื‘ืจืžืชื ืื ื—ื ื• ืจื•ืฆื™ื "ืœืงื‘ื•ืจ" ืืช ืฉื™ืจื•ืช ื”ืฉื—ื–ื•ืจ ื”ืคืขื™ืœ ืฉืœื ื•. ืื ื”ื›ืœ ื™ืกืชื“ืจ, ื ื•ื›ืœ:

  • ื”ืคืขืœ ืืช ื”ืฉื™ืจื•ืช ืขืฆืžื• ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ืงื“ื
  • ืฆื•ืจ ืงืฉืจ ืขื ื”ืขื ืŸ ืฉื‘ื• ื ืžืฆื ื”ื’ื™ื‘ื•ื™ ื”ืจื‘ื” ืงื•ื“ื ืœื›ืŸ
  • ื”ืจื‘ื” ืงื•ื“ื ื›ื“ื™ ืœื”ื‘ื™ืŸ ื‘ืื™ื–ื” ืžืฆื‘ ื”ืžืขืจื›ืช ื ืžืฆืืช - ืืชื—ื•ืœ ืจื’ื™ืœ ืื• ืฉื—ื–ื•ืจ
  • ื”ืจื‘ื” ืคื—ื•ืช ืงื‘ืฆื™ื ืœืฉื—ื–ื•ืจ ืžืจืืฉ
  • ืืคืฉืจ ืœืžืฉืชืžืฉ ืœื”ืชื—ื™ืœ ืืคื™ืœื• ืžื”ืจ ื™ื•ืชืจ.

ืžื”ื™ ื‘ื›ืœืœ ืืคืœื™ืงืฆื™ื” ืžืงื•ืจื™ืช?

ื›ื“ื™ ืœืขื ื•ืช ืขืœ ืฉืืœื” ื–ื•, ื ืกืชื›ืœ ืขืœ ืจืฆืฃ ื”ืฉื™ื—ื•ืช ืฉื”ืžืขืจื›ืช ืžื‘ืฆืขืช, ืœืžืฉืœ, ืื ืžืชื›ื ืช ื‘ืืคืœื™ืงืฆื™ื” ืฉืœื• ืžื ืกื” ืœื™ืฆื•ืจ ืงื•ื‘ืฅ.

Windows Native Applications ื•ืฉื™ืจื•ืช Acronis Active Restore
ืคืื‘ืœ ื™ื•ืกื™ืคื•ื‘ื™ืฅ' - ืชื›ื ื•ืช ืœื™ื‘ืช Windows (2019)

ื”ืžืชื›ื ืช ืžืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” CreateFile, ื”ืžื•ืฆื”ืจ ื‘ืงื•ื‘ืฅ ื”ื›ื•ืชืจืช fileapi.h ื•ืžื™ื•ืฉื ื‘-Kernel32.dll. ืขื ื–ืืช, ืคื•ื ืงืฆื™ื” ื–ื• ืขืฆืžื” ืœื ื™ื•ืฆืจืช ืืช ื”ืงื•ื‘ืฅ, ื”ื™ื ืจืง ื‘ื•ื“ืงืช ืืช ืืจื’ื•ืžื ื˜ื™ ื”ืงืœื˜ ื•ืงื•ืจืืช ืœืคื•ื ืงืฆื™ื” NtCreateFile (ื”ืงื™ื“ื•ืžืช Nt ืจืง ืžืฆื™ื™ื ืช ืฉื”ืคื•ื ืงืฆื™ื” ืžืงื•ืจื™ืช). ืคื•ื ืงืฆื™ื” ื–ื• ืžื•ืฆื”ืจืช ื‘ืงื•ื‘ืฅ ื”ื›ื•ืชืจืช winternl.h ื•ืžื™ื•ืฉืžืช ื‘-ntdll.dll. ื”ื•ื ืžืชื›ื•ื ืŸ ืœืงืคื•ืฅ ืœื—ืœืœ ื”ื’ืจืขื™ื ื™, ื•ืœืื—ืจ ืžื›ืŸ ื”ื•ื ืžื‘ืฆืข ืงืจื™ืืช ืžืขืจื›ืช ืœื™ืฆื™ืจืช ืงื•ื‘ืฅ. ื‘ืžืงืจื” ื–ื”, ืžืกืชื‘ืจ ืฉ-Kernel32 ื”ื•ื ืจืง ืžืขื˜ืคืช ืขื‘ื•ืจ Ntdll. ืื—ืช ื”ืกื™ื‘ื•ืช ืฉื‘ื’ืœืœืŸ ื–ื” ื ืขืฉื” ื”ื™ื ืฉืœืžื™ืงืจื•ืกื•ืคื˜ ื™ืฉ ืืช ื”ื™ื›ื•ืœืช ืœืฉื ื•ืช ืืช ื”ืคื•ื ืงืฆื™ื•ืช ืฉืœ ื”ืขื•ืœื ื”ืžืงื•ืžื™, ืื‘ืœ ืœื ืœื’ืขืช ื‘ืžืžืฉืงื™ื ื”ืกื˜ื ื“ืจื˜ื™ื™ื. ืžื™ืงืจื•ืกื•ืคื˜ ืœื ืžืžืœื™ืฆื” ืœืงืจื•ื ื™ืฉื™ืจื•ืช ืœืคื•ื ืงืฆื™ื•ืช ืžืงื•ืจื™ื•ืช ื•ืื™ื ื” ืžืชืขื“ืช ืืช ืจื•ื‘ืŸ. ืื’ื‘, ื ื™ืชืŸ ืœืžืฆื•ื ืคื•ื ืงืฆื™ื•ืช ืœื ืžืชื•ืขื“ื•ืช ื›ืืŸ.

ื”ื™ืชืจื•ืŸ ื”ืขื™ืงืจื™ ืฉืœ ื™ื™ืฉื•ืžื™ื ืžืงื•ืจื™ื™ื ื”ื•ื ืฉ-ntdll ื ื˜ืขืŸ ืœืžืขืจื›ืช ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ืงื“ื ืžืืฉืจ kernel32. ื–ื” ื”ื’ื™ื•ื ื™, ื›ื™ kernel32 ื“ื•ืจืฉ ntdll ืœืขื‘ื•ื“. ื›ืชื•ืฆืื” ืžื›ืš, ืืคืœื™ืงืฆื™ื•ืช ื”ืžืฉืชืžืฉื•ืช ื‘ืคื•ื ืงืฆื™ื•ืช ืžืงื•ืจื™ื•ืช ื™ื›ื•ืœื•ืช ืœื”ืชื—ื™ืœ ืœืขื‘ื•ื“ ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ืงื“ื.

ืœืคื™ื›ืš, ื™ื™ืฉื•ืžื™ Windows Native ื”ื ืชื•ื›ื ื™ื•ืช ืฉื™ื›ื•ืœื•ืช ืœื”ืชื—ื™ืœ ืžื•ืงื“ื ื‘ืืชื—ื•ืœ ืฉืœ Windows. ื”ื ืžืฉืชืžืฉื™ื ืจืง ื‘ืคื•ื ืงืฆื™ื•ืช ืž-ntdll. ื“ื•ื’ืžื” ืœื™ื™ืฉื•ื ื›ื–ื”: autochk ืžื™ ืžื‘ืฆืข ื›ืœื™ ื”ืฉื™ืจื•ืช chkdisk ื›ื“ื™ ืœื‘ื“ื•ืง ืื ื™ืฉ ืฉื’ื™ืื•ืช ื‘ื“ื™ืกืง ืœืคื ื™ ื”ืคืขืœืช ื”ืฉื™ืจื•ืชื™ื ื”ืจืืฉื™ื™ื. ื–ื• ื‘ื“ื™ื•ืง ื”ืจืžื” ืฉืื ื—ื ื• ืจื•ืฆื™ื ืฉื”-Active Restore ืฉืœื ื• ืชื”ื™ื”.

ื‘ืฉื‘ื™ืœ ืžื” ืื ื—ื ื• ืฆืจื™ื›ื™ื?

  • DDK (ืขืจื›ืช ืคื™ืชื•ื— ืžื ื”ืœื™ ื”ืชืงื ื™ื), ื”ื™ื“ื•ืขื” ื›ื™ื•ื ื’ื ื‘ืฉื WDK 7 (ืขืจื›ืช ืžื ื”ืœื™ ื”ืชืงืŸ ืฉืœ Windows).
  • ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช (ืœื“ื•ื’ืžื”, Windows 7 x64)
  • ืœื ื”ื›ืจื—ื™, ืื‘ืœ ืงื‘ืฆื™ ื›ื•ืชืจื•ืช ืฉื ื™ืชืŸ ืœื”ื•ืจื™ื“ ืขืฉื•ื™ื™ื ืœืขื–ื•ืจ ื›ืืŸ

ืžื” ื™ืฉ ื‘ืงื•ื“?

ื‘ื•ืื• ื ืชืืžืŸ ืงืฆืช, ื•ืœื“ื•ื’ืžื”, ื ื›ืชื•ื‘ ืืคืœื™ืงืฆื™ื” ืงื˜ื ื” ืฉ:

  1. ืžืฆื™ื’ ื”ื•ื“ืขื” ืขืœ ื”ืžืกืš
  2. ืžืงืฆื” ืงืฆืช ื–ื™ื›ืจื•ืŸ
  3. ืžืžืชื™ืŸ ืœืงืœื˜ ืžืงืœื“ืช
  4. ืžืคื ื” ื–ื™ื›ืจื•ืŸ ืžืฉื•ืžืฉ

ื‘ื™ื™ืฉื•ืžื™ื ืžืงื•ืจื™ื™ื, ื ืงื•ื“ืช ื”ื›ื ื™ืกื” ื”ื™ื ืœื ืจืืฉื™ ืื• 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 ื–ืžื™ื ื•ืช ืœื ื•, ื•ืคืฉื•ื˜ ืื™ืŸ ืขื“ื™ื™ืŸ ืกืคืจื™ื•ืช ืื—ืจื•ืช ื‘ื–ื™ื›ืจื•ืŸ, ื‘ื”ื—ืœื˜ ื™ื”ื™ื• ืœื ื• ื‘ืขื™ื•ืช ื›ื™ืฆื“ ืœื”ืงืฆื•ืช ื–ื™ื›ืจื•ืŸ. ื”ืื•ืคืจื˜ื•ืจ ื”ื—ื“ืฉ ืขื“ื™ื™ืŸ ืœื ืงื™ื™ื (ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืžื’ื™ืข ืžื”ืขื•ืœื ื”ื’ื‘ื•ื” ืžื“ื™ ืฉืœ 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;
	}
}

ื›ืœ ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ื–ื” ืœื”ืฉืชืžืฉ NtReadFile ื‘ืžื›ืฉื™ืจ ืคืชื•ื—, ื•ื”ืžืชืŸ ืขื“ ืฉื”ืžืงืœื“ืช ืชื—ื–ื™ืจ ืœื ื• ื›ืœ ืœื—ื™ืฆื”. ืื ืžืงืฉ ESC ื ืœื—ืฅ, ื ืžืฉื™ืš ืœืขื‘ื•ื“. ื›ื“ื™ ืœืคืชื•ื— ืืช ื”ืžื›ืฉื™ืจ, ื ืฆื˜ืจืš ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื” NtCreateFile (ื ืฆื˜ืจืš ืœืคืชื•ื— ืืช DeviceKeyboardClass0). ื’ื ืื ื—ื ื• ื ืชืงืฉืจ NtCreateEventื›ื“ื™ ืœืืชื—ืœ ืืช ืื•ื‘ื™ื™ืงื˜ ื”ื”ืžืชื ื”. ืื ื• ื ื›ืจื™ื– ื‘ืขืฆืžื ื• ืขืœ ืžื‘ื ื” KEYBOARD_INPUT_DATA, ื”ืžื™ื™ืฆื’ ืืช ื ืชื•ื ื™ ื”ืžืงืœื“ืช. ื–ื” ื™ืงืœ ืขืœ ื”ืขื‘ื•ื“ื” ืฉืœื ื•.

ื”ืืคืœื™ืงืฆื™ื” ื”ืžืงื•ืจื™ืช ืžืกืชื™ื™ืžืช ื‘ืงืจื™ืืช ืคื•ื ืงืฆื™ื” NtTerminateProcessื›ื™ ืื ื—ื ื• ืคืฉื•ื˜ ื”ื•ืจื’ื™ื ืืช ื”ืชื”ืœื™ืš ืฉืœื ื•.

ื›ืœ ื”ืงื•ื“ ืœืืคืœื™ืงืฆื™ื” ื”ืงื˜ื ื” ืฉืœื ื•:

#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() ื‘ืงื•ื“ ืฉืœื ื• ื›ื“ื™ ืœืขืฆื•ืจ ืื•ืชื” ื‘-debugger. ื ื›ื•ืŸ, ืชืฆื˜ืจืš ืœื—ื‘ืจ ืืช WinDbg ืœืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืœืฆื•ืจืš ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืœื™ื‘ื”. ื ื™ืชืŸ ืœืžืฆื•ื ื”ื•ืจืื•ืช ื›ื™ืฆื“ ืœืขืฉื•ืช ื–ืืช ื›ืืŸ ืื• ืคืฉื•ื˜ ืœื”ืฉืชืžืฉ VirtualKD.

ืงื•ืžืคื™ืœืฆื™ื” ื•ื”ืจื›ื‘ื”

ื”ื“ืจืš ื”ืงืœื” ื‘ื™ื•ืชืจ ืœื‘ื ื•ืช ืืคืœื™ืงืฆื™ื” ืžืงื•ืจื™ืช ื”ื™ื ืœื”ืฉืชืžืฉ 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, ืืœ ืชื“ืื’ ืฉืื™ืŸ ืœืš ืžืฉืชื ื” ืžืขืจื›ืช ืฉื›ื–ื”, ื›ืืฉืจ ื ืจื™ืฅ build checked ืžื”-DDK, ืžืฉืชื ื” ื–ื” ื™ื•ื›ืจื– ื•ื™ืฆื‘ื™ืข ืขืœ ื”ืกืคืจื™ื•ืช ื”ื“ืจื•ืฉื•ืช.
  • SOURCES - ืจืฉื™ืžืช ืžืงื•ืจื•ืช ืœืชื•ื›ื ื™ืช ืฉืœืš.
  • ื›ื•ืœืœ - ืงื‘ืฆื™ ื›ื•ืชืจื•ืช ื”ื ื“ืจืฉื™ื ืœื”ืจื›ื‘ื”. ื›ืืŸ ื”ื ื‘ื“ืจืš ื›ืœืœ ืžืฆื™ื™ื ื™ื ืืช ื”ื ืชื™ื‘ ืœืงื‘ืฆื™ื ืฉืžื’ื™ืขื™ื ืขื ื”-DDK, ืื‘ืœ ืืชื” ื™ื›ื•ืœ ื’ื ืœืฆื™ื™ืŸ ื›ืœ ืงื‘ืฆื™ื ืื—ืจื™ื.
  • TARGETLIBS - ืจืฉื™ืžืช ืกืคืจื™ื•ืช ืฉืฆืจื™ืš ืœืงืฉืจ.
  • USE_NTDLL ื”ื•ื ืฉื“ื” ื—ื•ื‘ื” ืฉื™ืฉ ืœื”ื’ื“ื™ืจ ืœ-1 ืžืกื™ื‘ื•ืช ื‘ืจื•ืจื•ืช.
  • USER_C_FLAGS - ื›ืœ ื”ื“ื’ืœื™ื ืฉื‘ื”ื ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื”ื ื—ื™ื•ืช ืžืขื‘ื“ ืงื“ื ื‘ืขืช ื”ื›ื ืช ืงื•ื“ ื™ื™ืฉื•ื.

ืื– ื›ื“ื™ ืœื‘ื ื•ืช, ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืจื™ืฅ ืืช x86 (ืื• x64) ืžืกื•ืžืŸ Build, ืœืฉื ื•ืช ืืช ืกืคืจื™ื™ืช ื”ืขื‘ื•ื“ื” ืœืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื•ืœื”ืคืขื™ืœ ืืช ื”ืคืงื•ื“ื” Build. ื”ืชื•ืฆืื” ื‘ืฆื™ืœื•ื ื”ืžืกืš ืžืจืื” ืฉื™ืฉ ืœื ื• ืงื•ื‘ืฅ ื”ืคืขืœื” ืื—ื“.

Windows Native Applications ื•ืฉื™ืจื•ืช Acronis Active Restore

ืœื ื ื™ืชืŸ ืœื”ืคืขื™ืœ ืืช ื”ืงื•ื‘ืฅ ื”ื–ื” ื›ืœ ื›ืš ื‘ืงืœื•ืช, ื”ืžืขืจื›ืช ืžืงืœืœืช ื•ืฉื•ืœื—ืช ืื•ืชื ื• ืœื—ืฉื•ื‘ ืขืœ ื”ื”ืชื ื”ื’ื•ืช ืฉืœื• ืขื ื”ืฉื’ื™ืื” ื”ื‘ืื”:

Windows Native Applications ื•ืฉื™ืจื•ืช Acronis Active Restore

ืื™ืš ืœื”ืคืขื™ืœ ืืคืœื™ืงืฆื™ื” ืžืงื•ืจื™ืช?

ื›ืืฉืจ 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

ื›ื“ื™ ืœื”ืžื™ืจ ืืช ื”ื›ื•ืชืจืช, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืฉื™ืจื•ืช ืžืงื•ื•ืŸ, ืœืžืฉืœ, ื–ื”.

Windows Native Applications ื•ืฉื™ืจื•ืช 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 Native Applications ื•ืฉื™ืจื•ืช Acronis Active Restore

ืกืš ื”ื›ืœ

ื‘ืืžืฆืขื•ืช ื”ื“ื•ื’ืžื” ืฉืœ ืืคืœื™ืงืฆื™ื” ื›ืœ ื›ืš ืงื˜ื ื”, ื”ืฉืชื›ื ืขื ื• ืฉืืคืฉืจ ื‘ื”ื—ืœื˜ ืœื”ืจื™ืฅ ืืช ื”ืืคืœื™ืงืฆื™ื” ื‘ืจืžืช Windows Native. ื‘ืฉืœื‘ ื”ื‘ื, ื”ื—ื‘ืจ'ื” ืžืื•ื ื™ื‘ืจืกื™ื˜ืช ืื™ื ื ื•ืคื•ืœื™ืก ื•ืื ื™ ื ืžืฉื™ืš ืœื‘ื ื•ืช ืฉื™ืจื•ืช ืฉื™ืชื—ื™ืœ ืืช ืชื”ืœื™ืš ื”ืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”ื ื”ื’ ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ืงื“ื ืžืืฉืจ ื‘ื’ืจืกื” ื”ืงื•ื“ืžืช ืฉืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื ื•. ื•ืขื ื”ื•ืคืขืช ืžืขื˜ืคืช win32, ื–ื” ื™ื”ื™ื” ื”ื’ื™ื•ื ื™ ืœื”ืขื‘ื™ืจ ืืช ื”ืฉืœื™ื˜ื” ืœืฉื™ืจื•ืช ืžืœื ืฉื›ื‘ืจ ืคื•ืชื— (ืขื•ื“ ืขืœ ื–ื” ื›ืืŸ).

ื‘ืžืืžืจ ื”ื‘ื ื ื™ื’ืข ื‘ืจื›ื™ื‘ ื ื•ืกืฃ ืฉืœ ืฉื™ืจื•ืช Active Restore, ื›ืœื•ืžืจ ืžื ื”ืœ ื”ื”ืชืงืŸ ืฉืœ UEFI. ื”ื™ืจืฉืžื• ืœื‘ืœื•ื’ ืฉืœื ื• ื›ื“ื™ ืฉืœื ืชืคืกืคืกื• ืืช ื”ืคื•ืกื˜ ื”ื‘ื.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”