рдЖрдЬ рд╣рд╛рдореА рдХрд╕рд░реА рдЗрдиреЛрдкреЛрд▓рд┐рд╕ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдХрд╛ рдХреЗрдЯрд╛рд╣рд░реВрд╕рдБрдЧ рдорд┐рд▓реЗрд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЕрд╕рдлрд▓рддрд╛ рдкрдЫрд┐ рд╕рдХреЗрд╕рдореНрдо рдЪрд╛рдБрдбреЛ рдЖрдлреНрдиреЛ рдореЗрд╕рд┐рдирдорд╛ рдХрд╛рдо рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рди рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рд╡рд┐рдзрд┐рдХреЛ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрджреИрдЫреМрдВ рднрдиреНрдиреЗ рдХрдерд╛ рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред рд╣рд╛рдореА рдиреЗрдЯрд┐рдн рд╡рд┐рдиреНрдбреЛрдЬ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рд╕реБрд░реБрд╡рд╛рддрдХрд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рд╕рд╣рд┐рддред рдХрдЯ рддрд▓ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдереЛрд░реИ рдЫ, рд╕рд╛рдерд╕рд╛рдереИ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЧрд╛рдЗрдбред
рдЕрдШрд┐рд▓реНрд▓реЛ рдкреЛрд╕реНрдЯрд╣рд░реВрдорд╛ рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдпреЛ рдХреЗ рд╣реЛ рднрдиреЗрд░ рдХреБрд░рд╛ рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ
- рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН
- рдХреНрд▓рд╛рдЙрдбрд▓рд╛рдИ рд╕рдореНрдкрд░реНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЬрд╣рд╛рдБ рдмреНрдпрд╛рдХрдЕрдк рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдЕрд╡рд╕реНрдерд┐рдд рдЫ
- рдкреНрд░рдгрд╛рд▓реА рдХреБрди рдореЛрдбрдорд╛ рдЫ рднрдиреЗрд░ рдмреБрдЭреНрди рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ - рд╕рд╛рдорд╛рдиреНрдп рдмреБрдЯ рд╡рд╛ рд░рд┐рдХрднрд░реА
- рдзреЗрд░реИ рдХрдо рдлрд╛рдЗрд▓рд╣рд░реВ рдЕрдЧреНрд░рд┐рдо рд░рд┐рдХрднрд░ рдЧрд░реНрди
- рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЕрдЭ рдЫрд┐рдЯреЛ рд╕реБрд░реБ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреБрд╣реЛрд╕реНред
рдЬреЗ рднрдП рдкрдирд┐ рдиреЗрдЯрд┐рдн рдПрдк рдХреЗ рд╣реЛ?
рдпрд╕ рдкреНрд░рд╢реНрдирдХреЛ рдЬрд╡рд╛рдл рджрд┐рдирдХреЛ рд▓рд╛рдЧрд┐, рдХрд▓рд╣рд░реВрдХреЛ рдЕрдиреБрдХреНрд░рдорд▓рд╛рдИ рд╣реЗрд░реМрдВ рдЬреБрди рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдмрдирд╛рдЙрдБрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдЖрдлреНрдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрдЫред
рдкрд╛рд╡реЗрд▓ рдпреЛрд╕рд┐рдлреЛрд╡рд┐рдЪ - рд╡рд┐рдиреНрдбреЛрдЬ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ (реирежрезреп)
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓реЗ рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ
рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрдХреЛ рдореБрдЦреНрдп рдлрд╛рдЗрджрд╛ рдпреЛ рд╣реЛ рдХрд┐ ntdll рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХрд░реНрдиреЗрд▓ рейреи рднрдиреНрджрд╛ рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рд▓реЛрдб рд╣реБрдиреНрдЫред рдпреЛ рддрд╛рд░реНрдХрд┐рдХ рдЫ, рдХрд┐рдирднрдиреЗ kernel32 рд▓рд╛рдИ рдХрд╛рдо рдЧрд░реНрди ntdll рдЪрд╛рд╣рд┐рдиреНрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдиреЗрдЯрд┐рдн рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрд▓реЗ рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдХрд╛рдо рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред
рдпрд╕рд░реА, рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╣реБрдиреН рдЬреБрди рд╡рд┐рдиреНрдбреЛрдЬ рдмреБрдЯрдорд╛ рд╕реБрд░реБ рд╣реБрди рд╕рдХреНрдЫред рддрд┐рдиреАрд╣рд░реВ рдХреЗрд╡рд▓ ntdll рдмрд╛рдЯ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫрдиреНред рдпрд╕реНрддреЛ рдЖрд╡реЗрджрди рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗ рдЪрд╛рд╣рд┐рдиреНрдЫ?
рдбреАрдбреАрдХреЗ (рдбреНрд░рд╛рдЗрднрд░ рдбреЗрднрд▓рдкрдореЗрдиреНрдЯ рдХрд┐рдЯ), рдЕрдм WDK 7 (Windows Driver Kit) рдХреЛ рд░реВрдкрдорд╛ рдкрдирд┐ рдЪрд┐рдирд┐рдиреНрдЫред- рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Windows 7 x64)
- рдЖрд╡рд╢реНрдпрдХ рдЫреИрди, рддрд░ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВрд▓реЗ рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ
рдпрд╣рд╛рдБ
рдХреЛрдбрдорд╛ рдХреЗ рдЫ?
рдереЛрд░реИ рдЕрднреНрдпрд╛рд╕ рдЧрд░реМрдВ рд░, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рдЬреБрди:
- рд╕реНрдХреНрд░рд┐рдирдорд╛ рд╕рдиреНрджреЗрд╢ рджреЗрдЦрд╛рдЙрдБрдЫ
- рдХреЗрд╣рд┐ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрджрдЫ
- рдХрд┐рдмреЛрд░реНрдб рдЗрдирдкреБрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреБрд╣реЛрд╕реН
- рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдореЗрдореЛрд░реА рдЦрд╛рд▓реА рдЧрд░реНрджрдЫ
рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрдорд╛, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдиреНрджреБ рдореБрдЦреНрдп рд╡рд╛ winmain рд╣реЛрдЗрди, рддрд░ NtProcessStartup рдкреНрд░рдХрд╛рд░реНрдп рд╣реЛ, рдХрд┐рдирдХрд┐ рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдирдпрд╛рдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВред
рд╕реНрдХреНрд░рд┐рдирдорд╛ рд╕рдиреНрджреЗрд╢ рджреЗрдЦрд╛рдПрд░ рд╕реБрд░реБ рдЧрд░реМрдВред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдиреЗрдЯрд┐рдн рдлрдВрдХреНрд╢рди рдЫ
//usage: WriteLn(L"Here is my textn");
void WriteLn(LPWSTR Message)
{
UNICODE_STRING string;
RtlInitUnicodeString(&string, Message);
NtDisplayString(&string);
}
рдХрд┐рдирдХрд┐ ntdll рдмрд╛рдЯ рдорд╛рддреНрд░ рдХрд╛рд░реНрдпрд╣рд░реВ рд╣рд╛рдореАрд▓рд╛рдИ рдЙрдкрд▓рдмреНрдз рдЫрдиреН, рд░ рдореЗрдореЛрд░реАрдорд╛ рдЕрдЭреИ рдХреБрдиреИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЫреИрдирдиреН, рд╣рд╛рдореА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдореЗрдореЛрд░реА рдХрд╕рд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╣реБрдиреЗрдЫреМрдВред рдирдпрд╛рдБ рдЕрдкрд░реЗрдЯрд░ рдЕрдЭреИ рдЕрд╡рд╕реНрдерд┐рдд рдЫреИрди (рдХрд┐рдирднрдиреЗ рдпреЛ 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);
}
PS: рд╣рд╛рдореА рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд╣рд╛рдореНрд░реЛ рдХреЛрдбрдорд╛ DbgBreakPoint() рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдбрд┐рдмрдЧрд░рдорд╛ рд░реЛрдХреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред рд╕рд╛рдБрдЪреЛ, рддрдкрд╛рдИрд▓реЗ WinDbg рд▓рд╛рдИ рдХрд░реНрдиреЗрд▓ рдбрд┐рдмрдЧрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ
рд╕рдВрдХрд▓рди рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рд╕рдмреИрднрдиреНрджрд╛ рд╕рдЬрд┐рд▓реЛ рддрд░рд┐рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛ
рдореЗрдХрдлрд╛рдЗрд▓
!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
рддрдкрд╛рдИрдВрдХреЛ рдореЗрдХрдлрд╛рдЗрд▓ рдареНрдпрд╛рдХреНрдХреИ рдЙрд╕реНрддреИ рд╣реБрдиреЗрдЫ, рддрд░ рдЕрд▓рд┐ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рд╕реНрд░реЛрддрд╣рд░реВ рд╣реЗрд░реМрдВред рдпреЛ рдлрд╛рдЗрд▓рд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд╕реНрд░реЛрддрд╣рд░реВ (.c рдлрд╛рдЗрд▓рд╣рд░реВ), рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ, рд░ рдЕрдиреНрдп рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫред
- TARGETNAME тАУ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рдХреЛ рдирд╛рдо рдЬреБрди рдЕрдиреНрддрдорд╛ рдЙрддреНрдкрд╛рджрди рдЧрд░реНрдиреБрдкрд░реНрдЫред
- TARGETTYPE - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рдХреЛ рдкреНрд░рдХрд╛рд░, рдпреЛ рдбреНрд░рд╛рдЗрднрд░ (.sys) рд╣реБрди рд╕рдХреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдлрд┐рд▓реНрдбрдХреЛ рдорд╛рди DRIVER рд╣реБрдиреБрдкрд░реНрдЫ, рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп (.lib), рддреНрдпрд╕рдкрдЫрд┐ рдорд╛рди LIBRARY рд╣реЛред рд╣рд╛рдореНрд░реЛ рдХреЗрд╕рдорд╛, рд╣рд╛рдореАрд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ (.exe) рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдорд╛рдирд▓рд╛рдИ PROGRAM рдорд╛ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВред
- UMTYPE - рдпрд╕ рдХреНрд╖реЗрддреНрд░рдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рдорд╛рдирд╣рд░реВ: рдХрдиреНрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрд╕реЛрд▓, рд╡рд┐рдиреНрдбреЛ рдореЛрдбрдорд╛ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рдиреНрдбреЛрдЬред рддрд░ рд╣рд╛рдореАрд▓реЗ рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди nt рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
- BUFFER_OVERFLOW_CHECKS - рдмрдлрд░ рдУрднрд░рдлреНрд▓реЛрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдЯреНрдпрд╛рдХ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢ рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рд╣реЛрдЗрди, рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдмрдиреНрдж рдЧрд░реНрдЫреМрдВред
- MINWIN_SDK_LIB_PATH - рдпреЛ рдорд╛рдирд▓реЗ SDK_LIB_PATH рдЪрд░рд▓рд╛рдИ рдЬрдирд╛рдЙрдБрдЫ, рдЪрд┐рдиреНрддрд╛ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рддреНрдпрд╕реНрддреЛ рдкреНрд░рдгрд╛рд▓реА рдЪрд░ рдШреЛрд╖рд┐рдд рдЫреИрди, рдЬрдм рд╣рд╛рдореАрд▓реЗ DDK рдмрд╛рдЯ рдЪреЗрдХ рдмрд┐рд▓реНрдб рдЪрд▓рд╛рдЙрдБрдЫреМрдВ, рдпреЛ рдЪрд░ рдШреЛрд╖рдгрд╛ рдЧрд░рд┐рдиреЗрдЫ рд░ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░реНрдиреЗрдЫред
- рд╕реНрд░реЛрддрд╣рд░реВ - рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд╕реВрдЪреАред
- рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ - рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВ рдЬреБрди рд╡рд┐рдзрд╛рдирд╕рднрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ DDK рд╕рдБрдЧ рдЖрдЙрдиреЗ рдлрд╛рдИрд▓рд╣рд░реВрдХреЛ рдорд╛рд░реНрдЧрд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ, рддрд░ рддрдкрд╛рдИрдВ рдердк рд░реВрдкрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдЕрдиреНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
- TARGETLIBS - рд▓рд┐рдЩреНрдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реВрдЪреАред
- USE_NTDLL рдПрдЙрдЯрд╛ рдЖрд╡рд╢реНрдпрдХ рдлрд┐рд▓реНрдб рд╣реЛ рдЬреБрди рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ 1 рдорд╛ рд╕реЗрдЯ рд╣реБрдиреБрдкрд░реНрдЫред
- USER_C_FLAGS - рдХреБрдиреИ рдкрдирд┐ рдлреНрд▓реНрдпрд╛рдЧрд╣рд░реВ рдЬреБрди рддрдкрд╛рдИрдВрд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХреЛрдб рддрдпрд╛рд░ рдЧрд░реНрджрд╛ рдкреНрд░рд┐рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рддреНрдпрд╕реЛрднрдП рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди, рд╣рд╛рдореАрд▓реЗ x86 (рд╡рд╛ x64) рдЪреЗрдХ рдЧрд░рд┐рдПрдХреЛ рдмрд┐рд▓реНрдб рдЪрд▓рд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдХрд╛рдо рдЧрд░реНрдиреЗ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд▓рд╛рдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ Build рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред рд╕реНрдХреНрд░рд┐рдирд╕рдЯрдХреЛ рдирддрд┐рдЬрд╛рд▓реЗ рджреЗрдЦрд╛рдЙрдБрдЫ рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ рдЫред
рдпреЛ рдлрд╛рдЗрд▓ рдпрддрд┐ рд╕рдЬрд┐рд▓реИ рд▓рдиреНрдЪ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди, рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рд╕рд░рд╛рдкреНрдЫ рд░ рд╣рд╛рдореАрд▓рд╛рдИ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐рдХреЛ рд╕рд╛рде рдпрд╕рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реЛрдЪреНрди рдкрдард╛рдЙрдБрдЫ:
рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХрд╕рд░реА рд╕реБрд░реБ рдЧрд░реНрдиреЗ?
рдЬрдм autochk рд╕реБрд░реБ рд╣реБрдиреНрдЫ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВрдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЕрдиреБрдХреНрд░рдо рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдЮреНрдЬреАрдХреЛ рдорд╛рдирджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫ:
HKLMSystemCurrentControlSetControlSession ManagerBootExecute
рд╕рддреНрд░ рдкреНрд░рдмрдиреНрдзрдХрд▓реЗ рдпрд╕ рд╕реВрдЪреАрдмрд╛рдЯ рдПрдХ-рдПрдХ рдЧрд░реА рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫред рд╕рддреНрд░ рдкреНрд░рдмрдиреНрдзрдХрд▓реЗ рдкреНрд░рдгрд╛рд▓реА32 рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рд╣рд░реВ рдЖрдлреИрдВ рдЦреЛрдЬреНрдЫред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдЮреНрдЬреА рдорд╛рди рдврд╛рдБрдЪрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ:
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
рд╢реАрд░реНрд╖рдХ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди, рддрдкрд╛рдИрдВ рдЕрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐,
рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдПрдХ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрди, рд╣рд╛рдореАрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдЫ:
- рдкреНрд░рдгрд╛рд▓реА32 рдлреЛрд▓реНрдбрд░рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН
- рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдХреБрдЮреНрдЬреА рдердкреНрдиреБрд╣реЛрд╕реН
- рдореЗрд╕рд┐рди рд░рд┐рдмреБрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН
рд╕реБрд╡рд┐рдзрд╛рдХреЛ рд▓рд╛рдЧрд┐, рдпрд╣рд╛рдБ рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЫ:
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
рд╕реНрдерд╛рдкрдирд╛ рд░ рд░рд┐рдмреБрдЯ рдкрдЫрд┐, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЪрдпрди рд╕реНрдХреНрд░рд┐рди рджреЗрдЦрд╛ рдкрд░реНрдиреБ рдЕрдШрд┐, рд╣рд╛рдореА рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ:
рдкрд░рд┐рдгрд╛рдо
рдпрд╕реНрддреЛ рд╕рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореА рд╡рд┐рд╢реНрд╡рд╕реНрдд рдерд┐рдпреМрдВ рдХрд┐ рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рд╕реНрддрд░рдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд▓рд╛рдЙрди рд╕рдореНрднрд╡ рдЫред рдЕрд░реНрдХреЛ, рдЗрдиреЛрдкреЛрд▓рд┐рд╕ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдХрд╛ рдХреЗрдЯрд╛рд╣рд░реВ рд░ рдо рдПрдХ рд╕реЗрд╡рд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдЕрдШрд┐рд▓реНрд▓реЛ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рддреБрд▓рдирд╛рдорд╛ рдбреНрд░рд╛рдЗрднрд░рд╕рдБрдЧ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫред рд░ win32 рд╢реЗрд▓рдХреЛ рдЖрдЧрдордирдХреЛ рд╕рд╛рде, рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╡рд┐рдХрд╕рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдкреВрд░реНрдг рд╕реЗрд╡рд╛рдорд╛ рдирд┐рдпрдиреНрддреНрд░рдг рд╣рд╕реНрддрд╛рдиреНрддрд░рдг рдЧрд░реНрди рддрд╛рд░реНрдХрд┐рдХ рд╣реБрдиреЗрдЫ (рдпрд╕рдорд╛ рдердк
рдЕрд░реНрдХреЛ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛рдХреЛ рдЕрд░реНрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрдорд╛ рдЫреБрдиреЗрдЫреМрдВ, рдЕрд░реНрдерд╛рддреН UEFI рдбреНрд░рд╛рдЗрднрд░ред рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН рддрд╛рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЕрд░реНрдХреЛ рдкреЛрд╕реНрдЯ рдирдЫреБрдЯрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред
рд╕реНрд░реЛрдд: www.habr.com