Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Приглашаем принять участие в работе над нашей Wiki.
  • Наша рассылка: subscribe.ru, content.mail.ru и Google groups.
  • Есть желающие вести новостную ленту "В мире технологий"?
  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
   Начало   Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (ст)Запретить запуск процесса  (Прочитано 10967 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 09-03-2005 09:49 » 

Есть какая нибудь возможность запретить запуск какого либо процесса кроме постоянного сканирования списка процессов и TerminateProcess нужного?
« Последнее редактирование: 01-05-2007 06:56 от Алексей1153++ » Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 09-03-2005 11:18 » 

ХМ - ИМХО нету другого...
Т.е. отслеживать стартующие процессы и запрещать его появления Kill или Terminate...
Записан

А птичку нашу прошу не обижать!!!
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 09-03-2005 11:25 » 

Не понял формулировку. Процесс - результат запуска какой нить проги или службы. И пока этого не произошло, то и процесса нет. Что же тогда запрещать? Может имеется в виду что-то другое?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.

"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #3 : 09-03-2005 11:25 » 

ХМ - ИМХО нету другого...
Т.е. отслеживать стартующие процессы и запрещать его появления Kill или Terminate...
Не оптимально это как-то((( А можно получать извещения при старте новых процессов интересно!
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #4 : 09-03-2005 12:22 » 

Немного не по теме, но хочу спросить вот что :
Бывают разные процессы, которые не килятся из таск мэнеджера. Так вот можно ли програмным способом килить такие процессы ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 09-03-2005 12:56 » 

Можно убрать право на запуск процесса пользователем или группой пользователей.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 09-03-2005 13:31 » 

Можно сделать маленький финт. Сразу скажу, я сам так не делал. Поэтому за последствия не ручаюсь.
В книге Рихтера, одна из глав посвешена, как вклинить свою Dll в другие процессы. Самый первый способ, это записать в определенном ключе регистра свою библиотеку. И тогда она автоматически будет грузится во все процессы. Затем в библиотеке при инициализации посылать просто широковешательное сообшение с номером процесса. И в своей программе перехватывать его. И дальше по обстоятельствам.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 10-03-2005 02:51 » 

Немного не по теме, но хочу спросить вот что :
Бывают разные процессы, которые не килятся из таск мэнеджера. Так вот можно ли програмным способом килить такие процессы ?
Это легко обойти Моя программа такие процессы килит - вообще килит все подряд Принцип в модификации токена процесса Я делаю так:

void CProcessTimeDlg::SmartKillProcess(DWORD ProcID)
//
//Завершение процесса
//
{
HANDLE hProcess=OpenProcess(PROCESS_TERMINATE,FALSE, ProcID);//Открываем процесс для убийства

   //Если процесс открыть не удалось      
    if (hProcess == NULL){
      //Проверка на ошибку доступа
      if (GetLastError() != ERROR_ACCESS_DENIED)return;

   //Иначе проверяем операционную систему
     OSVERSIONINFO osvi;
      // определяем версию операционной системы
       osvi.dwOSVersionInfoSize = sizeof(osvi);
        GetVersionEx(&osvi);
         // мы больше ничего не можем сделать, если это не Windows NT
          if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT)return;

   // включим привилегию SE_DEBUG_NAME и попробуем еще раз
     TOKEN_PRIVILEGES Priv, PrivOld;
      DWORD cbPriv = sizeof(PrivOld);
       HANDLE hToken;
        // получаем токен текущего потока
         if (!OpenThreadToken(GetCurrentThread(),
                             TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
                             FALSE, &hToken))
        {
           if (GetLastError() != ERROR_NO_TOKEN)return;
             // используем токен процесса, если потоку не назначено
             // никакого токена
               if (!OpenProcessToken(GetCurrentProcess(),
                                  TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,
                                  &hToken))return;
                  }
                   _ASSERTE(ANYSIZE_ARRAY > 0);
                    Priv.PrivilegeCount = 1;
                     Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                      LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid);
                     // попробуем включить привилегию
                        if (!AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv),&PrivOld, &cbPriv))
                         {
                          CloseHandle(hToken);
                           return;
                            }
                             if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
                               {
                                // привилегия SE_DEBUG_NAME отсутствует в токене
                                 // вызывающего
                                  CloseHandle(hToken);
                                     return;
                              }
                                     

   // попробуем открыть описатель процесса еще раз
     hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, ProcID);
     
   // восстанавливаем исходное состояние привилегии
     AdjustTokenPrivileges(hToken, FALSE, &PrivOld, sizeof(PrivOld),NULL, NULL);
      CloseHandle(hToken);
       if (hProcess == NULL) return;
        }


//Завершаем процесс
 TerminateProcess(hProcess,(DWORD)-1);
  CloseHandle(hProcess);
}
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 10-03-2005 02:57 » 

Можно сделать маленький финт. Сразу скажу, я сам так не делал. Поэтому за последствия не ручаюсь.
В книге Рихтера, одна из глав посвешена, как вклинить свою Dll в другие процессы. Самый первый способ, это записать в определенном ключе регистра свою библиотеку. И тогда она автоматически будет грузится во все процессы. Затем в библиотеке при инициализации посылать просто широковешательное сообшение с номером процесса. И в своей программе перехватывать его. И дальше по обстоятельствам.

Прикольно, если это действительно работает, то это уже вариант...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #9 : 10-03-2005 03:00 » 

Процесс - результат запуска какой нить проги или службы.
В идеале надо чтобы этим результатом запуска был NULL
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 10-03-2005 08:58 » 

USBLexus, чёт я по-моему туплю, или не въехал. Вопрос остаётся - как можно запретить процесс до его создания (ведь инфы напр. PID нет)? Или же надо замочить его сразу после создания? Тогда Гром уже написал.
И опять же - какие данные у нас есть о нём? ЕХЕ-шник? Хендл окна? PID?

Если второе, то... Ну например покопать в сторону: захучить ф-ции создающие процессы;
CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW и тп
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.

"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 10-03-2005 10:32 » 

Я думал может сообщение какое есть типа PRECREATEPROCESS)))) оказывается нету. Придется сканировать и килить нужный по имени процесса...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей1153++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Златоуст, Россия Сообщений: 13


« Ответ #12 : 17-04-2006 18:40 » 

(комент)

 статья
« Последнее редактирование: 01-05-2007 06:55 от Алексей1153++ » Записан

zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #13 : 18-04-2006 04:04 » 

Перехват функции ZwCreateFile - работает реально, сам реализовывал.
Записан
doublebug
Гость
« Ответ #14 : 18-04-2006 15:32 » 

По поводу нотификаций запуска процессов есть несколько статей
вот некоторые из них
http://www.microsoft.com/msj/0199/nerd/nerd0199.aspx
http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c5715
Они использут драйвер + usermode аппликация
там и сорцы есть
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.16 | SMF © 2011, Simple Machines