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) 

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


Nemec   (2006-09-15 22:57:00) [61]

>xShadow

Примерная работа DLL

{ Идея xShadow
библиотека advApiHook Ms-Rem (Ms-Rem@yandex.ru) ICQ 286370715
}
library TestDll;
uses
 windows,
 advApiHook;

Var
 F: Boolean;
 Process: DWord;
begin
 F:=False;
 While Not F do
 begin
   {Для примера}
   Process:=GetProcessId('Notepad.exe');
   If Process=0
   Then
     MessageBox(0, 'Закрыли клиента!', 'Внимание', MB_OK);
   Sleep (5000);
 end;
 ExitThread(0);
end.


Eraser   (2006-09-15 21:54:00) [62]

вот ссылка на exe'шник.
http://slil.ru/23126894(176 КБ)


Eraser   (2006-09-15 21:52:00) [63]

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

вот наваял небольшой пример, как можно осуществить сабж с использованием WMI.

program ProcessWatcher;

{$APPTYPE CONSOLE}

uses
 Windows,
 SysUtils, Classes, WbemScripting_TLB, ActiveX, JwaWbemCli;

var
 SWbemLocator1: TSWbemLocator;
 csSync: _RTL_CRITICAL_SECTION;

type
 TCreateProcThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;
 TStopProcThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
 end;

{ TCreateProcThread }

procedure TCreateProcThread.Execute;
var
 Service: ISWbemServices;
 Eventquery: ISWbemEventSource;
 objLatestProcess: ISWbemObject;
 Prop: OleVariant;
