Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

Как можно перехватить событие закрытия программы   Найти похожие ветки 

 
Nemec ©   (2006-09-06 20:49) [0]

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


 
Dmitrij_K   (2006-09-06 21:09) [1]

запретить диспетчвер задач


 
Nemec ©   (2006-09-06 21:17) [2]

нельзя, бывает так, что дети запускают зараз 2-3 игрущки (особенно новички) тогда, чтобы не перезагружать машину приходиться самому пользоваться тремя пальцами


 
Nemec ©   (2006-09-06 21:37) [3]

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


 
Орион ©   (2006-09-06 21:51) [4]

Технология руткитов и вперед, никто и не узнает, что твоя программа запущена ;) Естественно до поры, до времени :)


 
ychenick ©   (2006-09-06 23:04) [5]

Орион, руткиты это слишком сложно, к тому же антивири могут на них матерится.

Предлагаю просто сделать клиент-сервер на сокетах. Клиент каждые 10-15 сек отправляет на сервер сигнал что он запущен - вот и все дела. Как только сервер не получил сигнал в течении, например, 20 сек  можно бить тревогу!


 
Nemec ©   (2006-09-07 05:30) [6]

Спасибо ychenick. Именно так я в конечном итоге и сделал. Но этот прием мне не нравится, лишняя нагрузка на сервер и на ЛВС. Как-то раз встречал прогу, при попытке её убить, она выдавала сообщение на экран. Здесь интересна сама идея, каким образом происходит сама процедура принудительного завершения процесса, какие события порождаются и как их перехватить из под Delphi.


 
Elen ©   (2006-09-07 13:54) [7]


> Nemec

Это напроч запретитдиспетчер задач (из кладовки этого сайта)

var
 reg:TRegistry;
begin
 reg := TRegistry.Create;
 reg.RootKey := HKEY_CURRENT_USER;
 reg.OpenKey("Software",True);
 reg.OpenKey("Microsoft",True);
 reg.OpenKey("Windows",True);
 reg.OpenKey("CurrentVersion",True);
 reg.OpenKey("Policies",True);
 reg.OpenKey("System",True);
 if Disable then
   reg.Writeinteger("DisableTaskMgr",1)
 else
   reg.Writeinteger("DisableTaskMgr",0);
 reg.CloseKey;
end;


 
Elen ©   (2006-09-07 13:55) [8]

p.s. Сотри все игры


 
Elen ©   (2006-09-07 13:59) [9]

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


 
DVM ©   (2006-09-07 14:55) [10]

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


 
DVM ©   (2006-09-07 14:56) [11]


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

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


 
DeadMeat ©   (2006-09-07 22:49) [12]

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


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

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


 
Nemec ©   (2006-09-08 06:51) [14]

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


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

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

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


 
Elen ©   (2006-09-08 07:58) [16]


> Nemec

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


 
DVM ©   (2006-09-08 10:08) [17]


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

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


 
DrPass ©   (2006-09-08 10:12) [18]


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

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

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

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


 
Nemec ©   (2006-09-08 13:34) [19]

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

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


 
Elen ©   (2006-09-08 14:23) [20]


> Nemec ©

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


> svchost.exe

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


>  идея хороша

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


 
xShadow ©   (2006-09-08 14:47) [21]


> 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 разом не убъёшь. Хотя и это можно обойти если честно, но сложней.


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

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

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


 
Elen ©   (2006-09-08 15:52) [23]


> Наиль ©

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


 
Nemec ©   (2006-09-08 16:32) [24]

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


 
xShadow ©   (2006-09-08 17:03) [25]


> Nemec

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


 
Nemec ©   (2006-09-09 16:30) [26]

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


 
Nemec ©   (2006-09-09 17:03) [27]

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


 
Anatoly Podgoretsky ©   (2006-09-10 14:36) [28]

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


 
Nemec ©   (2006-09-10 17:09) [29]

>xShadow - при вызове диспетчера задач ловушка отрубается!!!

>Anatoly Podgoretsky - как может помочь клиент-сервер?

Пока идея такова, делать на программе-сервере кнопку - "разблокировка клиента", по умолчанию на клиенте прога должна блокировать диспетчер задач и вырубать все проги указанные на сервере. Тогда по мере появления новых прог достаточно просто редактировать список запрещенных программ.
Также можно использовать идею "ychenick ©   (06.09.06 23:04) ", есть правда нюансы, спасти положение не сможет, но внимание администратора привлечет.

Какие будут советы в постановке самой задачи.

ЦЕЛЬ: защитить программу работающую на машине клиента от возможности снятия. Все остальное выше!


 
Alx_ ©   (2006-09-10 18:12) [30]

Nemec ©   (10.09.06 17:09) [29]
>xShadow - при вызове диспетчера задач ловушка отрубается!!!
Внедрять DLL можно и без использования хука.


 
Nemec ©   (2006-09-11 08:36) [31]

