пятница, 21 февраля 2025 г.

Как потратить пару часов в попытке поймать запуск процессов внутри WSL

 Как поймать запуск процессов внутри WSL?

Казалось бы, ставь callback через PsSetCreateProcessNotifyRoutineEx2, в callback'е проверяй PPS_CREATE_NOTIFY_INFO.IsSubsystemProcess == 1 + ZwQueryInformationProcess(ProcessSubsystemInformation) + subSystemType == SubsystemInformationTypeWSL, в чем проблема?

Проблема 1: callback не вызывается
Проблема 2: HANDLE ProcessId приходящий в callback'е - это pid родительского процесса(svchost), но это решаемо, handle можно получить через ObOpenObjectByPointer по EPROCESS, который приходит в callback корректным.

Собственно, пару часов было потрачено на решение проблемы 1.
А дело было в том, что я не удосужился посмотреть версию WSL

У меня была установлена версия 2.

Версия 2 у WSL это легковесный hypervisor, а версия WSL 1 это эмуляция, и именно там возможно перехватывать создание процессов внутри линукс(bash / top / ls etc.). Ну и потоков тоже.


Соответственно, после даунгрейда версии: wsl --set-version 1 все прекрасно начало ловиться.