Проблема с NtCreateUserProcess
От: BDEsoft  
Дата: 26.03.13 09:12
Оценка:
Всем добрый.
Делаю хук в SSDT на функцию NtCreateUserProcess (win7, win8 x86). Все отрабатывает нормально, получаю имя процесса которое запускается и имя процесса которое запускает.
Далее в программе выдается диалоговое окно с выбором "Запустить" или "Отклонить". При утвердительном ответе процесс запускается нормально. При отказе выдается диалоговое окно "Неизвестная ошибка".

В XP при перехвате функции NtCreateProcessEx при отказе возвращаю NTSTATUS = 0x80070000 (RETURN_ERRO_NOBOX) — и диалоговое окно не появляется.
В семерке и восьмерке же при возврате 0x80070000 (или же любого другого кода) выходит диалоговое окно (с разной ошибкой). Значит функция NtCreateUserProcess должна отработать, но замена пути процесса в параметре ProcessParameters приводит к тому, что функция отрабатывает нормально, но все равно происходит запуск первоначального процесса.
Из стека запуска:

0669e09c 77915784 7630e5d5 0669e3dc 0669e3b8 ntdll!KiIntSystemCall+0x6
0669e0a0 7630e5d5 0669e3dc 0669e3b8 02000000 ntdll!NtCreateUserProcess+0xc
0669e6fc 762c2079 00000000 04e52484 04e01230 kernel32!CreateProcessInternalW+0xe75
0669e734 76a955c1 04e52484 04e01230 00000000 kernel32!CreateProcessW+0x2c
0669e82c 76aa2bda 000100d2 00000000 04e52484 SHELL32!_SHCreateProcess+0x251

Я так понимаю, что виновна функция CreateProcessInternalW, но вот как ее обхитрить не знаю.

Может кто сталкивался? Или же в win7 и win8 нужно делать хук на другую функцию?
Re: Проблема с NtCreateUserProcess
От: okman Беларусь https://searchinform.ru/
Дата: 26.03.13 09:16
Оценка:
Здравствуйте, BDEsoft, Вы писали:

BDE>Делаю хук в SSDT на функцию NtCreateUserProcess (win7, win8 x86).


И сразу вопрос — почему не PsSetCreateProcessNotifyRoutine ?
Re: Проблема с NtCreateUserProcess
От: ononim  
Дата: 26.03.13 09:25
Оценка:
Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess
Как много веселых ребят, и все делают велосипед...
Re[2]: Проблема с NtCreateUserProcess
От: BDEsoft  
Дата: 26.03.13 09:28
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, BDEsoft, Вы писали:


BDE>>Делаю хук в SSDT на функцию NtCreateUserProcess (win7, win8 x86).


O>И сразу вопрос — почему не PsSetCreateProcessNotifyRoutine ?


А разве с помощью PsSetCreateProcessNotifyRoutine можно отменить создание процесса? Как я писал, мне нужно пользователю выдавать окно запроса, и отменять запуск (или по правилам)
Re[2]: Проблема с NtCreateUserProcess
От: BDEsoft  
Дата: 26.03.13 09:30
Оценка:
Здравствуйте, ononim, Вы писали:

O>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess


Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
Re[3]: Проблема с NtCreateUserProcess
От: ononim  
Дата: 26.03.13 09:33
Оценка:
O>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess
BDE>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
что значит "окончание запуска процесса" и зачем его дожидацца?
Как много веселых ребят, и все делают велосипед...
Re[3]: Проблема с NtCreateUserProcess
От: okman Беларусь https://searchinform.ru/
Дата: 26.03.13 09:36
Оценка:
Здравствуйте, BDEsoft, Вы писали:

BDE>А разве с помощью можно отменить создание процесса? Как я писал, мне нужно пользователю выдавать окно запроса, и отменять запуск (или по правилам)


Напрямую с помощью PsSetCreateProcessNotifyRoutine, конечно же, нельзя.
Но есть вариант — во время срабатывания данной функции поставить запуск процесса "на паузу",
уведомить юзермодное приложение, а затем либо возобновить запуск, либо прибить новый
процесс через ZwTerminateProcess.
Re[4]: Проблема с NtCreateUserProcess
От: BDEsoft  
Дата: 26.03.13 10:01
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess

BDE>>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?
O>что значит "окончание запуска процесса" и зачем его дожидацца?

Сейчас проверил:

         ProcessParameters->Flags |= 0x00000004; //(CREATE_SUSPENDED)
         status = ((NtCreateUserProcess)RealNtCreateUserProcess) (ProcessHandle,
             ThreadHandle,
             Parameter2,
             Parameter3,
             ProcessSecurityDescriptor,
             ThreadSecurityDescriptor,
             Parameter6,
             Parameter7,
             ProcessParameters,
             Parameter9,
             pProcessUnKnow);
         if(status==STATUS_SUCCESS)
         {status = ZwTerminateProcess(*ProcessHandle, STATUS_SUCCESS); }
         DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL, "mhiv - FakedNtCreateUserProcess - %x", status);
         return  STATUS_SUCCESS;

