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) 

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


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
Я прошу (как МАСТЕРА) высказать мнение, ЕСТЬ СМЫСЛ РАБОТАТЬ В ЭТОМ НАПРАВЛЕНИИ!!! Или все это снимается (обходится) без проблем.


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

Наверх

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