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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (ст)Запретить запуск процесса  (Прочитано 31977 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
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
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
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 » new

Процесс - результат запуска какой нить проги или службы.
В идеале надо чтобы этим результатом запуска был 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
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

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


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

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

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

ru
Offline Offline
Сообщений: 13


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

(комент)

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

zubr
Гость
« Ответ #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.21 | SMF © 2015, Simple Machines