Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно перехватить событие закрытия программы [D7, WinXP]


Страницы:   1 2 3 4 5 6 7

Nemec ©   (2006-09-06 20:49:00) 

Здравствуйте господа! Пишу программу управления компьютерным классом, компьютер клиента должен работать строго определенное время (оплаченное), на компьютере клиента работает программа управляющая им. У пользователей права админов, чтобы могли сами ставить любой софт по сети. Можно ли как-нибудь перехватить попытку закрытия процесса из Диспетчера задач. Тогда можно будет предпринять определенные действия. Программа работает как сервис и как сервис ее не закроешь, но я бессилен против трех пальцев.
Заранее спасибо.


Anatoly Podgoretsky   (2006-09-10 14:36:00) [101]

Кроме клиент-сервер ничего не поможет в данных условиях.


Nemec   (2006-09-09 17:03:00) [102]

Для работы в данном проекте приглашаются ВСЕ кто что-то может и умеет.
Какие будут идеи. Исходник того что получится будет выложен для общего пользования.
Заранее спасибо!!!


Nemec   (2006-09-09 16:30:00) [103]

> xShadow
Идея интересная, DLL я раньше писал, но что такое хук честно говоря не знаю, если знаешь скинь ссылку где можно почитать теорию по этой теме, если удасться решить эту задачу выложу исходники по этой теме!!! Думаю многим админам будет интересно, правда скорей всего (раз ты такой опытный) ты напишешь прогу которая и это снесет!!! ТАК??? Извини что на ты!


xShadow   (2006-09-08 17:03:00) [104]


> Nemec

Я предложил вариант, dll. Ещё можно воспользоваться документрированной возможностью при загрузке приложения поставить хук и внедрить dll во все приложения в системе, каждое новое приложение будет подгружать dll-ку. При таком подходе всё усложниться в разы. В любом случае это должен быть комплекс не из одного экзешника, а несколько екзешников (один сервис) и несколько длл, должны быть козыри в рукове. Наладить "общение" в комплексе с интервалом в 10-15 секунд и надо быть вуду чтобы успеть что-то сделать при таком раскладе, повреждение одно из элементов должно приводить сразу к блокировке компьютора.


Nemec   (2006-09-08 16:32:00) [105]

Наиль - FAR посволяет выделить группу процессов и одновременно их убить, поэтому предлагаемое иобой воскрешение уже опробовано, не подходит!
xShadow - получается что даный труд пустой номер, чтож жаль, кстати пытался создать поток из приложения, а из него отслеживать работу хозяина - тоже гибнет!
Elen - не все svchost.exe убиваются, убийство некоторых приводит к перезагрузке!
Чтож остается манипулировать правами, класс находится под камерами наблюдения + штрафные санкции + наблюдающий и т.д. и т.п. ничего общего с программированием! Обычная житейская рутина!
Всем большое спасибо!!!


Elen   (2006-09-08 15:52:00) [106]


> Наиль ©

А если я завершаю сеанс? Твой способ не даст мне этого так просто.


Наиль   (2006-09-08 15:06:00) [107]

Мой вариант (скорее всего не сработает, но проверять не охота)
Основан на том, что если нельзя не умереть, то нужно уметь воскресать.
Главная программа (далее родительская) должна вызвать "бессмертную" программу, та должна следить за существованием родительской и если её нет, то воскресить её. Закрываться должна по требованию родительской.
Код "бессмертной" программы:
program Project1;
uses
Windows;
begin
// Здесь проверка наличия родительской программы
// если программы нет, то запустить её
// Здесь проверка сигнала на завершение от родительской программы
// если сигнала нет, то
WinExec(ParamStr(0),SW_HIDE);
end.

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


xShadow   (2006-09-08 14:47:00) [108]


> Nemec

Начнём с того что убить приложение в NT можно как минимум 5 мне известными способами, а я уверен их больше. И от этих приёмов даже касперский здыхает. По порядку:
1. TerminateProcess - для его выполнения необходимо вызвать OpenProcess чтобы получить Handle, можно перехватить OpenProcess и отслеживать какой процесс пытается получить хендл, но опять же получить его можно и не документированным способом от которого не увернёшься.
2. Убить процесс снимая все потоки жесткий метод, но как показывает практика весьма эффективный. Защиться от этого метода тоже можно, перехватывать OpenThread, TerminateThread.
3. Инжект кода/библиотеки с вызовом ExitProcess( 0 ) - тоже весьма действенно.
4. Открыть приложение для отладки с посылом команды завершения.
5. Послать сообщение WM_QUIT - самое простое.
Продолжать можно долго. При этом внедряться и перехватывать нужно из Ring0, а это драйвер.
Есть более простое решение написать Dll и прописать её гденить в
AppInit_DLLs и KnownDLLs будет подгружаться практически всеми процессами и в диспетчере задач видно не будет. А из dll контролировать наличие нужного процесса.
Все DLL разом не убъёшь. Хотя и это можно обойти если честно, но сложней.


