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