Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Пресекание убийства процесса


Автор: EuGenius_Krivbass 15.1.2008, 15:47
У меня есть прога, убийство которой я хочу предотвратить, т.е. чтобы прогу никто не мог закрыть кроме нее самой.
Диспетчер задач тоже не должен уметь завершать процесс проги.
Благодарю за помощь.

Автор: merge 15.1.2008, 15:59
только написанием драйвера. иначе - никак.

Автор: EuGenius_Krivbass 15.1.2008, 16:02
Знать бы как это написать....

Автор: farad 15.1.2008, 16:30
Цитата(EuGenius_Krivbass @  15.1.2008,  15:47 Найти цитируемый пост)
Диспетчер задач тоже не должен уметь завершать процесс проги.
 такого не бывает. кому надо тот процесс грохнет полюбому и драйверы тут не причем...Другое дело можно административными средствами всячески ограничить права пользователя...

Автор: Ch0bits 15.1.2008, 16:52
Можно запускать два экземпляра программы, чтобы они отслеживали состояние друг друга и при необходимости перезапускались.
В висте можно использовать Application Recovery and Restart API.

Автор: merge 15.1.2008, 17:29
Цитата(Ch0bits @ 15.1.2008,  16:52)
Можно запускать два экземпляра программы, чтобы они отслеживали состояние друг друга и при необходимости перезапускались.

это глупость. процессы замораживаются и киляются.

Реализацию на приемлемом уровне можно сделать с помощью драйвера. с вопросами в гугл.

Автор: Legolas 15.1.2008, 17:48
можно попробовать приклеить свой процесс к системному. 

Автор: farad 15.1.2008, 18:09
Цитата(merge @  15.1.2008,  17:29 Найти цитируемый пост)
с вопросами в гугл.
лучший ответ smile позвольте узнать, а что вы подразумеваете под словом драйвер?

Автор: Ch0bits 15.1.2008, 18:10
Цитата(merge @  15.1.2008,  17:29 Найти цитируемый пост)
это глупость. процессы замораживаются и киляются.

Это глупости. Все зависит от реализации. У хорошего программиста не будет ни deadlock, ни livelock.

К слову. Убийства через диспетчер задач можно избежать, если назвать исполняемый файл именем критического процесса, например: lsass.exe, services.exe, csrss.exe и т.п.

Автор: merge 16.1.2008, 09:08
Цитата(Ch0bits @ 15.1.2008,  18:10)
Все зависит от реализации. У хорошего программиста не будет ни deadlock, ни livelock.

К слову. Убийства через диспетчер задач можно избежать, если назвать исполняемый файл именем критического процесса, например: lsass.exe, services.exe, csrss.exe и т.п.

можете привести пример программы такой? Которая создает два экземпляра контролируют друг друга. При этом не киляются.

Про системное имя файла это тоже так себе "защита". Стороннему процессу пофиг какое имя файла.

Я выкладываю пример программы, которая защищается драйвером от открытия с флагом PROCESS_TERMINATE. Но и это не панацея. Можно такой процесс убить перемочив все потоки в нем. Посему нужно следить и за этим.
  • Открываем KmdManager.exe, инсталлируем драйвер, загружаем драйвер
  • Запускаем прогу NoTerminate.exe
  • Пытаемся закилить
  • Выгружаем драйвер и удаляем.

Тут все зависит - какую сложность нужно автору. может ему хватит двух процессов.

Автор: EnergoHokum 16.1.2008, 11:15
Насколько я помню (поправьте, если что), при попытке закрытия программы операционка сначала пытается сделать это "вежливо", посылкой сообщений, если приложение на них не реагирует -- тогда разговор становится "жёстче". Как вариант, при первой-же "вежливой просьбе" процесс создаёт свою копию, скидывает туда данные, которые нужно сохранить для работы, и "умирает". Как такой вариант?

Автор: BorisVorontsov 16.1.2008, 11:29
Цитата(EnergoHokum @  16.1.2008,  11:15 Найти цитируемый пост)
Насколько я помню (поправьте, если что), при попытке закрытия программы операционка сначала пытается сделать это "вежливо", посылкой сообщений, если приложение на них не реагирует -- тогда разговор становится "жёстче".


По умолчанию - да. Но можно легко настроить так, что бы разговор был "жёстким" сразу.

Автор: W4FhLF 16.1.2008, 13:16
Создаёшь процесс, запускаешь, из него подгружаешь в адресное пространство svchost.exe свою dll, которая при убийстве процесса перегружает его. Если убить целиком svchost.exe - система умрёт. Придётся выгружать dll либо по-хорошему(посылкой DLL_PROCESS_DETACH, мы ессно это сообщение поймаем и не согласимся выгружатьсяsmile ), либо по плохому: вычисление потока в котором крутится код DLL и убиение онного насильно. Ещё после этого можно удалить DLL, но в таком случае пользовательский процесс может установить Notify Rotine на этот файл(NtNotifyChangeDirectoryFile), т.е. когда пользователь попытается удалить его - твофя программа об этом узнает и запишет его на винт снова(из ресурсов, например). Но идея с DLL в прицнипе не очень, лучше взять базонезависимый код, либо скомпилированный для нестаднартной базы(0x13150000 например) и внедрить его в системный процесс, а код будет проверять на наличие процесса в списке активных, если его не будет, то код запускает его опять. 

Это лишь малая часть методов для режима пользователя(т.е. без драйвера). Суть в том, что на каждое действие находится своё противодействие. Тут всё зависит от ищущегоsmile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)