Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 21.03.18 13:28
Оценка:
Есть способ контролировать запуск программ в винде из юзермода?
То есть моя программа должна разрешать или запрещать запуск некоторых программ в зависимости от условий.
Меня не интересуют все процессы в системе, только определенный набор приложений.

Платформа Windows 10
Re: Контроль запуска приложений
От: Maniacal Россия  
Дата: 21.03.18 13:33
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Есть способ контролировать запуск программ в винде из юзермода?

ES>То есть моя программа должна разрешать или запрещать запуск некоторых программ в зависимости от условий.
ES>Меня не интересуют все процессы в системе, только определенный набор приложений.

ES>Платформа Windows 10


Я думаю, поможет всё тот же DLL-Injection через Hook с заменой адресов функций LoadLibrary/CreateProcess в таблице экспорта на свои.
Re[2]: Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 21.03.18 13:41
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Я думаю, поможет всё тот же DLL-Injection через Hook с заменой адресов функций LoadLibrary/CreateProcess в таблице экспорта на свои.


А хук на что?

А в 10-ке не появилось никакого API для такого функционала?
Re: Контроль запуска приложений
От: EreTIk EreTIk's Box
Дата: 21.03.18 14:08
Оценка: 8 (2)
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Есть способ контролировать запуск программ в винде из юзермода?

ES>То есть моя программа должна разрешать или запрещать запуск некоторых программ в зависимости от условий.
ES>Меня не интересуют все процессы в системе, только определенный набор приложений.

ES>Платформа Windows 10


Re[5]: Блокировка запуска приложений
Автор: Andrew.W Worobow
Дата: 18.01.07
Re[3]: Контроль запуска приложений
От: Maniacal Россия  
Дата: 21.03.18 14:10
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>А хук на что?


Не важно. Любой хук заставляет все процессы срочно загрузить вашу библиотеку.
Вот тут есть подробное описание, но это совсем хакерское универсальное решение по перехвату любых функций WinAPI

ES>А в 10-ке не появилось никакого API для такого функционала?


Предлагают ещё два варианта: использовать PsSetCreateProcessNotifyRoutine или написать фильтр файловой системы.
Re[2]: Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 21.03.18 14:20
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>Re[5]: Блокировка запуска приложений
Автор: Andrew.W Worobow
Дата: 18.01.07


Класс! То что надо.
Re[2]: Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 22.03.18 13:23
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>Re[5]: Блокировка запуска приложений
Автор: Andrew.W Worobow
Дата: 18.01.07


А есть официальная документация? Или это недокументированные возможности?

Или просто руками объявить все эти APPCERT_IMAGE_OK_TO_RUN ... ?
Re[3]: Контроль запуска приложений
От: EreTIk EreTIk's Box
Дата: 22.03.18 14:09
Оценка:
ETI>>Re[5]: Блокировка запуска приложений
Автор: Andrew.W Worobow
Дата: 18.01.07


ES>А есть официальная документация? Или это недокументированные возможности?

Это недокументированная возможность.
Из документированных есть AppInit_DLLs: DLL будет внедряться во все процессы. В DllMain'е, соответственно, можно завершить текущий процесс, если он не должен исполняться. Но есть нюансы:
Re[4]: Контроль запуска приложений
От: Maniacal Россия  
Дата: 22.03.18 14:15
Оценка:
Здравствуйте, EreTIk, Вы писали:

ETI>>>Re[5]: Блокировка запуска приложений
Автор: Andrew.W Worobow
Дата: 18.01.07


ES>>А есть официальная документация? Или это недокументированные возможности?

ETI>Это недокументированная возможность.
ETI>Из документированных есть AppInit_DLLs: DLL будет внедряться во все процессы. В DllMain'е, соответственно, можно завершить текущий процесс, если он не должен исполняться. Но есть нюансы:

