Як можна перехопити подія закриття програми

Як можна перехопити подія закриття програми

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

заборонити діспетчвер завдань

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

я використовував такий прийом, написав другий сервіс, обидва сервісу опитують один одного з інтервалом, якщо один з сервісів відсутній другий посилає повідомлення на сервер і вимикає комп'ютер. Але. Прийшов хлопчик запустив FAR і в одну мить зніс під три чорти весь захист.

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

Оріон, руткіти це занадто складно, до того ж антивирь можуть на них матюкається.

Пропоную просто зробити клієнт-сервер на сокетах. Клієнт кожні 10-15 сек відправляє на сервер сигнал що він запущений - ось і всі справи. Як тільки сервер не отримав сигнал протягом, наприклад, 20 сек # XA0; можна бити тривогу!

Спасибі ychenick. Саме так я в кінцевому підсумку і зробив. Але цей прийом мені не подобається, зайве навантаження на сервер і на ЛВС. Якось раз зустрічав прогу, при спробі її вбити, вона видавала повідомлення на екран. Тут цікава сама ідея, яким чином відбувається сама процедура примусового завершення процесу, які події породжуються і як їх перехопити з під Delphi.


> Nemec

Це геть запретітдіспетчер завдань (з комори цього сайту)

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

p.s. Зітри всі ігри

procedure TForm1.FormCloseQuery (Sender: TObject; var CanClose: Boolean);
begin
canclose: = false;
// Здес виводь свою повідомлення
end;

Приховати її від диспетчера задач.


> Але цей прийом мені не подобається, зайве навантаження на сервер
> І на ЛВС

яка нахрен завантаження при посилці десятка байт по UDP?

Простіше все таки зняти права. Адже їм не потрібно ставити софт, а тільки Вам. Можна через RemoteDesktop підключатися на крайняк. Щоб не ходити.
Все інше можна підлаштувати під запис в потрібні папки і гілки реєстру.
На початку може і гемор, зате потім простіше буде.

Необов'язково приховувати. Нехай діти сидять під юзерскій обліковими записами, а скрипт буде працювати під учеткой адміна - і хай вони хоч цілий день милуються на неї в диспетчері завдань, все одно зняти її не зможуть

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


> Nemec

P.S.
У WinXP є цікава особливість - вінда не має право закривати з діспечтера завдань програми з деякими іменами. Якщо ти назвеш свою прогу наприклад WinLogon.exe або smss.exe, то її зможуть закрити лише завершивши сеанс причому неважливо хто спробує закривати адмін або користувач. І в той же час таке ім'я не буде заважати системі нормально працювати (перевірено на XP SP1-2)


> Винда не має право закривати з діспечтера завдань програми
> З деякими іменами

Теж можна закрити. Тільки трохи складніше.

Slym (RO) я ж просто прикладний програміст все життя писав під БД - НІЧОГО НЕ ЗРОЗУМІВ
Elen - ідея хороша, навіть (DVM, DrPass) якщо вбити процес з FARa є ризик завершити не той процес, а це вже критично (svchost.exe). ДЯКУЄМО.

PS: Не можу знайти в інеті документації по даній темі: що робить WINDOWS при TerminateProcess, якщо хто знає посилання підкажіть


> svchost.exe

Якраз цей-то процес вбити не становить труднощів


> # XA0; ідея хороша

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


> 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 разом не уб'ёшь. Хоча і це можна обійти якщо чесно, але складніше.

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

Така програма вмирає раніше, ніж її успівают вбити, і тут же воскрешет себе. Наслідки її роботи передбачити важко, а значить невелика ймовірність того, що все буде працювати так, як мені б хотілося.
Але як їжа для розуму - згодиться.

Наіль - FAR посволяет виділити групу процесів і одночасно їх вбити, тому пропоноване іобой воскресіння вже випробувано, не підходить!
xShadow - виходить що даний працю порожній номер, чтож шкода, до речі намагався створити потік з програми, а з нього відстежувати роботу господаря - теж гине!
Elen - не всі svchost.exe вбиваються, вбивство деяких призводить до перезавантаження!
Щож залишається маніпулювати правами, клас знаходиться під камерами спостереження + штрафні санкції + спостерігає і т.д. і т.п. нічого спільного з програмуванням! Звичайна життєва рутина!
Усім дуже дякую.


> Nemec

Я запропонував варіант, dll. Ще можна скористатися документрірованной можливістю при завантаженні програми поставити хук і впровадити dll у всі програми в системі, кожне нове додаток буде довантажувати dll-ку. При такому підході все ускладнитися в рази. У будь-якому випадку це повинен бути комплекс не з одного файлів, а кілька екзешніков (один сервіс) і кілька длл, повинні бути козирі в рукавах. Налагодити "спілкування" в комплексі з інтервалом в 10-15 секунд і треба бути вуду щоб встигнути щось зробити при такому розкладі, пошкодження одне з елементів повинно призводити відразу до блокування компьютора.

> xShadow
Ідея цікава, DLL я раніше писав, але що таке хук чесно кажучи не знаю, якщо знаєш скинь посилання де можна почитати теорію по цій темі, якщо вдасться вирішити цю задачу викладу исходники по цій темі. Думаю багатьом адмінам буде цікаво, правда скоріше за все (якщо ти такий досвідчений) ти напишеш прогу яка і це знесе. ТАК. Вибач що на ти!

Для роботи в даному проекті запрошуються ВСІ хто щось може і вміє.
Які будуть ідеї. Исходник того що вийде буде викладений для загального користування.
Заздалегідь дякую.

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

> XShadow - при виклику диспетчера задач пастка відрубується.

> Anatoly Podgoretsky - як може допомогти клієнт-сервер?

Які будуть поради в постановці самого завдання.

МЕТА: захистити програму працюючу на машині клієнта від можливості зняття. Все інше вище!


> Nemec

здається # XA0; Alx # XA0; имел ввиду перехоплення сплайсингом, тобто підміною сторонніх процедур в інших потоках своїми. Для цього DLL найкраще. Але це не так вже й просто.

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

Все це (мій метод) фантазія - позбавлений підстав.

Так, вважав що я далеко не дурень.
Зайшов на цей сайт і зрозумів, що дуже сильно помилявся.


> Nemec
> Як може допомогти клієнт-сервер?

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


> # XA0; правда скоріше за все (якщо ти такий досвідчений) ти напишеш
> Прогу яка і це знесе.

Якщо одна людина зробила, то інший завжди розібрати зможе. (С)

Вообщем трохи поексперементувати можу сказати висновок або моє IMHO. Потрібен комплекс клієнт-сервер при чому клієнт хитрий екзешник + длл.
Якщо що пиши допоможу.

> xShadow
Дякую за запропоновану допомогу.
Сама логіка клієнта у мене вже прописана, працює як сервіс. Логіку сервера підправлю на відстеження повідомлень від клієнта, на предмет роботи. Правда навіть не знаю з якого боку підійти до проблеми захисту самого клієнта. Зрозумілим є одне треба запускати когось з ким вести діалог. Може прописати в DLL пастку і при запуску будь-якої проги запускати потік з опитуванням за таймером, працює клієнт чи ні, але тоді питання:
# XA0; чи не буде комп топтатися на місці (гальмувати), адже програм в винде
# XA0; працює багато. Допоможи з вибором напрямку роботи.

PS Ось так поспілкуюся - дивись розумніше.

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

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

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

для зняття всього цього передбачається функція в сервісі, якої може управляти адміністратор (аля FreeLibrary).

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

антивирь мовчать, користувачі і адмін задоволені і всім добре

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

Пам'ять: 0.84 MB
Час: 0.114 c