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.

Ann an dreuchdan roimhe tha sinn air bruidhinn mu thrĂ th mu dè a thâ ann , agus mar a leasaicheas oileanaich Ă Innopolis . 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.

Pavel Iosifovich â Windows Prògramadh Eithne (2019)
Cleachdaidh am prògramadair an gnĂŹomh , 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 (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 .
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: a bhios a' coileanadh 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?
- (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
Dè th' anns a' chòd?
Cleachdamaid beagan agus, mar eisimpleir, sgrĂŹobh sinn tagradh beag a tha:
- Aâ taisbeanadh teachdaireachd air an sgrion
- A 'riarachadh beagan cuimhne
- Aâ feitheamh ri cuir a-steach meur-chlĂ r
- 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 , 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 . 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 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 gus 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 oir 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 no dÏreach cleachd .
Cruinneachadh agus co-chruinneachadh
Is e an dòigh as fhasa tagradh dÚthchasach a thogail a chleachdadh (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.defstò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 = 1Bidh 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.

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:

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 ManagerBootExecuteBidh 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 *MyNativeFeumaidh 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,00Gus an tiotal a thionndadh, faodaidh tu seirbheis air-loidhne a chleachdadh, mar eisimpleir, .

Tha e coltach gum feum sinn:
- Dèan lethbhreac den fhaidhle so-ghnÏomhaichte gu pasgan system32
- Cuir iuchair ris aâ chlĂ r
- 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
pausecuir.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:

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