Windows Accuratissima Applications et Acronis Active redde ministerium

Hodie fabulam continuamus quomodo nos, una cum Universitate Innopolitana guys, technologiam activam restituendi elaboramus ut utentem in machinam quam primum post defectum operandi permittat. Loquemur de applicationibus Fenestrarum indigenarum, etiam notarum suae creationis ac deducendae. Infra incisum est aliquid de nostro incepto, tum practicus dux in applicationibus nativis scribenda.

Windows Accuratissima Applications et Acronis Active redde ministerium

In praecedentibus stipibus iam locuti sumus quid sit Active reddeet quomodo discipuli ab Innopoli enucleentur? officium. Hodie in applicationibus indigenis intendere volumus, in quorum ambitu "sepelire" operam nostram activam volumus recuperare. Si omnia operantur, tunc erimus;

  • Emitte servitium ipsum multo ante
  • Contactus nubes ubi tergum multo ante sita est
  • Multo ante intellegendum est quem modum ratio sit in - normalis tabernus vel recuperatio
  • Multo pauciores lima in antecessum recuperare
  • Patitur utentis citius incipias.

Quid est patria usquam app?

Ad hanc quaestionem solvendam, inspiciamus ordinem vocat systema quod facit, exempli gratia, si programmator in applicatione suum limam creare conatur.

Windows Accuratissima Applications et Acronis Active redde ministerium
Pavel Yosifovich - Windows Kernel Programming (2019)

Munus utitur programmator CreateFilequae declaratur in fileapi.h et in Kernel32.dll lima capitis impleri. Nihilominus, hoc munus ipsum tabellam non creat, solum rationes initus coercet et munus vocat NtCreateFile (praepositionem Nt modo indicat functionem esse nativam). Hoc munus declaratur in file header in winternl.h et perfici in ntdll.dll. Salire in spatium nuclei parat, post quem ratio vocationis limam creandi facit. Hic, evenit ut Kernel32 iustus fasciculus Ntdll. Una e causis, cur id factum sit, Microsoft ita facultatem habet mu- nera terrarum orbis, sed vexillum interfaces non attingit. Microsoft vocans functiones indigenas directe non commendat nec documentum plurima ex his facit. Obiter functiones undocumented inveniri possunt hic.

Praecipua utilitas applicationum indigenarum est quod ntdll in systemate multo maturius quam nucleus oneratur. Hoc logicum est, quia nuclei opus ntdll requirit. Quam ob rem, applicationes quae functionibus indigenis utuntur, multo ante laborare possunt.

Ita in Fenestra Accuratissima Totius Applications programmata sunt quae in Fenestra tabernus mane incipere possunt. Muneribus uti non solum ex ntdll. Exemplum talis applicationis: autochk qui facit chkdisk utilitatem ad reprimendam orbis pro erroribus antequam principalis officia. Hoc plane planum est quod activum Restituo esse volumus.

Quid opus?

  • DDK (Drive Development Kit), nunc etiam ut WDK 7 (Fenestra Driver Kit).
  • Apparatus virtualis (exempli gratia Windows 7 x64)
  • Non necesse est, sed fasciculi capitis qui ex eo fieri possunt ut adiuvet hic

Quid in codice?

Exercemus paulum et, exempli gratia, parvam illam applicationem scribe;

  1. Propono nuntium in screen
  2. Aliquid allicit memoria
  3. Expectat tincidunt initus
  4. Liberat usus est memoria

In applicationibus indigenis, punctus viscus non est principale vel win main, sed munus NtProcessStartup, quandoquidem novos processus in systemate actu directe deprimimus.

Sit scriptor satus nuntius in screen propono. Hoc enim munus patrium habemus NtDisplayString, quod tanquam argumentum demonstratorem rei structurae UNICODE_STRING accipit. RtlInitUnicodeString adiuvabit nos initialize eam. Quam ob rem, textum in screen proponere possumus hoc munus parvum scribere:

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

Cum solae functiones ab ntdll nobis praesto sint, et nullae sint aliae bibliothecae in memoria adhuc, certo habebimus problemata quomodo ad memoriam collocandam. Novus auctor nondum exsistit (quia ex altiori gradu mundi C++ venit), et nullum est munus malloc (requirit runtime C bibliothecae). Nempe acervo tantum uti potes. Sed si opus est ad memoriam alacriter collocandam, habebimus illud in cumulo (i.e. cumulo). Tumulum itaque nobis faciamus et memoriam de illo sumamus quoties opus est.

Munus ad hoc negotium idoneum est RtlCreateHeap. Deinde, utendo RtlAllocateHeap et RtlFreeHeap, occupabimus et liberam memoriam cum ea egemus.

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);

Transeamus ad exspectationem tincidunt initus.

// 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;
	}
}

Omnes opus est ut NtReadFile in aperto artificio, et exspecta donec tincidunt quodlibet prelum ad nos reddat. Si clavis ESC premitur, operantes perseverabimus. Ad fabricam aperiendam, opus munus habemus vocare NtCreateFile (deviceKeyboardClass0 aperire). Nos quoque vocamus NtCreateEventinitialize insidiatur rei. declarabimus ipsi structuram KEYBOARD_INPUT_DATA, quae notitias tincidunt significat. Hoc opus nostrum facilius faciet.

