Содержание статьи

Диспетчер задач Windows 10 отображает все активные процессы, включая системные и пользовательские. Однако существуют методы, позволяющие скрыть процесс от стандартного мониторинга. Эти техники используются как для легитимных целей (например, защита ПО от несанкционированного завершения), так и в вредоносных сценариях. Основные подходы включают модификацию реестра, внедрение в системные процессы и использование драйверов режима ядра.
Один из распространённых способов – скрытие через реестр. В ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options можно создать ключ с именем исполняемого файла процесса и добавить параметр Debugger, указывающий на другой исполняемый файл. Это заставит систему запускать процесс через посредник, маскируя его в диспетчере задач. Однако этот метод не работает для уже запущенных процессов и требует прав администратора.
Для более глубокого скрытия применяется внедрение в доверенные процессы. Например, вредоносное ПО может внедряться в svchost.exe или explorer.exe с помощью техник DLL Injection или Process Hollowing. В этом случае процесс отображается в диспетчере задач, но его реальная активность маскируется под легитимную. Обнаружить такие внедрения можно с помощью инструментов вроде Process Explorer от Sysinternals, который показывает загруженные DLL и потоки.
Наиболее надёжный, но сложный метод – использование драйверов режима ядра. Драйверы с подписью Microsoft или обходом проверки подписи (Driver Signature Enforcement) могут модифицировать системные структуры данных, такие как EPROCESS, удаляя процесс из списка активных. Это требует глубоких знаний архитектуры Windows и может привести к нестабильности системы. Инструменты вроде WinObj или Kernel Detective помогают анализировать такие изменения.
Для противодействия скрытым процессам рекомендуется использовать специализированные утилиты: Volatility для анализа дампов памяти, GMER для поиска руткитов или Autoruns для проверки автозагрузки. Регулярный мониторинг системных вызовов с помощью API Monitor также позволяет выявлять подозрительную активность.
Как изменить имя процесса через модификацию исполняемого файла

Имя процесса в диспетчере задач Windows определяется полем IMAGE_FILE_HEADER.Characteristics и секцией ресурсов исполняемого файла. Для модификации потребуется редактор PE-заголовков, например CFF Explorer или HxD. Откройте файл в CFF Explorer, перейдите в раздел Section Headers и найдите секцию .rsrc, где хранятся ресурсы, включая оригинальное имя. Измените строку в таблице ресурсов, но учитывайте ограничения: длина нового имени не должна превышать оригинальную, иначе файл может стать неработоспособным.
Альтернативный метод – правка таблицы экспорта (Export Table) в PE-заголовке. В CFF Explorer откройте Export Directory и замените имя модуля в поле Name RVA. Для этого потребуется пересчитать контрольные суммы и смещения, иначе загрузчик Windows откажется запускать файл. Используйте утилиту PE-bear для проверки целостности структуры после изменений. Пример команды для пересчета контрольной суммы:
| Утилита | Команда | Назначение |
|---|---|---|
editbin (Microsoft) |
editbin /RELEASE /SUBSYSTEM:WINDOWS file.exe |
Обновление контрольной суммы и подсистемы |
peupdate (сторонняя) |
peupdate -c file.exe |
Пересчет контрольной суммы без изменения других полей |
Для глубокой модификации используйте шестнадцатеричный редактор, например 010 Editor с шаблоном PE-структур. Найдите смещение строки с именем процесса в секции .rdata или .data и замените её на новую, выровняв по границе 4 байт. Обязательно проверьте выравнивание секций (FileAlignment и SectionAlignment в заголовке IMAGE_OPTIONAL_HEADER), иначе файл не загрузится. Пример смещения для 32-битного файла: 0x00001000 + VirtualAddress секции .rdata.
После модификации протестируйте файл в изолированной среде (например, виртуальной машине) с включенным мониторингом через Process Monitor. Проверьте, отображается ли новое имя в диспетчере задач и не вызывает ли файл ошибок при запуске. Если процесс завершается с кодом 0xC000007B, это указывает на нарушение структуры PE-заголовка – восстановите оригинальные смещения или пересоберите файл с помощью ILSpy (для .NET) или Ghidra (для нативного кода).
Использование DLL-инъекции для маскировки запущенного приложения