Загрузить свою DLL во все процессы можно и динамически, просто установив в системе любой Hook. Далее всё то же самое всё там же (в DllMain).
Re[5]: Контроль запуска приложений
От: ononim  
Дата: 22.03.18 19:26
Оценка:
M>Загрузить свою DLL во все процессы можно и динамически, просто установив в системе любой Hook. Далее всё то же самое всё там же (в DllMain).
Виндовые хуки загружаются только когда приходит какаято оконная мессага. Апликуха может много сделать и до этого, кроме того апликуха может быть вообще без окон, или консольная, например.
Как много веселых ребят, и все делают велосипед...
Re[6]: Контроль запуска приложений
От: Maniacal Россия  
Дата: 23.03.18 06:37
Оценка:
Здравствуйте, ononim, Вы писали:

M>>Загрузить свою DLL во все процессы можно и динамически, просто установив в системе любой Hook. Далее всё то же самое всё там же (в DllMain).

O>Виндовые хуки загружаются только когда приходит какаято оконная мессага. Апликуха может много сделать и до этого, кроме того апликуха может быть вообще без окон, или консольная, например.
User.dll
Тогда DLL-Injection
CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)&LoadLibraryA, "mylib.dll", 0, 0);
Re: Контроль запуска приложений
От: okman Беларусь https://searchinform.ru/
Дата: 23.03.18 08:35
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Есть способ контролировать запуск программ в винде из юзермода?

ES>То есть моя программа должна разрешать или запрещать запуск некоторых программ в зависимости от условий.
ES>Меня не интересуют все процессы в системе, только определенный набор приложений.

ES>Платформа Windows 10


Ничего лучше PsSetCreateProcessNotifyRoutine, PsSetCreateProcessNotifyRoutineEx и PsSetCreateProcessNotifyRoutineEx2
все равно нету. А юзермодные подходы плохи тем, что система просто не даст загружать свою dll в некоторые
процессы, равно как и запускать в них свои удаленные потоки или выделять память с правами на выполнение.
В Windows, особенно на Windows 8.1 и Windows 10, появилась масса встроенных защит: PPL-процессы, mitigation policies
(см., например, SetProcessMitigationPolicy и DynamicCodePolicy/ProcessSignaturePolicy), а еще всякие linux-процессы
(подсистема WSL), trustlet-процессы, metro-приложения и т.п.

Попробуй интереса ради вгрузиться в какой-нибудь metro-шный Скайп на Win10, например. Не важно как — через хук,
CreateRemoteThread, угон потоков (SetThreadContext) или еще как-нибудь. Скорее всего, ничего не выйдет (из-за
ограничений "песочницы" AppContainer и запрета загрузки в него чужих dll).

А в ядре блокировка таких процессов делается в два счета.
Re[2]: Контроль запуска приложений
От: Maniacal Россия  
Дата: 23.03.18 08:42
Оценка:
Здравствуйте, okman, Вы писали:

O>Попробуй интереса ради вгрузиться в какой-нибудь metro-шный Скайп на Win10, например. Не важно как — через хук,

O>CreateRemoteThread, угон потоков (SetThreadContext) или еще как-нибудь. Скорее всего, ничего не выйдет (из-за
O>ограничений "песочницы" AppContainer и запрета загрузки в него чужих dll).

O>А в ядре блокировка таких процессов делается в два счета.


Тут нужно, как пишут, сначала сообщить системе "Йа Дебугер!", делается это тоже нетривиально, что-то в реестре править нужно.
Re[3]: Контроль запуска приложений
От: okman Беларусь https://searchinform.ru/
Дата: 23.03.18 12:38
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Тут нужно, как пишут, сначала сообщить системе "Йа Дебугер!", делается это тоже нетривиально, что-то в реестре править нужно.


Это все решается цифровой подписью.
Re[2]: Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 23.03.18 15:14
Оценка:
Здравствуйте, okman, Вы писали:

O>Ничего лучше PsSetCreateProcessNotifyRoutine, PsSetCreateProcessNotifyRoutineEx и PsSetCreateProcessNotifyRoutineEx2

O>все равно нету. А юзермодные подходы плохи тем, что система просто не даст загружать свою dll в некоторые
O>процессы, равно как и запускать в них свои удаленные потоки или выделять память с правами на выполнение.

Да я знаю про PsSetCreateProcessNotifyRoutine, но не хочется лезть в ядро. Мне нужна не серьезная защита, а так, для поддержания штанов.
Задача не такая, что бы писать что-то серьезное.

