Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2008, 00:10   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Восклицание Запретить завершение сервиса(даже через диспетчер)

Написал сервис на основе TServise, но его прибивают через Диспетчер Задач(и его почемуто видно в процессах диспетчера, хоть и запускается от SYSTEM). У кого есть пример реализации защиты от завершения? Главное чтобы защита немешала при завершении/перезагрузки Windows.

___________________________________ ______________________________
Поиск по форуму был произведён, исчерпывающей информации нет.
Alter вне форума Ответить с цитированием
Старый 03.04.2008, 06:32   #2
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
(и его почемуто видно в процессах диспетчера, хоть и запускается от SYSTEM)
А Вы что хотели.

Нужно драйвер-перехватчик, короче в результате система не знает ИД(или что-то в этом роде) и как следствие не может завершить (как и у касперского 6)

А проше:
1 - Назовите свой сервис "svchost.exe"
2 - заблокируйте диспетчер.

На форуме обсуждали как защитить ехе от завершения.
Всё гениальное - просто!

Последний раз редактировалось Air; 03.04.2008 в 06:35.
Air вне форума Ответить с цитированием
Старый 03.04.2008, 07:44   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Нужно просто чтоб сервис запускался с правами, запрещающими простому пользователю его завершать, а для этого должны быть настроены пользователи
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.04.2008, 07:57   #4
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Нужно просто чтоб сервис запускался с правами, запрещающими простому пользователю его завершать, а для этого должны быть настроены пользователи
В этом случае делать ничего не придётся, сервис стартует от имени SYSTEM, а пользователь так и так не завершит процесс, т.к. завершить может только Администратор.
Вопрос в другом, если у автора есть учётные записи с правами админа?, как быть тогда? (хотя автор может ограничить других пользователей до "опытные пользователи" им кажется нельзя завершать сис. процессы.)
Всё гениальное - просто!

Последний раз редактировалось Air; 03.04.2008 в 08:01.
Air вне форума Ответить с цитированием
Старый 03.04.2008, 10:27   #5
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Написал сервис на основе TServise
Вопрос не в тему, но я на него ответа так и не нашел, может вы знаете, как сделать к службе описание?
Например у службы Windows Installer описание
Цитата:
Позволяет добавлять, изменять и удалять приложения, предоставленные пакетом Windows Installer (*.msi). Если эта служба отключена, любые службы, которые явно зависят от нее, не могут быть запущены.
Как его добавить? В свойствах TService нет description :-(
dimonbest вне форума Ответить с цитированием
Старый 03.04.2008, 11:48   #6
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Как его добавить? В свойствах TService нет description :-(
Можно программно с помощью TRegistry
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 03.04.2008, 12:11   #7
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Можно программно с помощью TRegistry
Действительно, спасибо... А я ломал голову столько
dimonbest вне форума Ответить с цитированием
Старый 03.04.2008, 16:46   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Цитата:
Сообщение от Air Посмотреть сообщение
................................... ............................
2 - заблокируйте диспетчер.
................................... ............................
На форуме обсуждали как защитить ехе от завершения.
Заблокировать, это подозрительно будет.
На форуме то и смотрел.
___________________________________ __________
Но вот что нашол в инете(кто знает как ими пользоваться?):
Вложения
Тип файла: rar Ring0_.rar (44.1 Кб, 92 просмотров)
Alter вне форума Ответить с цитированием
Старый 04.04.2008, 10:35   #9
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Вот ещё нашол, есть недостаток, работая в цикле вызывает моргание списка в диспетчере:

Код:
Procedure FindIDel(NameExe :String);
var hTaskManager, hListView: HWND;
  vItemCount: Integer; // кол-во пунктов в списке 
  i: Integer;
  vBuffer: array[0..255] of Char; // буфер для приема данных
  vProcessId: DWORD; // идентификатор потока, который создал наш ListView
  vProcess: THandle; // дескриптор для работы с процессом
  vPointer: Pointer; // указатель на область выделенной памяти в чужом процессе
  vNumberOfBytesRead: Cardinal;
  vItem: TLVItem;
  St: String;
begin
 IF NameExe='' Then Exit;
  hTaskManager := FindWindow('#32770', 'Диспетчер задач Windows'); // сам диспетчер задач
 if hTaskManager = 0 then exit; // выход, если диспетчер не найден
  hListView := FindWindowEx(hTaskManager, 0, '#32770', ''); // первый список (приложения)
  hListView := FindWindowEx(hListView, 0, 'SysListView32', nil); // наш список (процессы)
  vItemCount := SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0); // получаем кол-во пунктов в ListView
                          { Получаем идентификатор потока, который создал ListView }
  GetWindowThreadProcessId(hListView, @vProcessId);
{ открываем процесс связанный с vProcessId с правами записи/чтения памяти } 
  vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,
                        False, vProcessId);
{ выделяем память в адресном пространстве этого процесса }
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
                           PAGE_READWRITE);
  try
for I := 0 to vItemCount - 1 do
begin // перебираем все записи
 with vItem do
 begin
  mask := LVIF_TEXT; // запрашиваем текст
  iItem := I;
  iSubItem := 0; // мы получаем данные первого столбца (!!!)
  cchTextMax := SizeOf(vBuffer);
  pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem)); // куда будет помешен результат
 end;
  WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem),
                     vNumberOfBytesRead);
  SendMessage(hListView, LVM_GETITEM, I, lparam(vPointer));
{ считываем результат } 
  ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
                    @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);

  St := vBuffer;
{ здесь определяем, что удалять (имя нашего .exe файла) }
 if St = NameExe{ExtractFileName(Application.ExeName)} then
 SendMessage(hListView, LVM_DELETEITEM, i, 0);
end; { - for - }
  finally
   VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); // освобождаем память
   CloseHandle(vProcess) // закрываем дескриптор доступа к процессу
  end { - try - }
end;
___________________________________ ___________________
Кто ещё что скажет, есть предложения?
Alter вне форума Ответить с цитированием
Старый 04.04.2008, 11:31   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Кто ещё что скажет, есть предложения?
Насчет неубиваемости/невидимости ?

Сам не пробовал, но мне видится, что это сработает. Может кто-то найдет изъян в этой схеме. Попробуем обсудить.

Схема такая. Ставим хук на сообщения. Для этого пишем dll. Эта dll будет подгружать к каждому создаваемому процессу, то есть будет в системе всегда. Теперь из этого множества нужно выбрать одну, которая будет создавать thread для выполнения полезной работы. Остальные будут пустышками. Например, можно выбрать процесс, который всегда присутствует в системе.

Вот такая невидимость. Нельзя убить процесс, которого нет.

---------
Можно обойтись и без хука. Есть ключ в реестре, который делает то-же самое - грузит dll ко всем процессам.

Последний раз редактировалось alexBlack; 04.04.2008 в 12:48.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Диспетчер задач NecRoMat Свободное общение 2 03.08.2008 16:55
диспетчер задач Istergul Общие вопросы Delphi 3 10.02.2008 00:23
Создание защищенного сервиса miae Общие вопросы Delphi 5 21.01.2008 18:54
Как запустить программу из сервиса Маркъ Общие вопросы Delphi 5 13.02.2007 00:29
как узнать путь запущенного сервиса Alar Общие вопросы Delphi 0 30.10.2006 11:18