Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore

An-diugh, cumaidh sinn oirnn leis an sgeulachd againn mu mar a tha sinn ag obair còmhla ri Oilthigh Innopolis gus teicneòlas Active Restore a leasachadh gus leigeil le luchd-cleachdaidh obair a thòiseachadh a-rithist air na h-innealan aca cho luath ‘s a ghabhas às dèidh tubaist. Bidh sinn a’ bruidhinn mu aplacaidean dùthchasach. Windows, a’ gabhail a-steach mion-fhiosrachadh mun chruthachadh agus an cur air bhog. Gu h-ìosal tha beagan eachdraidh air a’ phròiseact againn, a bharrachd air stiùireadh practaigeach air mar a sgrìobhas tu aplacaidean dùthchasach.

Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore

Ann an dreuchdan roimhe tha sinn air bruidhinn mu thràth mu dè a th’ ann Ath-bheothachadh gnìomhach, agus mar a leasaicheas oileanaich à Innopolis seirbheis. An-diugh tha mi airson fòcas a chuir air tagraidhean dùthchasach, chun na h-ìre gu bheil sinn airson ar seirbheis ath-bheothachaidh gnìomhach a “adhlacadh”. Ma dh’ obraicheas a h-uile càil a-mach, is urrainn dhuinn:

  • Cuir air bhog an t-seirbheis fhèin mòran nas trĂ ithe
  • Cuir fios chun sgòth far a bheil an cĂšl-taic fada nas trĂ ithe
  • Gu math nas trĂ ithe gus tuigsinn dè am modh anns a bheil an siostam - bròg Ă bhaisteach no ath-bheothachadh
  • Tòrr nas lugha de fhaidhlichean ri fhaighinn air ais ro-lĂ imh
  • Leig leis an neach-cleachdaidh tòiseachadh eadhon nas luaithe.

Dè a th’ ann an app dùthchasach co-dhiù?

Gus a 'cheist seo a fhreagairt, leig dhuinn sÚil a thoirt air an t-sreath de ghlaodhan a bhios an siostam a' dèanamh, mar eisimpleir, ma tha prògramadair san iarrtas aige a 'feuchainn ri faidhle a chruthachadh.

Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore
Pavel Iosifovich — Windows Prògramadh Eithne (2019)

Cleachdaidh am prògramadair an gnìomh Cruthaich Faidhle, a tha air ainmeachadh anns an fhaidhle header fileapi.h agus air a chuir an gnìomh ann an Kernel32.dll. Ach, chan eil an gnìomh seo fhèin a’ cruthachadh am faidhle, cha dèan e ach sgrùdadh air na h-argamaidean a-steach agus gairm an gnìomh NtCreateFile (tha an ro-leasachan Nt dìreach a’ sealltainn gu bheil an gnìomh dùthchasach). Tha an gnìomh seo air ainmeachadh ann am faidhle header winternl.h agus air a chuir an gnìomh ann an ntdll.dll. Bidh e ag ullachadh airson leum a-steach don àite niùclasach, às deidh sin bidh e a ’dèanamh gairm siostam gus faidhle a chruthachadh. Anns a ’chùis seo, tha e a’ tionndadh a-mach nach eil ann an Kernel32 ach pasgan airson Ntdll. Is e aon de na h-adhbharan airson seo a dhèanamh gu bheil comas aig Microsoft mar sin gnìomhan an t-saoghail dhùthchasach atharrachadh, ach gun a bhith a’ beantainn ris an eadar-aghaidh àbhaisteach. Chan eil Microsoft a’ moladh a bhith a’ gairm ghnìomhan dùthchasach gu dìreach agus chan eil e a’ clàradh a’ mhòr-chuid dhiubh. Air an t-slighe, gheibhear gnìomhan gun sgrìobhainn an seo.