DLL-инъекция – метод внедрения стороннего кода в адресное пространство целевого процесса через загрузку динамической библиотеки. В контексте скрытия процесса ключевая задача – модификация структур данных, которые отображаются в диспетчере задач, таких как PEB (Process Environment Block) или списки модулей. Для этого используются функции Windows API: LoadLibrary, CreateRemoteThread и VirtualAllocEx. Пример базового алгоритма:
- Открытие целевого процесса с правами
PROCESS_ALL_ACCESSчерезOpenProcess. - Выделение памяти в адресном пространстве процесса под путь к DLL (
VirtualAllocEx). - Запись пути к DLL в выделенную память (
WriteProcessMemory). - Создание удаленного потока для вызова
LoadLibrary(CreateRemoteThread).
Для маскировки процесса DLL должна перехватывать вызовы функций, отвечающих за отображение в диспетчере задач. Основные цели – NtQuerySystemInformation (класс SystemProcessInformation) и EnumProcesses. Перехват осуществляется через подмену адресов в таблице импорта (IAT Hooking) или прямое изменение кода функции в памяти (Inline Hooking). Пример структуры перехваченной функции:
- Сохранение оригинального адреса функции.
- Замена первых байтов функции на команду перехода (
JMP) к пользовательскому обработчику. - В обработчике фильтрация результатов: удаление записей о скрываемом процессе из возвращаемых данных.
- Вызов оригинальной функции для получения нефильтрованных данных.
- Возврат модифицированного результата вызывающему коду.
Эффективность метода зависит от уровня привилегий инжектора и целевого процесса. Для обхода UAC и получения прав администратора используются уязвимости в системных компонентах, например, Token Impersonation через SeDebugPrivilege. Инжекция в процессы с высокими привилегиями (например, lsass.exe) требует обхода механизмов защиты, таких как PatchGuard (для x64) или Driver Signature Enforcement. Альтернативный подход – инжекция в доверенные процессы (svchost.exe, explorer.exe), которые реже вызывают подозрения у антивирусных систем.
Скрытие DLL от обнаружения требует дополнительных мер. Стандартные инструменты вроде Process Explorer или ListDLLs отображают загруженные библиотеки через NtQueryVirtualMemory и EnumProcessModules. Для противодействия применяются техники DLL Hollowing (замена содержимого легитимной DLL на вредоносный код) или Reflective DLL Injection (загрузка DLL без вызова LoadLibrary). Пример реализации последнего:
- DLL компилируется с экспортируемой функцией
ReflectiveLoader, которая самостоятельно разрешает зависимости и настраивает адресное пространство. - Инжектор записывает DLL в память целевого процесса и вызывает
ReflectiveLoaderчерезCreateRemoteThread. - Библиотека работает без записи на диск и регистрации в списке модулей.
Обнаружение DLL-инъекции антивирусными системами основано на анализе поведения: неожиданные вызовы CreateRemoteThread, модификация памяти защищенных процессов, подозрительные перехваты функций. Для снижения детектирования используются обфускация кода, динамическое разрешение адресов API-функций (GetProcAddress в рантайме) и эмуляция легитимного поведения. Пример: перед инжекцией DLL проверяет наличие отладчика через IsDebuggerPresent или NtQueryInformationProcess, а также маскирует свой код под легитимные операции (например, подменяет имя модуля на version.dll).
Сокрытие процесса через драйвер режима ядра с подписью или без

Драйверы режима ядра (kernel-mode drivers) предоставляют прямой доступ к структурам памяти Windows, включая списки процессов, обрабатываемые диспетчером задач. Для сокрытия процесса модифицируются структуры данных ядра, такие как EPROCESS и связанные с ними списки ActiveProcessLinks. При этом драйвер может работать как с цифровой подписью Microsoft (WHQL), так и без неё, но в последнем случае потребуется обход механизмов защиты (например, PatchGuard или Driver Signature Enforcement).
Подписанные драйверы используют легитимные сертификаты, например, от уязвимых или скомпрометированных вендоров (как в случае с Capcom.sys или RTCore64.sys). Такие драйверы загружаются через стандартные механизмы Windows, после чего выполняют инъекцию в целевой процесс или манипулируют списками PsActiveProcessHead. Для обхода проверок подписи применяются техники типа CI!g_CiOptions или эксплойты уязвимостей в ядре (например, CVE-2021-21551 для Dell DBUtil).
Неподписанные драйверы требуют временного отключения проверки подписей через bcdedit /set testsigning on или загрузку в тестовом режиме. Альтернативный метод – использование уязвимостей в загрузчике (Bootkit) для подмены системных компонентов до инициализации защиты. Пример: модификация ntoskrnl.exe в памяти для подмены функций NtQuerySystemInformation, возвращающих список процессов. Однако такие методы детектируются современными EDR-системами по аномалиям в поведении ядра.
Для скрытия процесса через драйвер необходимо перехватить вызовы к ZwQuerySystemInformation с параметром SystemProcessInformation (0x5). Драйвер может фильтровать результаты, удаляя записи о целевом процессе из возвращаемого списка. При этом важно корректно обрабатывать указатели на структуры SYSTEM_PROCESS_INFORMATION, чтобы избежать краха системы. Для повышения скрытности рекомендуется использовать косвенные методы, например, модификацию таблицы дескрипторов прерываний (IDT) или подмену обработчиков системных вызовов через SSDT.
При реализации драйвера без подписи критически важно минимизировать следы в памяти. Используйте техники обфускации кода (например, шифрование секций драйвера) и динамическую загрузку через MmMapIoSpace или ZwAllocateVirtualMemory. Для обхода PatchGuard применяйте методы типа DKOM (Direct Kernel Object Manipulation) с периодическим восстановлением изменённых структур. Учитывайте, что современные версии Windows (1903+) усиливают защиту ядра, поэтому актуальность методов без подписи снижается – предпочтительнее использовать легитимные подписанные драйверы с известными уязвимостями.
Применение API-функций Windows для удаления процесса из списка диспетчера

