Getting Process list

Получение списка запущенных процессов

Начнём с очень простой задачи — что если мы хотим получить список запущенных процессов на локальной машине?

В классическом C# это решается вызовом Process.GetProcesses()

Но так как мы работаем в рамках API EyeAuras, нам придётся использовать немного другой подход, который позволит нам очень легко переключаться между различными способами чтения памяти.

Самый простой способ — эквивалент работы через Process

csharp
using EyeAuras.Memory;

var processes = LocalProcess.GetProcesses();
Log.Info(processes.DumpToNamedTable("Processes"));

В результате выполнения этого скрипта вы должны увидеть нечто подобное в EventLog — список с очень базовой информацией о запущенных процессах, содержащей их ProcessId (или PID) и ProcessName. Event Log

Использование LeechCore PMEM-драйвера

Теперь мы используем другой подход — вместо LocalProcess как точки входа, мы вызовем LCProcess (LeechCore). LeechCore — это отличная библиотека, разработанная Ulf Frisk.

Внутри у неё реализованы различные методы чтения памяти целевой (не только локальной) системы, включая, конечно, информацию о процессах.

Для конечного пользователя переключение между методами чтения памяти сводится к замене одного класса, добавлению пространства имён и указанию аргументов запуска.

В этом примере мы передадим библиотеке командную строку -device pmem, что заставит её загрузить и использовать драйвер WinPMEM.

csharp
using EyeAuras.Memory;
using EyeAuras.Memory.MPFS; // обратите внимание на новое пространство имён — LCProcess находится здесь

var processes = LCProcess.GetProcesses("-device", "pmem");
Log.Info(processes.DumpToNamedTable("Processes"));

Результат можно опустить — он должен быть точно таким же, как и ранее.

Использование LeechCore Hyper-V

Сделаем кое-что интересное — попробуем получить список процессов, запущенных ВНУТРИ виртуальной машины Hyper-V (гостевой системы) из хостовой.

Для простоты я выберу ID первой попавшейся виртуалки (id=0), в вашем случае может понадобиться другой ID.

csharp
using EyeAuras.Memory;
using EyeAuras.Memory.MPFS;

var processes = LCProcess.GetProcesses("-device", "hvmm://id=0");
Log.Info(processes.DumpToNamedTable("Processes"));

VM Processes

Настройка Hyper-V машины

Здесь приведу только самый важный момент — не забудьте отключить Dynamic Memory в настройках виртуальной машины. Dynamic memory

Получение списка виртуальных машин Hyper-V

На данный момент это требует запуска MemProcFS (основанного на LeechCore) отдельно.

MemProcFS.exe -device hvmm://listvm

Вот как может выглядеть вывод в случае простой конфигурации с одной виртуальной машиной:

bash
   Microsoft Hyper-V Virtual Machine plugin 1.2.20240329(beta) for MemProcFS (by Ulf Frisk).

   plugin parameters:
      hvmm://id=<vm id number>
      hvmm://id=<vm id number>,unix
      hvmm://listvm
      hvmm://enumguestosbuild
      hvmm://loglevel=<log level number>
   Example: MemProcFS.exe -device hvmm://listvm

   Virtual Machines:
    --> [id = 0] ShadowForge (PartitionId = 0x2, Full VM)
   You selected the following virtual machine: ShadowForge