Is e am prÏomh bhuannachd a tha aig tagraidhean dÚthchasach gu bheil ntdll air a luchdachadh a-steach don t-siostam fada nas tràithe na kernel32. Tha seo loidsigeach, oir feumaidh kernel32 ntdll a bhith ag obair. Mar thoradh air an sin, faodaidh tagraidhean a chleachdas gnÏomhan dÚthchasach tòiseachadh ag obair mòran nas tràithe.

Mar sin, Windows Is e prògraman a th’ ann an aplacaidean dùthchasach a dh’ fhaodas ruith tràth aig àm bròg. WindowsChan eil iad a’ cleachdadh ach gnìomhan bho ntdll. Eisimpleir de thagradh mar sin: fèineag a bhios a' coileanadh goireas chkdisk gus sùil a thoirt air an diosc airson mhearachdan mus tòisich thu air na prìomh sheirbheisean. Is e seo dìreach an ìre a tha sinn ag iarraidh gum bi ar Active Restore.

Dè a dh'fheumas sinn?

  • DDK (Pasgan Leasachaidh Draibhearan), ris an canar a-nis WDK 7 cuideachd (Windows Pasgan draibhearan).
  • Inneal brĂŹgheil (m.e. Windows 7 x64)
  • Chan eil feum air, ach dh’ fhaodadh gun cuidich faidhlichean cinn a ghabhas luchdachadh a-nuas an seo

Dè th' anns a' chòd?

Cleachdamaid beagan agus, mar eisimpleir, sgrĂŹobh sinn tagradh beag a tha:

  1. A’ taisbeanadh teachdaireachd air an sgrion
  2. A 'riarachadh beagan cuimhne
  3. A’ feitheamh ri cuir a-steach meur-chlàr
  4. A 'saoradh cuimhne cleachdte

Ann an tagraidhean dùthchasach, chan e prìomh àite no winmain a th’ anns an àite inntrigidh, ach gnìomh NtProcessStartup, leis gu bheil sinn dha-rìribh a’ cur pròiseasan ùra air bhog san t-siostam.

Feuch an tòisich sinn le bhith a’ taisbeanadh teachdaireachd air an sgrion. Airson seo tha gnìomh dùthchasach againn NtDisplayString, a bheir mar argamaid puing gu nì structarail UNICODE_STRING. Cuidichidh RtlInitUnicodeString sinn gus a thòiseachadh. Mar thoradh air an sin, gus teacsa a thaisbeanadh air an sgrion is urrainn dhuinn an gnìomh beag seo a sgrìobhadh:

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

Leis nach eil ach gnìomhan bho ntdll rim faighinn dhuinn, agus dìreach nach eil leabharlannan eile ann mar chuimhneachan fhathast, gu cinnteach bidh duilgheadasan againn a thaobh mar a thèid cuimhne a riarachadh. Chan eil an gnìomhaiche ùr ann fhathast (seach gu bheil e a’ tighinn bhon t-saoghal ro àrd-ìre C ++), agus chan eil gnìomh malloc ann (feumaidh e leabharlannan runtime C). Gu dearbh, chan urrainn dhut ach stac a chleachdadh. Ach ma dh’ fheumas sinn cuimhne a riarachadh gu dinamach, feumaidh sinn a dhèanamh air a’ chàrn (i.e. tiùrr). Mar sin cruthaichidh sinn carn dhuinn fhìn agus bheir sinn cuimhne bhuaithe uair sam bith a bhios feum againn air.

Tha an gnìomh freagarrach airson na h-obrach seo RtlCreateHeap. An ath rud, a’ cleachdadh RtlAllocateHeap agus RtlFreeHeap, bidh sinn a’ gabhail còmhnaidh agus a’ saoradh cuimhne nuair a bhios feum againn air.

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

Gluaisidh sinn air adhart gu bhith a’ feitheamh ri cuir a-steach meur-chlàr.

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