begin
 CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
 Service := SWbemLocator1.ConnectServer('.',
   'root\cimv2',
   '', '',
   '',
   '', 0, nil);
 Eventquery := Service.ExecNotificationQuery(
   'select * from __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA ''Win32_Process''',
   'WQL',
   WBEM_FLAG_RETURN_IMMEDIATELY or WBEM_FLAG_FORWARD_ONLY, nil);
 while not Terminated do
 begin
   objLatestProcess := Eventquery.NextEvent(Integer(INFINITE));
   Prop := objLatestProcess;
   EnterCriticalSection(csSync);
   Writeln('Started: ' + Prop.TargetInstance.Name + #09#09 + DateTimeToStr(Now));
   LeaveCriticalSection(csSync);
 end;
end;

{ TStopProcThread }

procedure TStopProcThread.Execute;
var
 Service: ISWbemServices;
 Eventquery: ISWbemEventSource;
 objLatestProcess: ISWbemObject;
 Prop: OleVariant;
begin
 CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
 Service := SWbemLocator1.ConnectServer('.',
   'root\cimv2',
   '', '',
   '',
   '', 0, nil);
 Eventquery := Service.ExecNotificationQuery(
   'select * from __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA ''Win32_Process''',
   'WQL',
   WBEM_FLAG_RETURN_IMMEDIATELY or WBEM_FLAG_FORWARD_ONLY, nil);
 while not Terminated do
 begin
   objLatestProcess := Eventquery.NextEvent(Integer(INFINITE));
   Prop := objLatestProcess;
   EnterCriticalSection(csSync);
   Writeln('Stoped: ' + Prop.TargetInstance.Name + #09#09 + DateTimeToStr(Now));
   LeaveCriticalSection(csSync);
 end;
end;

begin
 InitializeCriticalSection(csSync);
 Writeln('Process name'#09#09#09'Event date');
 CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
 SWbemLocator1 := TSWbemLocator.Create(nil);
 try
   TCreateProcThread.Create(false);
   TStopProcThread.Create(false);
   while True do
     Sleep(1);
 finally
   SWbemLocator1.Free;
 end;
end.

только учтите, что прежде чем компилировать этот проект, необходимо импортировать и установить следующие библиотеки типов: Active DS Type Library (Version 1.0) и Microsoft WMI Scripting v1.1 Library (Version 1.1).
подробнее об этом в статье о WMI, которая есть на Королевстве Делфи.


Ketmar   (2006-09-15 20:37:00) [64]

ой... опечаточка... "проверить", конечно же. %-)


Ketmar   (2006-09-15 20:36:00) [65]

> [63] Nemec ©   (15.09.06 20:09)
да очень просто. попытаться и просерить -- получилось или нет.


Nemec   (2006-09-15 20:09:00) [66]

>xShadow
Если есть время скажи свое мнение!!! ПОЖАЛУЙСТА!!!
Это пока просто идея без конкретной работы. Пока проблема, как определить в какие процессы можно внедряться.

EXE
<>
{ Идея xShadow
библиотека advApiHook Ms-Rem (Ms-Rem@yandex.ru) ICQ 286370715
}
program SecretKlient;

uses
 Windows, SysUtils,
 tlHelp32, psApi,
 advApiHook;

var
 sFile: DWord;
 Size: DWord;
 Buff: pointer;
 BytesReaded: DWord;

 HandlerSnapshot, HandlerProc: Thandle;
 Data: tagPROCESSENTRY32;
 Process: DWord;

 S, Path: String;
 BufPatch: Array [0..255] Of Char;
begin
 //Получить список процессов
 HandlerSnapshot:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
 Data.dwSize:=sizeOf(data);
 If HandlerSnapshot>0
 then
 begin
   If Process32First(HandlerSnapshot, Data)
   then
   begin
     Repeat
       S:=Trim(ansiLowerCase(Data.szExeFile));
       HandlerProc:=OpenProcess(PROCESS_ALL_ACCESS,True,Data.th32ProcessID);
       GetModuleFileNameEx(HandlerProc,0,BufPatch,256);
       Path:=ansiLowerCase(BufPatch);
       if (Path<>'')and(Path[1]<>'?')
       then
         Path:=ExtractFileDir(Path)
       else
         Path:='';
       S:=ExtractFileName(S);
       If Path <> ''
       Then
       begin
         //Ставим секрет
         Process:=GetProcessId(PChar(S));
         EnableDebugPrivilege();
         Process := OpenProcessEx(Process);
         //считываем Dll в память
         sFile := CreateFile('TestDll.dll', GENERIC_READ, FILE_SHARE_READ,
                     nil, OPEN_EXISTING, 0, 0);
         Size := GetFileSize(sFile, nil);
         GetMem(Buff, Size);
         ReadFile(sFile, Buff^, Size, BytesReaded, nil);
         CloseHandle(sFile);

         InjectDllEx(Process, Buff);
         FreeMem(Buff);
       end;
     until not Process32Next(HandlerSnapshot,Data);
   end;
   CloseHandle(HandlerSnapshot);
 end;

end.
<>

DLL
<>
{
Dll для демонстрации методов Dll Injection.
Copyright by Ms-Rem (Ms-Rem@yandex.ru) ICQ 286370715
}
library TestDll;

uses
 windows;
Var
 F: Boolean;
begin
 F:=False;
 While Not F do
 begin
   MessageBoxA(0, 'Работает!', 'Dll Injection', 0);
   Sleep (5000);
 end;
 ExitThread(0);
end.<>


Nemec   (2006-09-15 12:43:00) [67]

>Игорь Шевченко
Я Вас понимаю и абсолютно с Вами согласен!!!, Но как вегда есть, НО. Выше по форуму я объяснял, почему у посетителей права админов!!!


Игорь Шевченко   (2006-09-15 11:47:00) [68]


> У пользователей права админов, чтобы могли сами ставить
> любой софт по сети.


Отобрать


Nemec   (2006-09-15 11:44:00) [69]

>Elen
Спасибо! Идея интерсная, попробую!


Nemec   (2006-09-15 11:39:00) [70]

>xShadow
Спасибо!
Но ведь есть тот же Word, Excel и т.д. может так, если файл лежит в системной папке например System32 тогда пропускать!


Elen   (2006-09-15 11:35:00) [71]


>  перебрать все запущенные процессы

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


xShadow   (2006-09-15 09:34:00) [72]


> Nemec ©

Для простоты пропиши имена, но для надёжности, что это продукт MS можно проверять версия экзешника на диске. Т.е. нашёл в списке процессов к примеру csrss.exe определил путь получил версию и производителя, если MS пропустил.


Nemec   (2006-09-15 08:41:00) [73]

С конкретной реализацией задачи проблем нет, в инете достаточно документации по этому вопросу, так если иногда ссылку скинете, что бы не искать, для экономии времени, но я действительно ПРОШУ мастеров помощь в постановке задачи, чтобы не отрабатывать тупиковые ветки, если из этого что-нибудь получится я думаю многие администраторы скажут ВАМ спасибо, потому что такая проблема возникает часто.


Nemec   (2006-09-15 08:36:00) [74]

>xShadow
Есть ли какой либо способ определить, можно внедрять код в запущенный процесс или нет или просто в проге жестко прошить, что в такие-то процессы лезть нельзя.

>Игорь Шевченко ©   (14.09.06 17:37) [54]
Просто этот процесс всегда работает на компьютере и его вроде как нельзя снять.
Идея такова, в момент запуска клиента, перебрать все запущенные процессы, и внедрить в них код (опрос клиента, если клиент выключен, то либо запускать его, либо выключать комп, предварительно послав сообщение на сервер), при запуске любого нового клиента перехватывать создание потока и внедрять в него тот же код, тогда стандартными средствами клиента будет не снять, библиотека MS REM позволяет достаточно безопасно внедрить код в процесс, что бы его не перехватили. Можно также по таймеру опрашивать все запущенные процессы, и если есть новые (в которые код не внедрен, на случай перехвата), то внедрять.

PS. Я конечно небольшой специалист в этой области, только начал заниматься, но мне кажется, что снять такого клиента будет достаточно сложно. Хотя может я и ошибаюсь. Во всяком случае вряд ли кто-то будет писать прогу под каждый отдельный случай, а так как исходник и идея будут выложены, то вариаций на эту тему можно будет придумать достаточно много.
Всем спасибо!


Игорь Шевченко   (2006-09-14 17:37:00) [75]


> В блокнот нет проблем, но вот 'csrss.exe' (он всегда запущен
> на компе) ни в какую! Подскажите, если сможете!


А зачем что-то внедрять в csrss ?


Ketmar   (2006-09-14 17:32:00) [76]

> [52] xShadow ©   (14.09.06 17:15)
да снимается эта "защита" так же, как и ставится. %-) вопрос только -- зачем в эти процессы лезть? ничего супернужного (в данном случае) там нет. %-)


