![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно перехватить событие закрытия программы [D7, WinXP]
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, надеюсь он будет не против), установив ловушку внедрять поток с диалогом во все создаваемые процессы. Если честно никогда не писал подобного, поэтому что получиться и сколько времени уйдет на отладку не знаю. Интересно, если получиться сделать то что задумано, можно будет написать прогу которая все это снимет, ведь в момент запуска любой проги будет запускаться опрос клиента и если его снять (клиента), то комп будет выключен.