> Alx_ ©   (10.09.06 18:12)
Я понимаю внедрить DLL в свою программу, но как без ловушки перехватить события происходящие вне её?


 
Elen ©   (2006-09-11 08:47) [32]


> Nemec

Кажись  Alx  имел ввиду перехват сплайсингом, т.е. подменой сторонних процедур в других потоках своими. Для этого DLL лучше всего. Но это не так уж и просто.


 
Наиль ©   (2006-09-11 08:55) [33]

Поправка к моему методу [22].
"Бессмертная" программа перед запуском самой себя, должна сделать копию своего Exe с новым именем и запустить эту копию. Тогда...
Плюс: Прежде чем в Far появится имя процесса, процесс с этим именем перестанет существовать.
Минус: Exe станет уязвим для удаления

Всё это (мой метод) фантазия - лишёная оснований.


 
Elen ©   (2006-09-11 09:00) [34]


> Наиль ©

Креативная фантазия - это плюс
Но сложность - это минус


 
Nemec ©   (2006-09-11 09:08) [35]

Да, считал что я далеко не дурак.
Зашел на этот сайт и понял, что очень сильно ошибался!!!


 
Elen ©   (2006-09-11 09:28) [36]


> Nemec ©

Не принимай близко к сердцу - [29] вполне подойдет для контроля (для начала). И если хочеш почитай статьи о перехвате функций на лету (Автор MS REM ) в hook_full.chm


 
xShadow ©   (2006-09-12 14:11) [37]


> Nemec
> как может помочь клиент-сервер?

Очень просто. Небольшой пример. Клиенты отправляют в сеть сообщение о том что они "живи". Сервер принимает из сети broadcast пакеты по udp протоколу и не получив ни одно пакеты в течении пары минут от компьютора можно идти с битой и бить по голове. Такое общение огранизовывается за 15 минут максимум.


>  правда скорей всего (раз ты такой опытный) ты напишешь
> прогу которая и это снесет!!!

Если один человек сделал, то другой завсегда разобрать сможет. (с)

Вообщем немного поэксперементировав могу сказать вывод или моё IMHO. Нужен комплекс клиент-сервер при чём клиент хитрый экзешник + длл.
Если что пиши помогу.


 
Nemec ©   (2006-09-12 20:20) [38]

>xShadow
Спасибо за предложенную помощь.
Сама логика клиента у меня уже прописана, работает как сервис. Логику сервера подправлю на отслеживание сообщений от клиента, на предмет работы. Правда даже не знаю с какой стороны подойти к проблеме защиты самого клиента. Ясно одно надо запускать кого-то с кем вести диалог. Может прописать в DLL ловушку и при запуске любой проги запускать поток с опросом по таймеру, работает клиент или нет, но тогда вопрос:
  не будет ли комп топтаться на месте (тормозить), ведь программ в винде
  работает много. Помоги с выбором направления работы.

>Elen ©   (11.09.06 09:28) [36]
Спасибо за ссылку. Но материал большой, надо время, чтобы все это переварить. Тема для меня абсолютно новая.

PS Вот так пообщаюсь - глядишь поумнею!!!


 
ph0sgen ©   (2006-09-13 00:22) [39]

Мне кажется проблему можно решить так:

к примеру имеем:
1. сервис, который управляет чем вам нужно(о чем собственно и речь)
2. DLL которая будет скрывать его присутствие в системе

сервис внедряет DLL во все сущесвующие процессы и продолжает работу.
DLL перехватывает CreateProcessW чтобы контролировать все будущие процессы, перехватывает FindNextFileW для скрытия файлов на диске и ZwQuerySystemInformation (из ntdll.dll) для скрытия в списках процессов.

для снятия всего этого предусматривается функция в сервисе, которой может управлять администратор (аля FreeLibrary).

ИМХО лучше из сервиса инжектировать процедуру, которая будет сообщать АХТУНГ в какой-нибудь explorer.exe, чтобы не светить сервис.

антивири молчат, юзеры и админ довольны и всем хорошо


 
Ketmar ©   (2006-09-13 00:33) [40]

всё-таки, лучше руткит. ещё надёжней -- kernel mode driver с перехватчиком и ещё кое-что. это тоже снимается, конечно, но уже с чуть большим трудом. а лучше -- всё-таки не давать юзерам права админов. а то при помощи того же FAR"а и WinLogon пристрелить можно (сам проверял; получилось, к несчастью %-).



Страницы: 1 2 3 4 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.048 c
2-1173287081
ДжекиМайер
2007-03-07 20:04
2007.04.01
свой SEH


2-1173105640
ITineraNT
2007-03-05 17:40
2007.04.01
Компоненты TRz..., Tabc...


4-1163520543
savva
2006-11-14 19:09
2007.04.01
реализация Callback вызова из DLL: не выходит каменный цветочек..


2-1173855818
koha
2007-03-14 10:03
2007.04.01
какой функцией можно отличить съемный диск от не съемного


2-1173470070
arturich
2007-03-09 22:54
2007.04.01
Как получить текст из поля веб страницы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский