L
LightMan
Original poster
Часть процессов операционной системы считаются «критичными» — если завершить один из них, Windows выпадет в синий экран смерти и перезагрузится. Этим активно пользуются вирусописатели: если сделать свой процесс критичным, то его нельзя будет завершить просто так.
Наш файлик CriticalProcess.cs
Главный файлик Program.cs
Не забудьте перед выходом из программы отключить критический процесс !!!
Если в программе возникнет ошибка, будет экран смерти!
При попытке выключить или перезагрузить компьютер тоже будет экран смерти (нужно поймать событие выключения и отключить критический процесс)
И не забывайте, что для работы этих функций требуется запуск с правами администратора.
Наш файлик CriticalProcess.cs
C#:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace NotAVirus
{
internal sealed class CriticalProcess
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool IsProcessCritical(
IntPtr hProcess,
ref bool Critical
);
[DllImport("ntdll.dll", SetLastError = true)]
private static extern int NtSetInformationProcess(
IntPtr hProcess,
int processInformationClass,
ref int processInformation,
int processInformationLength
);
/// <summary>
/// Check if process is critical
/// </summary>
/// <param name="process">Process object</param>
/// <returns>status</returns>
public static bool ProcessIsCritical(Process process)
{
bool critial = false;
try {
IsProcessCritical(process.Handle, ref critial);
} catch (Exception ex) {
Debug.WriteLine("[-] Failed to check if process is critical,\n " + ex.Message);
}
return critial;
}
/// <summary>
/// Toggle critical process
/// </summary>
/// <param name="process">Process object</param>
/// <param name="is_critical">true - enable critical, false - disable critical</param>
public static bool ProcessCriticalToggle(Process process, bool is_critical)
{
int status = 5;
int critical = is_critical ? 1 : 0;
try {
Process.EnterDebugMode();
status = NtSetInformationProcess(process.Handle, 29, ref critical, sizeof(int));
Process.LeaveDebugMode();
} catch (Exception ex) {
Debug.WriteLine("[-] Failed toggle critical process,\n " + ex.Message);
}
return status.Equals(0);
}
}
}
Главный файлик Program.cs
C#:
using System;
using System.Diagnostics;
namespace NotAVirus
{
class Program
{
static void Main()
{
// Получить текущий процесс
var process = Process.GetCurrentProcess();
// Включить критический процесс
CriticalProcess.ProcessCriticalToggle(process, is_critical: true)
// Сделать что-нибудь...
// Отключить критический процесс
CriticalProcess.ProcessCriticalToggle(process, is_critical: false)
}
}
}
Не забудьте перед выходом из программы отключить критический процесс !!!
Если в программе возникнет ошибка, будет экран смерти!
При попытке выключить или перезагрузить компьютер тоже будет экран смерти (нужно поймать событие выключения и отключить критический процесс)
И не забывайте, что для работы этих функций требуется запуск с правами администратора.