Nastavenie práv súboru na kritické
Rozhodol som sa, že popíšem jednu libústku a praktiku, ako už názov hovorí, ktorá bude stáť zato
Ide o nastavenie práv pre proces, v ktorom kód beží, v réžii Critical. Proces sa nám jednoducho nastaví na právo Kritický. Pri ukončení alebo vypnutí dôjde ku kolabsu systému (k tvrdému ukončeniu - BSOD), kedy sa zmažú neuložené dáta a podobne.
Funkcia bude popísaná a pridaná do headeru WinAPI.h : WinAPI.h
Aby sme si toto Kung-Fu popísali, začnem s kódmi.
Celá funkcionalita sa skrýva v knižnici ntdll.lib (je súčasťou headeru WinAPI.zip: WinAPI.zip).
Zavedenie obsahu knižnice do resource nášho projektu:
#pragma comment(lib,"ntdll.lib")
Preddefinovanie funkcií s ktorými budeme pracovať:
extern "C"
{
NTSTATUS _stdcall RtlAdjustPrivilege(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
NTSTATUS _stdcall NtSetInformationProcess(HANDLE,ULONG,PVOID,ULONG);
}
Deklarácia enum štruktúry:
enum CriticalPrivilege:ULONG
{
EnableCriticalPrivilege = 1, // Definuje nastavenie kritickeho procesu.
DisableCriticalPrivilege = 0 // Nedefinuje nastavenie kritickeho procesu.
};
Nastavenie práv SeDebugPrivilege pre proces.
Na pridelenie práv slúži táto funkcia:
BOOLEAN SetAdjustPrivilege(void)
{
BOOLEAN status;
::RtlAdjustPrivilege(20,TRUE,FALSE,&status);
return status;
}
Nastavenie/odobratie práv Critical pre process:
NTSTATUS SetCriticalProcess(CriticalPrivilege isset)
{
::NTSTATUS status;
if(isset == CriticalPrivilege::EnableCriticalPrivilege)
{
status = NtSetInformationProcess((HANDLE)-1,0x1d,&isset,sizeof(ULONG));
} else if(isset == CriticalPrivilege::DisableCriticalPrivilege)
{
status = NtSetInformationProcess((HANDLE)-1,0x1d,&isset,sizeof(ULONG));
}
return status;
}
-----------------------------------------------------------------
Celá funkcia je zakonpovaná do headeru WinAPI.h ►WinAPI.h◄
Komplexný kód súboru main.cpp
#include <stdio.h>
#include "convert.h"//https://www.netbot.sk/sk/14-blog-headers/84-convert-h
#include "winapi.h" //hhttps://www.netbot.sk/sk/14-blog-headers/31-winapi
int _cdecl main (void)
{
::Diall_WinApi::WinApi::GetInstance()->SystemIntegrity(::Diall_WinApi::Privilege::ENABLE);
::Diall_WinApi::WinApi::GetInstance()->WindowOfConsoleApplication(
::Diall_WinApi::SelfWindow::SHOW);
::Diall_WinApi::WinApi::GetInstance()->SetAdjustPrivilege();
while(1)
{
::Diall_WinApi::WinApi::GetInstance()->SetCriticalProcess(
::Diall_WinApi::CriticalPrivilege::EnableCriticalPrivilege);
}
return 0 ;
}