В итоге получил диалоговое окно "Отказано в доступе к указанному устройству, ...". Т.е. не получается сразу закрывать процесс.

Здравствуйте, okman, Вы писали:

O>Здравствуйте, BDEsoft, Вы писали:


BDE>>А разве с помощью можно отменить создание процесса? Как я писал, мне нужно пользователю выдавать окно запроса, и отменять запуск (или по правилам)


O>Напрямую с помощью PsSetCreateProcessNotifyRoutine, конечно же, нельзя.

O>Но есть вариант — во время срабатывания данной функции поставить запуск процесса "на паузу",
O>уведомить юзермодное приложение, а затем либо возобновить запуск, либо прибить новый
O>процесс через ZwTerminateProcess.

Попробую покопать.
Re[5]: Проблема с NtCreateUserProcess
От: ononim  
Дата: 26.03.13 10:13
Оценка:
BDE>В итоге получил диалоговое окно "Отказано в доступе к указанному устройству, ...". Т.е. не получается сразу закрывать процесс.

плохо. Кстати имя ехешника который запускать передается в последнем параметре — там структура с указателями в т.ч. на путь к имажу, а process parameters используется для формирования PEB::UserProcessParameters процесса и вобщемто не имеет отношения к тому что делает ядро
Как много веселых ребят, и все делают велосипед...
Re: Проблема с NtCreateUserProcess
От: x64 Россия http://x64blog.name
Дата: 26.03.13 11:48
Оценка:
BDE>Может кто сталкивался?

Попробуй здесь почитать.
JID: x64j@jabber.ru
Re[2]: Проблема с NtCreateUserProcess
От: BDEsoft  
Дата: 26.03.13 12:46
Оценка:
При использовании PsSetCreateProcessNotifyRoutine и ZwTerminateProcess так же выходит окно "Отказано в доступе к указанному устройству, ..." — не подходит.


Здравствуйте, x64, Вы писали:

BDE>>Может кто сталкивался?


x64>Попробуй здесь почитать.


Попробую, хорошая статья.
Но ни разу ничего не внедрял и сложно сразу понять, что же должно быть в shell-коде в данном случае.
Как я понял (грубо):

ExitProcess (ERROR_SUCCESS);
ret


или просто

ret
Re: Проблема с NtCreateUserProcess
От: kr4nt  
Дата: 26.03.13 14:30
Оценка:
Здравствуйте, BDEsoft

Я решал данную задачу используя PsSetCreateProcessNotifyRoutine.
Получается универсально. Для завершения процесса использовал код:


if(nTerminate)
{
   InitializeObjectAttributes(&pObjAttr, NULL, 0, NULL, NULL);

   cid.UniqueProcess    = (HANDLE)ProcessId;
   cid.UniqueThread    = (HANDLE)0;

   if(!ZwOpenProcess(&pProcessHandle, DELETE, &pObjAttr, &cid))
   {
      ZwTerminateProcess(pProcessHandle, nStatus);
      ZwClose(pProcessHandle);
   }
}
Re[3]: Проблема с NtCreateUserProcess
От: mike_rs Россия  
Дата: 27.03.13 06:18
Оценка: +1
Здравствуйте, BDEsoft, Вы писали:

BDE>Здравствуйте, ononim, Вы писали:


O>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess


BDE>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?


APC инжектнуть, например. Тут есть статья на эту тему.
Re[4]: Проблема с NtCreateUserProcess
От: BDEsoft  
Дата: 27.03.13 11:45
Оценка:
Здравствуйте, kr4nt, Вы писали:

K>Здравствуйте, BDEsoft


K>Я решал данную задачу используя PsSetCreateProcessNotifyRoutine.

K>Получается универсально. Для завершения процесса использовал код:


К сожалению на семерке и восьмерке данный код приводит к появлению диалогового окна, описанному мной выше.


Здравствуйте, mike_rs, Вы писали:

_>Здравствуйте, BDEsoft, Вы писали:


BDE>>Здравствуйте, ononim, Вы писали:


O>>>Будьте чеснее — просто запускайте оригинальный процесс в suspended состоянии и тут же его киляйте при помощи NtTerminateProcess


BDE>>Это уже чтото. Теперь еще вопрос, как дождаться окончания запуска процесса в драйвере, не останавливая поток?


_>APC инжектнуть, например. Тут есть статья на эту тему.


Про это уже прочитал, но до этого момента не слышал об этом, сейчас пытаюсь изучить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.