Chan eil againn ach a chleachdadh NtReadFile air inneal fosgailte, agus feitheamh gus an till am meur-chlàr air ais thugainn. Ma thèid an iuchair ESC a bhrùthadh, cumaidh sinn oirnn ag obair. Gus an inneal fhosgladh, feumaidh sinn an gnìomh NtCreateFile a ghairm (feumaidh sinn DeviceKeyboardClass0 fhosgladh). Canaidh sinn cuideachd Tachartas ntCreategus an nì feitheamh a thòiseachadh. Cuiridh sinn an cèill structar KEYBOARD_INPUT_DATA sinn fhìn, a tha a’ riochdachadh dàta a’ mheur-chlàir. Nì seo ar n-obair nas fhasa.

Bidh an tagradh dùthchasach a’ crìochnachadh le gairm gnìomh Pròiseas NtTerminateoir tha sinn dìreach a 'marbhadh ar pròiseas fhèin.

A h-uile còd airson an tagradh beag againn:

#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: Is urrainn dhuinn an gnÏomh DbgBreakPoint() sa chòd againn a chleachdadh gu furasta gus stad a chuir air san dÏ-bhugadair. FÏor, feumaidh tu WinDbg a cheangal ri inneal brÏgheil airson debugging kernel. Gheibhear stiÚireadh air mar a nÏ thu seo an seo no dÏreach cleachd VirtualKD.

Cruinneachadh agus co-chruinneachadh

Is e an dòigh as fhasa tagradh dÚthchasach a thogail a chleachdadh DDK (Kit Leasachaidh Dràibhearan). Feumaidh sinn an t-seachdamh dreach àrsaidh, oir tha dòigh-obrach beagan eadar-dhealaichte aig dreachan nas fhaide air adhart agus bidh iad ag obair gu dlÚth le Visual Studio. Ma chleachdas sinn an DDK, chan fheum ar pròiseact ach Makefile agus stòran.

Dèan cinnteach

!INCLUDE $(NTMAKEENV)makefile.def

stòran:

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

Bidh do Makefile dÏreach mar an ceudna, ach leig dhuinn sÚil a thoirt air stòran ann am beagan nas mionaidiche. Bidh am faidhle seo a 'sònrachadh stòran a' phrògraim agad (.c faidhlichean), roghainnean togail, agus crÏochan eile.

  • TARGETNAME - ainm an fhaidhle so-ghnĂŹomhaichte a bu chòir a thoirt a-mach aig a’ cheann thall.
  • TARGETTYPE - seòrsa faidhle so-ghnĂŹomhaichte, faodaidh e a bhith na dhrĂ ibhear (.sys), an uairsin bu chòir luach an raoin a bhith DRIVER, ma tha leabharlann (.lib) ann, is e LEABHARLANG an luach. Anns a’ chĂšis againn, feumaidh sinn faidhle so-ghnĂŹomhaichte (.exe), agus mar sin suidhich sinn an luach gu PROGRAM.
  • UMTYPE - luachan a dh’ fhaodadh a bhith san raon seo: tòcan airson tagradh tòcan, uinneagan airson a bhith ag obair ann am modh uinneig. Ach feumaidh sinn nt a shònrachadh gus tagradh dĂšthchasach fhaighinn.
  • BUFFER_OVERFLOW_CHECKS - a’ sgrĂšdadh a’ chruach airson tar-shruth bufair, gu mĂŹ-fhortanach chan e a’ chĂšis againn, bidh sinn ga tionndadh dheth.
  • MINWIN_SDK_LIB_PATH - tha an luach seo a’ toirt iomradh air an caochladair SDK_LIB_PATH, na gabh dragh nach eil an leithid de chaochladair siostam agad air ainmeachadh, nuair a ruitheas sinn togail le seic bhon DDK, thèid an caochladair seo ainmeachadh agus comharraichidh e na leabharlannan riatanach.
  • SOURCES - liosta de stòran airson do phrògram.
  • A 'GABHAIL A-STEACH - faidhlichean cinn a tha riatanach airson co-chruinneachadh. An seo mar as trice bidh iad a’ comharrachadh an t-slighe gu na faidhlichean a thig leis an DDK, ach faodaidh tu cuideachd gin eile a shònrachadh.
  • TARGETLIBS - liosta de leabharlannan a dh’ fheumas a bhith ceangailte.
  • Tha USE_NTDLL na raon riatanach a dh'fheumas a bhith air a shuidheachadh gu 1 airson adhbharan follaiseach.
  • USER_C_FLAGS - brataichean sam bith as urrainn dhut a chleachdadh ann an stiĂširidhean ro-phròiseasar nuair a bhios tu ag ullachadh còd tagraidh.