xShadow   (2006-09-14 17:15:00) [77]


> Nemec ©

В XP SP2 в эти программы (csrss,smss) не влезть, защита DEP (хотя с разного рода извратом и туда влезть можно).
Странно что ещё приложение не падает.


> зыж xShadow -- ты не тот ли xShadow, который с руткит.ком
> и автор Vanquish? %-)

Нет на рутките меня по другому зовут ;) это моё тёзка


Elen   (2006-09-14 12:55:00) [78]


> Nemec ©

С чего ты взял что в csrss не внедряется?


Nemec   (2006-09-14 12:17:00) [79]

>xShadow, Ketmar
Вопрос - во все ли запущенные процессы можно внедрять DLL, я использовал библиотеку MS REM,
{
Äåìîíñòðàöèÿ âíåäðåíèÿ Dll àëüòåðíàòèâíû&# 236; ñïîñîáîì.
Copyright by Ms-Rem (Ms-Rem@yandex.ru) ICQ 286370715
}
program aInjectDllEx;

uses
 Windows,
 advApiHook;
 
var
 sFile: dword;
 Size: dword;
 Buff: pointer;
 BytesReaded: dword;
 Process: dword;
begin
 //Îòêðûâàåì ïðîöåññ
 Process:=GetProcessId('notepad.exe');
 {Process:=GetProcessId('csrss.exe');}
 EnableDebugPrivilege();
 Process := OpenProcessEx(Process);

 //ñ÷èòûâàåì Dll â ïàìÿòü
 sFile := CreateFile('TestDll.dll', GENERIC_READ, FILE_SHARE_READ,
                     nil, OPEN_EXISTING, 0, 0);
 Size := GetFileSize(sFile, nil);
 GetMem(Buff, Size);
 ReadFile(sFile, Buff^, Size, BytesReaded, nil);
 CloseHandle(sFile);

 Sleep(2000);

 InjectDllEx(Process, Buff);
 FreeMem(Buff);
end.
В блокнот нет проблем, но вот 'csrss.exe' (он всегда запущен на компе) ни в какую! Подскажите, если сможете!
Заранее спасибо!


Nemec   (2006-09-13 18:07:00) [80]

>vidiv
Исходя из теории защиты данных и криптографии НЕЛЬЗЯ 100% ЗАЩИТИТЬ ДАННЫЕ, поэтому задача сделать так, чтобы РАСХОДЫ НА ВЗЛОМ ПРЕВЫШАЛИ ПРИБЫЛЬ ПОЛУЧЕННУЮ ОТ ВЗЛОМА!!!
>DeadMeat ©   (13.09.06 12:33) [47]
1.В том и дело, что если самому все ставить, то учитывая проходимость и
  запросы посетителей администратор центра только и будет, что ставить и
  сносить разный софт. Поэтому у пользователей права админов.
2. Когда мы открыли центр 3 года назад, то узнали интересную вещь - оказывается, что в школе дети изучают компьютер ведя конспект в тетради, они даже Word и  Excel изучают записывая в тетрадь какие кнопки нужно нажимать - БРЕД полный, но факт. Поэтому у нас они учаться грамотно работать с компьютером и поэтому пусть сами учаться ставить и сносить софт, те кто отучился у нас или даже просто играли пока учились в школе и сейчас учаться в вузах,приезжают и говорят спасибо, что хоть чему-то научились.
>xShadow, Ketmar, ph0sgen
Спасибо за проявленный интерес. Попробую опираясь на hook_full.chm (Автор MS REM, надеюсь он будет не против), установив ловушку внедрять поток с диалогом во все создаваемые процессы. Если честно никогда не писал подобного, поэтому что получиться и сколько времени уйдет на отладку не знаю. Интересно, если получиться сделать то что задумано, можно будет написать прогу которая все это снимет, ведь в момент запуска любой проги будет запускаться опрос клиента и если его снять (клиента), то комп будет выключен.


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

Наверх

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