К тому же, как я понял, то что здесь описано
Автор: EreTIk
Дата: 21.03.18
— это нечто типа прокси из вышеуказанной функции ядра для юзермода.
И опять же, если я правильно понял, то моя DLL не будет грузиться в память всех приложений. Её вызывает какой-то сервис, поддерживающий эту фишку.
Надо проверить кстати, в какой процесс будет загружаться моя DLL.
Re[3]: Контроль запуска приложений
От: ononim  
Дата: 23.03.18 20:18
Оценка:
ES>К тому же, как я понял, то что здесь описано
Автор: EreTIk
Дата: 21.03.18
— это нечто типа прокси из вышеуказанной функции ядра для юзермода.

ES>И опять же, если я правильно понял, то моя DLL не будет грузиться в память всех приложений. Её вызывает какой-то сервис, поддерживающий эту фишку.
ES>Надо проверить кстати, в какой процесс будет загружаться моя DLL.
appcert dll грузится в процесс, который вызывает CreateProcess То есть это тоже своеобразный инжект.
Как много веселых ребят, и все делают велосипед...
Re[4]: Контроль запуска приложений
От: CEMb  
Дата: 26.03.18 02:16
Оценка:
Здравствуйте, okman, Вы писали:

M>>Тут нужно, как пишут, сначала сообщить системе "Йа Дебугер!", делается это тоже нетривиально, что-то в реестре править нужно.


O>Это все решается цифровой подписью.


Ну это же ещё надо DDK знать и иметь цифровую подпись? Она как-то нетривиально получается.
Re[4]: Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 27.03.18 07:34
Оценка:
Здравствуйте, ononim, Вы писали:

O>appcert dll грузится в процесс, который вызывает CreateProcess То есть это тоже своеобразный инжект.


Действительно.
Сделал лог в какой процесс загружается DLL, получил такую картину:
GetModuleFilename = C:\Windows\system32\wininit.exe
GetModuleFilename = C:\Windows\system32\services.exe
GetModuleFilename = C:\Windows\system32\winlogon.exe
GetModuleFilename = C:\Windows\System32\svchost.exe
GetModuleFilename = C:\Windows\system32\svchost.exe
GetModuleFilename = C:\Windows\system32\svchost.exe
GetModuleFilename = C:\Windows\System32\svchost.exe
GetModuleFilename = C:\Windows\system32\taskeng.exe
GetModuleFilename = C:\Windows\system32\userinit.exe
GetModuleFilename = C:\Windows\Explorer.EXE
GetModuleFilename = C:\Windows\system32\SearchIndexer.exe


Странно, что запись в лог остановилась, запускались ведь и другие приложения.
Re[5]: Контроль запуска приложений
От: rumit7  
Дата: 27.03.18 07:47
Оценка: +1
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Действительно.

ES>Сделал лог в какой процесс загружается DLL, получил такую картину:
ES>...
ES>Странно, что запись в лог остановилась, запускались ведь и другие приложения.

здесь только родительские процессы, в дочерний процесс ваша длл-ка загрузится только если он в свою очередь стартанет свой дочерний процесс.

кстати в момент нотификации в родительском процессе имеется процесс хэндл (кроме случая запуска через UAC и запуска консоли, там такой хэндл будет в одном из svchost процессе, в котором ваша длл-ка и так сидит) с полным набором привилегий на стартующий дочерний процесс, следовательно используя его можно вручную внедриться в него.
Re[6]: Контроль запуска приложений
От: Evgeniy Skvortsov Россия  
Дата: 27.03.18 15:22
Оценка:
Здравствуйте, rumit7, Вы писали:

R>здесь только родительские процессы, в дочерний процесс ваша длл-ка загрузится только если он в свою очередь стартанет свой дочерний процесс.


Понял, лог выше был получен, когда код записи в лог был вставлен в DllMain с причиной PROCESS_ATTACH.

Переместил запись в лог в саму вызываемую функцию — список значительно вырос и постоянно пополняется.
В общем всё работает как надо.

Ещё один вопрос, система предполагается 64-битная. А как быть с 32-битными приложениями?
Собрать эту же dll и под 32 бита?
А как их обе в ключ реестра AppSecDll засунуть? Разделив точкой я запятой?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.