Mar sin airson togail, feumaidh sinn x86 (no x64) Checked Build a ruith, atharraich an eòlaire obrach gu pasgan a’ phròiseict agus ruith an àithne Togail. Tha an toradh san dealbh-sgrìn a’ sealltainn gu bheil aon fhaidhle so-ghnìomhaichte againn.

Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore

Chan urrainnear am faidhle seo a chuir air bhog cho furasta, tha an siostam a’ mallachadh agus gar cur gu smaoineachadh air a ghiùlan leis a’ mhearachd a leanas:

Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore

Ciamar a chuireas tu tagradh dĂšthchasach air bhog?

Nuair a thòisicheas autochk, tha an t-sreath tòiseachaidh de phrògraman air a dhearbhadh le luach iuchair a’ chlàr:

HKLMSystemCurrentControlSetControlSession ManagerBootExecute

Bidh manaidsear an t-seisein a' cur an gnìomh prògraman bhon liosta seo aon ri aon. Bidh manaidsear an t-seisein a’ coimhead airson na faidhlichean so-ghnìomhaichte iad fhèin san eòlaire system32. Tha cruth prìomh luach a’ chlàraidh mar a leanas:

autocheck autochk *MyNative

Feumaidh an luach a bhith ann an cruth hexadecimal, chan e an ASCII àbhaisteach, agus mar sin bidh an iuchair gu h-àrd san fhòrmat:

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

Gus an tiotal a thionndadh, faodaidh tu seirbheis air-loidhne a chleachdadh, mar eisimpleir, seo.

Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore
Tha e coltach gum feum sinn:

  1. Dèan lethbhreac den fhaidhle so-ghnÏomhaichte gu pasgan system32
  2. Cuir iuchair ris a’ chlàr
  3. Ath-thòisich an inneal

Airson goireasachd, seo sgriobt deiseil airson a bhith a’ stàladh tagradh dùthchasach:

stĂ ladh.bat

@echo off
copy MyNative.exe %systemroot%system32.
regedit /s add.reg
echo Native Example Installed
pause

cuir.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

Às deidh an stàladh agus ath-thòiseachadh, eadhon mus nochd an scrion taghadh cleachdaiche, gheibh sinn an dealbh a leanas:

Windows Aplacaidean DĂšthchasach agus seirbheis Acronis Active Restore

An toradh

A’ cleachdadh an aplacaid bhig seo mar eisimpleir, bha sinn cinnteach gum biodh cur air bhog aplacaid aig an ìre Windows Tha dùthchasach gu tur comasach. An ath rud, cumaidh mise agus na balaich à Oilthigh Innopolis orra a’ togail seirbheis a thòisicheas eadar-obrachadh leis an draibhear mòran na bu tràithe na anns an dreach roimhe den phròiseact againn. Agus le teachd slige Win32, bidh e loidsigeach smachd a ghluasad gu seirbheis làn-leasaichte a chaidh a leasachadh mar-thà (barrachd air sin nas fhaide air adhart). an seo).

Anns an ath artaigil bruidhnidh sinn air pĂ irt eile den t-seirbheis Ath-nuadhachadh GnĂŹomhach, is e sin an draibhear UEFI. Subscribe to ar blog gus nach caill thu an ath phost.

Source: www.habr.com

Ceannaich aoigheachd earbsach airson làraich le dìon DDoS, frithealaichean VPS VDS 🔥 Ceannaich aoigheachd làrach-lìn earbsach le dìon DDoS, frithealaichean VPS VDS | ProHoster