![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно перехватить событие закрытия программы [D7, WinXP]
Nemec © (2006-09-06 20:49:00)Здравствуйте господа! Пишу программу управления компьютерным классом, компьютер клиента должен работать строго определенное время (оплаченное), на компьютере клиента работает программа управляющая им. У пользователей права админов, чтобы могли сами ставить любой софт по сети. Можно ли как-нибудь перехватить попытку закрытия процесса из Диспетчера задач. Тогда можно будет предпринять определенные действия. Программа работает как сервис и как сервис ее не закроешь, но я бессилен против трех пальцев.
Заранее спасибо.
Eraser (2006-09-16 15:49:00) [41]> [87] Nemec © (16.09.06 15:22)
русской литературы не знаю, к сожалению.. вот http://www.delphikingdom.com/asp/viewitem.asp?catalogid=698
самая лучшая статья на русском с хорошими примерами.
Nemec (2006-09-16 15:22:00) [42]> Eraser
Пока не ругается, даже Norton сам поражается, но молчит, если верить MS-REM метод довольно безопасный, если будет ругаться - это же не вирус, всегда можно отключить.
Не подскажешь ссылку на русское описание WMI, поискал в инете, общие понятия есть, но подробностей на русском не нашел.
>xShadow
С паролем все нормально.
Eraser (2006-09-16 13:18:00) [43]> [83] xShadow © (16.09.06 11:00)
>
> > Eraser
>
> Не плохо, но бывает но. У меня к примеру на ноуте служба
> WMI отключена :) жрёт она не позволительно много.
дык её никода не поздно включить, можно прямо из приложения )
а что касается внедрения, все таки я бы был поосторожнее, а то потом юзерам прийдется долго отвечать на вопрос "Почему это после установки вашей программы, антивирус стал ругаться на все подряд?", эт не из воздуха пример, а из жизни :)
Nemec (2006-09-16 12:40:00) [44]>xShadow
В таком виде работает, пришлось загрузить DLL в память, иначе не взять адрес для InjectDllEx. С DLL понятно, для отладки было неудобно!!!
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
//Ïîëó÷èòü ñïèñîê ïðîöåññîâ
EnableDebugPrivilege();
HandlerSnapshot:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
Data.dwSize:=sizeOf(data);
If HandlerSnapshot>0
then
begin
//ñ÷èòûâàåì 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);
If Process32First(HandlerSnapshot, Data)
then
begin
Repeat
S:=Trim(ansiLowerCase(Data.szExeFile));
HandlerProc:=OpenProcess(PROCESS_ALL_ACCESS,True,Data.th32ProcessID);
if HandlerProc > 0 then
Begin
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
{Åñëè íå òåêóùèé ïðîöåññ, ïîòîìó ÷òî åñëè âíåäðÿòü â òåêóùèé ïðîöåññ îøèáêà çàïèñè ïî àäðåñó 0}
If SLowerCase('SecretKlient.exe')
Then
begin
//Ñòàâèì ñåêðåò
Process:=GetProcessId(PChar(S));
Process := OpenProcessEx(Process);
If Process > 0
Then
InjectDllEx(Process, Buff);
end;
end;
end;
until not Process32Next(HandlerSnapshot,Data);
end;
CloseHandle(HandlerSnapshot);
end;
end.
Кстати сайт по ссылке открывается нерегулярно, в прошлый раз открылся, но при попытке закачки выдал ошибку! Поэтому я вообще не читал.
PS. Подскажи, как быть, сегодня поставил Opera, и теперь на любые действия под своей учетной записью на delphimaster требует пароль, а я его хоть убей не помню, когда заходил на сайт не думал, что долго на нем задержусь.
Nemec (2006-09-16 11:28:00) [45]Удалено модератором
Примечание: Offtopic
xShadow (2006-09-16 11:00:00) [46]
> Eraser
Не плохо, но бывает но. У меня к примеру на ноуте служба WMI отключена :) жрёт она не позволительно много.
> Nemec ©
Вообщем неплохо, но есть недочёты. Видимо недочитал ;) Качай смотри, переделал немного.
http://slil.ru/23128145
Nemec (2006-09-16 09:41:00) [47]>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
//ñ÷èòûâàåì 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);
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 '') //AND (Pos ('system32', Path)=0)
Then
begin
//Ñòàâèì ñåêðåò
If S'secretklient.exe'
Then
begin
Process:=GetProcessId(PChar(S));
EnableDebugPrivilege();
Process := OpenProcessEx(Process);
Try
InjectDllEx(Process, Buff);
Except
End;
end;
end;
until not Process32Next(HandlerSnapshot,Data);
end;
FreeMem(Buff);
end;
CloseHandle(HandlerSnapshot);
end.
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
begin
MessageBox(0, 'Çàêðûëè êëèåíòà!', 'Âíèìàíèå', MB_OK);
end;
Sleep (5000);
end;
ExitThread(0);
end.
>Eraser
Спасибо за подсказку по WMI, то что смог прочитать заинтересовался, но тема большая, требует изучения.
На этом ветку можно закрыть, а то это уже не ветка, а монстр.
Еще раз всем большое СПАСИБО!
Nemec (2006-09-16 07:26:00) [48]>Ketmar
Выдает сообщение об ошибке при попытке записи по адресу 0
Ketmar (2006-09-16 00:01:00) [49]> [76] Eraser © (15.09.06 23:15)
так негламурненько.
> [78] Nemec © (15.09.06 23:18)
я лично имею в виду: "а как определили, что не внедрилось, или что ошибка"?
Nemec (2006-09-15 23:21:00) [50]>Eraser
По WMI ничего не скажу, надо почитать литературу.
Nemec (2006-09-15 23:18:00) [51]>Ketmar
Ты имеешь ввиду If Process=0, но в билиотеке MS-REMa эта функция возвращает 0, если не обнаруживается процесс с указанным именем,
насчет сообщения, на деле на экран вообще ничего не будет выводится, сообщение будет отправляться на сервер, а комп клиента выключаться
а я не мастер, у меня штаны не того цвета. %-)
Я только несколько дней как начал заниматься этой проблемой, поэтому любой совет ВАЖЕН.
Eraser (2006-09-15 23:17:00) [52]что касается user-mode (т.к. сомневаюсь что у автор все таки полезет на низкий уровень) я бы все таки посоветовал WMI, возможности которого иногда просто поражают.
Eraser (2006-09-15 23:15:00) [53]> [75] Ketmar © (15.09.06 23:12)
ну это я и имел ввиду, хотя, опять же, за перехват можем "отхватить" от антивиря, поэтому лучше установить вполне легальный нотификатор запуска процессов, название ф-ии не помню, но тут часто упомянается..
Ketmar (2006-09-15 23:12:00) [54]> [73] Eraser © (15.09.06 23:10)
если KMD, тогда и внедрять ничего не надо. перехватываем native API (который int 2Eh/SYSENTER) -- и всё. %-)
Ketmar (2006-09-15 23:11:00) [55]> [69] Nemec © (15.09.06 23:02)
а я не мастер, у меня штаны не того цвета. %-)
пока у юзеров есть права локальных админов, ни о каких "проблемах" говорить нельзя. у админов нет проблем, есть только кривые руки. %-) см. [70].
> [71] Nemec © (15.09.06 23:07)
ошибка, как всегда, в 17-й строке.
а сообщение написано по-китайски, и потому его привести никак не возможно. понимаю...
Eraser (2006-09-15 23:10:00) [56]> [71] Nemec © (15.09.06 23:07)
внедрять код из пользовательского режима вообще не рекомендуется, тем более во все подряд. Уж лучше написать полноценный kmd и работать на низком уровне, где никто не ругается.
Nemec (2006-09-15 23:09:00) [57]>Eraser
Код выполняется, при попытке закрыть "Notepad.exe". Без перезагрузки у меня не получилось снять, но я не специалист.
Eraser (2006-09-15 23:07:00) [58]> [69] Nemec © (15.09.06 23:02)
чтобы дать хоть какую-то гарантию того, что это не снимается (обходится), нужно, как минимум, выполнить [61].
Nemec (2006-09-15 23:07:00) [59]Остается проблема. Не во все процессы, можно внедрить код, я откинул системные процессы, все равно на некоторых вылазит ошибка. ВОПРОС: в принципе, как нибудь можно определить можно или нельзя внедрять код.
Nemec (2006-09-15 23:02:00) [60]>Eraser
Блин, я только что разобрал, о чем идет речь, когда говорят "руткит" и то не до конца, а тут объекты ActiveX. ПОЧИТАЮ.
>Ketmar
Я прошу (как МАСТЕРА) высказать мнение, ЕСТЬ СМЫСЛ РАБОТАТЬ В ЭТОМ НАПРАВЛЕНИИ!!! Или все это снимается (обходится) без проблем.