Всем добрый.
Делаю хук в SSDT на функцию NtCreateUserProcess (win7, win8 x86). Все отрабатывает нормально, получаю имя процесса которое запускается и имя процесса которое запускает.
Далее в программе выдается диалоговое окно с выбором "Запустить" или "Отклонить". При утвердительном ответе процесс запускается нормально. При отказе выдается диалоговое окно "Неизвестная ошибка".
В XP при перехвате функции NtCreateProcessEx при отказе возвращаю NTSTATUS = 0x80070000 (RETURN_ERRO_NOBOX) — и диалоговое окно не появляется.
В семерке и восьмерке же при возврате 0x80070000 (или же любого другого кода) выходит диалоговое окно (с разной ошибкой). Значит функция NtCreateUserProcess должна отработать, но замена пути процесса в параметре ProcessParameters приводит к тому, что функция отрабатывает нормально, но все равно происходит запуск первоначального процесса.
Из стека запуска:
Здравствуйте, okman, Вы писали:
O>Здравствуйте, BDEsoft, Вы писали:
BDE>>Делаю хук в SSDT на функцию NtCreateUserProcess (win7, win8 x86).
O>И сразу вопрос — почему не PsSetCreateProcessNotifyRoutine ?
А разве с помощью PsSetCreateProcessNotifyRoutine можно отменить создание процесса? Как я писал, мне нужно пользователю выдавать окно запроса, и отменять запуск (или по правилам)
Здравствуйте, ononim, Вы писали:
O>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess
Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
O>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess BDE>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
что значит "окончание запуска процесса" и зачем его дожидацца?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, BDEsoft, Вы писали:
BDE>А разве с помощью можно отменить создание процесса? Как я писал, мне нужно пользователю выдавать окно запроса, и отменять запуск (или по правилам)
Напрямую с помощью PsSetCreateProcessNotifyRoutine, конечно же, нельзя.
Но есть вариант — во время срабатывания данной функции поставить запуск процесса "на паузу",
уведомить юзермодное приложение, а затем либо возобновить запуск, либо прибить новый
процесс через ZwTerminateProcess.
Здравствуйте, ononim, Вы писали:
O>>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess BDE>>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток? O>что значит "окончание запуска процесса" и зачем его дожидацца?
В итоге получил диалоговое окно "Отказано в доступе к указанному устройству, ...". Т.е. не получается сразу закрывать процесс.
Здравствуйте, okman, Вы писали:
O>Здравствуйте, BDEsoft, Вы писали:
BDE>>А разве с помощью можно отменить создание процесса? Как я писал, мне нужно пользователю выдавать окно запроса, и отменять запуск (или по правилам)
O>Напрямую с помощью PsSetCreateProcessNotifyRoutine, конечно же, нельзя. O>Но есть вариант — во время срабатывания данной функции поставить запуск процесса "на паузу", O>уведомить юзермодное приложение, а затем либо возобновить запуск, либо прибить новый O>процесс через ZwTerminateProcess.
BDE>В итоге получил диалоговое окно "Отказано в доступе к указанному устройству, ...". Т.е. не получается сразу закрывать процесс.
плохо. Кстати имя ехешника который запускать передается в последнем параметре — там структура с указателями в т.ч. на путь к имажу, а process parameters используется для формирования PEB::UserProcessParameters процесса и вобщемто не имеет отношения к тому что делает ядро
Как много веселых ребят, и все делают велосипед...
При использовании PsSetCreateProcessNotifyRoutine и ZwTerminateProcess так же выходит окно "Отказано в доступе к указанному устройству, ..." — не подходит.
Здравствуйте, x64, Вы писали:
BDE>>Может кто сталкивался?
x64>Попробуй здесь почитать.
Попробую, хорошая статья.
Но ни разу ничего не внедрял и сложно сразу понять, что же должно быть в shell-коде в данном случае.
Как я понял (грубо):
Здравствуйте, BDEsoft, Вы писали:
BDE>Здравствуйте, ononim, Вы писали:
O>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess
BDE>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
APC инжектнуть, например. Тут есть статья на эту тему.
Здравствуйте, kr4nt, Вы писали:
K>Здравствуйте, BDEsoft
K>Я решал данную задачу используя PsSetCreateProcessNotifyRoutine. K>Получается универсально. Для завершения процесса использовал код:
К сожалению на семерке и восьмерке данный код приводит к появлению диалогового окна, описанному мной выше.
Здравствуйте, mike_rs, Вы писали:
_>Здравствуйте, BDEsoft, Вы писали:
BDE>>Здравствуйте, ononim, Вы писали:
O>>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess
BDE>>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
_>APC инжектнуть, например. Тут есть статья на эту тему.
Про это уже прочитал, но до этого момента не слышал об этом, сейчас пытаюсь изучить