Elen   (2006-09-08 14:23:00) [109]


> Nemec ©

что делает WINDOWS при TerminateProcess? А вот что -
http://vsokovikov.narod.ru/Msdn_api/Global_SDK/Reference_API/Functions/Fn_T/fn_terminateprocess.htm


> svchost.exe

Как раз этот-то процесс убить не представляет труда


>  идея хороша

Не так уж и хороша. Ты и сам не сможеш просто завершить свою прогу. Значит в ней должен быть предусмотрем механизм завершения.
Лучше будет настроить доступы примерно так :
Ты - админ.
Юзера - Опытные пользователи.


Nemec   (2006-09-08 13:34:00) [110]

Slym(RO) я ведь просто прикладной программист всю жизнь писал под БД - НИЧЕГО НЕ ПОНЯЛ
Elen - идея хороша, даже (DVM, DrPass) если убить процесс из FARa есть риск завершить не тот процесс, а это уже критично (svchost.exe). СПАСИБО.

PS: Не могу найти в инете документации по данной теме: что делает WINDOWS при TerminateProcess, если кто знает ссылку подскажите


DrPass   (2006-09-08 10:12:00) [111]


> Nemec ©   (08.09.06 06:51) [14]

Дело в том, что CanClose:=false тебе не поможет, Диспетчер задач убивает с помощью TerminateProcess, и не спрашивает у процесса разрешение на закрытие. Частичным выходом может быть

> Elen ©   (08.09.06 07:58) [16]

По крайней мере, это спасет от стандартного Диспетчера задач. Но все равно программу можно будет снять с помощью любой другой похожей утилиты, например через панель "процессы" в обычном FARe


DVM   (2006-09-08 10:08:00) [112]


> винда не имеет право закрывать из диспечтера задач программы
> с некоторыми именами

Тоже можно закрыть. Только немного посложнее.


Elen   (2006-09-08 07:58:00) [113]


> Nemec

P.S.
В WinXP есть интересная особенность - винда не имеет право закрывать из диспечтера задач программы с некоторыми именами. Если ты назовеш свою прогу например WinLogon.exe или smss.exe, то ее смогут закрыть только завершив сеанспричем неважно кто попытается закрывать админ или юзер. И в тоже время такое имя не будет мешать системе нормально работать (проверено на XP SP1-2)


Slym(RO)   (2006-09-08 07:43:00) [114]

ychenick ©   (06.09.06 23:04) [5]
сделать клиент-сервер на сокетах

стявится снифак, ломается протокол, пишется заглушка. кикаем сервер и ставим свой


Nemec   (2006-09-08 06:51:00) [115]

Спасибо мастерам, спасибо Elen. Для DrPass дело в том, что политика цетра "Центр учебно-игровой", дети сами ставят любой софт какой захотят, база игрушек больше 1000 игр, база фильмов и около 600 гб всякого софта, поэтому и права у всех админы (на локальных машинах естественно, в домене они пользователи), пример Elen по закрытию формы покатаю спасибо Elen. Если получиться распишу как решать данную задачу. Для DVM, я неправильно выразился, нагрузка на сервер имелось ввиду усложнение программы работающей на сервере приходится прописывать лишнюю логику, есть дополнительные нюансы, я эту схему уже проповал. Еще раз всем спасибо!


DrPass   (2006-09-08 00:24:00) [116]

Необязательно скрывать. Пусть дети сидят под юзерскими учетными записями, а программа запускается под учеткой админа - и пущай они хоть целый день любуются на нее в Диспетчере задач, все равно снять ее не смогут


DeadMeat   (2006-09-07 22:49:00) [117]

Проще все таки снять права.. Ведь им не нужно ставить софт, а только Вам. Можно через RemoteDesktop подключаться на крайняк... Чтобы не ходить.
Все остальное можно подстроить под запись в нужные папки и ветки реестра.
В начале может и гемор, зато потом проще будет.


DVM   (2006-09-07 14:56:00) [118]


> Но этот прием мне не нравится, лишняя нагрузка на сервер
> и на ЛВС

какая нахрен загрузка при посылке десятка байт по UDP?


DVM   (2006-09-07 14:55:00) [119]

Скрыть ее от диспетчера задач.


Elen   (2006-09-07 13:59:00) [120]

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
canclose:=false;
//Здеси выводи свое сообщение
end;


Страницы:   1 2 3 4 5 6 7

Наверх

Титульная страница Поиск, карта сайта Написать письмо