Для скрытия процесса из диспетчера задач Windows 10 используются низкоуровневые механизмы работы с системными структурами. Основной метод – модификация списка активных процессов через недокументированные функции Native API, такие как NtQuerySystemInformation с параметром SystemProcessInformation. Эта функция возвращает массив структур SYSTEM_PROCESS_INFORMATION, содержащий данные обо всех процессах, включая PID, имя и дескрипторы. Удаление записи о процессе из этого массива перед его передачей диспетчеру задач позволяет исключить его из отображения.
Для реализации потребуется перехват вызова NtQuerySystemInformation через хуки или инжекцию DLL. Примерный алгоритм: перехватываем вызов, анализируем буфер с данными о процессах, находим целевой PID и обнуляем соответствующую структуру или смещаем указатели, чтобы исключить её из результата. Важно учитывать, что диспетчер задач может использовать и другие источники данных, например WTSEnumerateProcesses или EnumProcesses, поэтому требуется комплексный подход.
Другой способ – использование функции RtlQueryProcessDebugInformation из ntdll.dll, которая предоставляет расширенные данные о процессах, включая потоки и модули. Перехват этой функции позволяет фильтровать информацию до её попадания в пользовательский интерфейс. Однако метод уязвим для обновлений системы, так как Microsoft может изменять внутренние структуры без уведомления. Для стабильной работы рекомендуется динамическое определение смещений в структурах через сигнатуры или анализ памяти.
При работе с системными структурами критически важно корректно обрабатывать блокировки и синхронизацию. Ошибки при модификации буфера SYSTEM_PROCESS_INFORMATION могут привести к краху диспетчера задач или системы. Для минимизации рисков используйте VirtualProtect для изменения прав доступа к памяти и восстанавливайте их после модификации. Также избегайте прямого удаления записей – лучше заменять их на данные другого процесса или обнулять поля, чтобы не нарушать целостность массива.
Для проверки эффективности метода используйте инструменты вроде Process Hacker или WinDbg, которые позволяют анализировать вызовы NtQuerySystemInformation в реальном времени. Если процесс остаётся видимым, проверьте, не использует ли диспетчер задач альтернативные источники данных, например WMI (класс Win32_Process). В таких случаях потребуется перехват запросов к WMI через COM-интерфейсы или модификация результатов выполнения скриптов PowerShell.
Несмотря на эффективность, методы на основе API-перехвата детектируются антивирусными системами как потенциально вредоносные. Для обхода эвристического анализа используйте обфускацию кода, динамическую загрузку библиотек и минимальное количество вызовов подозрительных функций. Альтернативный подход – создание драйвера режима ядра, который модифицирует системные структуры напрямую через PsSetCreateProcessNotifyRoutine или ObRegisterCallbacks, но это требует подписи драйвера и повышенных привилегий.
Запуск процесса в изолированном сеансе с ограниченной видимостью

Windows 10 поддерживает запуск процессов в отдельных сеансах через механизм *Session Isolation*, реализованный на уровне ядра. Для этого используется утилита *psexec* из пакета Sysinternals с ключом `-i` и указанием идентификатора сеанса (например, `psexec -i 2 notepad.exe`). Сеанс с ID 0 зарезервирован для системных служб, а ID 1 и выше – для пользовательских сессий. Процессы, запущенные в сеансе, отличном от текущего, не отображаются в стандартном диспетчере задач, но видны в *Process Explorer* при включенной опции *Show Processes from All Users*. Чтобы скрыть процесс полностью, требуется комбинация с другими методами, такими как внедрение в доверенные процессы или использование драйверов режима ядра.
Альтернативный способ – создание изолированного сеанса через *Windows Terminal Services API* с помощью функции `WTSStartRemoteControlSession`. Для этого потребуется написать небольшую программу на C++ с вызовом `WTSQuerySessionInformation` и `WTSStartRemoteControlSession`, передав в качестве параметра структуру `WTS_SESSION_INFO`. Процессы, запущенные в таком сеансе, будут иметь ограниченный доступ к GUI и не появятся в списке задач текущего пользователя. Однако метод требует прав администратора и может быть заблокирован политиками безопасности, если включен *User Account Control (UAC)* или *Windows Defender Application Control (WDAC)*.
Для автоматизации процесса можно использовать PowerShell-скрипт с вызовом `Start-Process` и параметром `-SessionId`. Пример: `Start-Process -FilePath «cmd.exe» -SessionId 3 -NoNewWindow`. Важно учитывать, что сеансы с ID выше 10 обычно динамически создаются для RDP-подключений, и их перечисление возможно через `qwinsta` или `query session` в командной строке. Чтобы избежать обнаружения, рекомендуется запускать процесс в сеансе с минимальными привилегиями, например, в контексте учетной записи *LocalService* или *NetworkService*, используя `runas` с параметром `/user:NT AUTHORITY\LocalService`.