Patria applicatione finit cum functione vocationis NtTerminateProcessquia nos proprium processum simpliciter occidimus.

Totum codicem pro nostra parva applicatione:

#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: Facile uti possumus munus DbgBreakPoint() in nostro codice obsistere in debugger. Verum, opus erit WinDbg ad virtualem machinam coniungere pro nucleo debugging. Instructiones de modo hoc facere possunt inveniri hic aut sicut usus VirtualKD.

Compilatio et ecclesia

Facillima via est ad usum aedificandi indigena applicatione DDK (Coegi Development Kit). Septima versione antiqua opus est, quoniam recentiores versiones paulum diversam habent accessionem et arctius cum Studio Visuali operam dabunt. Si DDK utimur, inceptum nostrum solummodo facfile et fontibus indiget.

Makefile

!INCLUDE $(NTMAKEENV)makefile.def

fontes:

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

Tuum Makefile prorsus idem erit, sed fontes paulo subtilius inspiciamus. Haec fasciculus designat fontes programmatis (.c lima), optiones aedificandi, et alia parametri.

  • TARGETNAME - nomen fasciculi exsecutabilis qui in fine producendus est.
  • TARGETTYPE – genus documenti exsecutabile, exactor esse potest (.sys), tunc valor agri AGITATOR esse debet, si bibliotheca (.lib), tunc valor bibliothecae est. In casu nostro, tabella exsecutabile opus est (.exe), ut valorem programma constituamus.
  • UMTYPE - valores possibiles pro hoc campo: consolatorium pro applicatione solare, fenestras pro modo operandi in fenestra fenestra. Sed opus est nominare nt ad applicationem vernaculam.
  • BUFFER_OVERFLOW_CHECKS – acervum ad quiddam superfluum reprimendo, casu nostro non dolendum, avertimus.
  • MINWIN_SDK_LIB_PATH - Hoc valore refert ad SDK_LIB_PATH variabilis, noli solliciti esse quod talem systema variabilem declarari non habeas, cum de DDK aedificandi sedatus currimus, hic variabilis declarabitur et necessariis bibliothecis monstrabit.
  • FONTES – index fontium pro progressione tua.
  • INCLUDES - fasciculi tituli qui ad ecclesiam requiruntur. Hic iter plerumque indicant tabellarum quae cum DDK veniunt, sed alia quoque quaevis specificare potes.
  • TARGETLIBS - index bibliothecarum quae coniungi necesse est.
  • USE_NTDLL campus requiritur, qui 1 apertis de causis debet apponi.
  • USER_C_FLAGS – quaelibet vexilla quibus in praevisis praescriptionibus uti potes, cum applicationem codicis parat.

Itaque aedificare, opus est ad x86 (vel x64) aedificandum Tesselatum, operantem directorium ad incepti folder et currendi mandatum aedifica. Eventus in screenshots ostendit nos unum documentum exsecutabile habere.

Windows Accuratissima Applications et Acronis Active redde ministerium

Fasciculus hic tam facile emitti non potest, ratio exsecrationum nos mittit ut de eius agendi ratione cogitemus cum sequenti errore:

Windows Accuratissima Applications et Acronis Active redde ministerium

Quomodo applicationem indigenam immittendi?

Cum autochk incipit, series programmatum startup determinatur ad valorem registri clavis:

HKLMSystemCurrentControlSetControlSession ManagerBootExecute

Procurator sessionis programmata ex hoc indice singillatim exsequitur. Procurator sessionis documenta exsecutabilia se in directorio systematis 32 quaerit. Subcriptio pretii forma clavis talis est:

autocheck autochk *MyNative

Valor debet esse in forma hexadecimali, non solita ASCII, ergo clavis supra demonstrata in forma erit;

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

Ad titulum convertendum, opera online uti potes, e.g. haec.

Windows Accuratissima Applications et Acronis Active redde ministerium
Evenit ut ad applicationem indigenam immittendi, nobis opus est;

  1. Effingo exsecutabile ad system32 folder
  2. Clavem ad registro addere
  3. Reboot machina

Commodum hic scriptum est promptum factum ad applicationem indigenam inaugurari;

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

Post institutionem ac reboot, etiam ante screen delectu utentis apparet, sequentem imaginem tenebimus:

Windows Accuratissima Applications et Acronis Active redde ministerium

exitum

Exemplis adhibitis tam parvae applicationis, persuasum nobis est satis fieri posse ut applicationis in gradu Fenestra Nativi curramus. Deinde, guys ex Universitate Innopolis, et ministerium aedificare pergo, quod processus commercii cum auriga multo maturius quam in priori versione nostri propositi incipiet. Et veniente testam win32 , logicum est transferre imperium ad ministerium plenum discursus iam elaboratum (de hac re plura. hic).

In proximo articulo aliam partem muneris activae restituendi, scilicet UEFI agitatoris, attingemus. Adice nostro blog ut proximum postem non falles.

Source: www.habr.com