Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.01;
Скачать: CL | DM;

Вниз

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

 
Ketmar ©   (2006-09-13 00:33) [40]

всё-таки, лучше руткит. ещё надёжней -- kernel mode driver с перехватчиком и ещё кое-что. это тоже снимается, конечно, но уже с чуть большим трудом. а лучше -- всё-таки не давать юзерам права админов. а то при помощи того же FAR"а и WinLogon пристрелить можно (сам проверял; получилось, к несчастью %-).


 
vidiv ©   (2006-09-13 01:52) [41]

Всеравно убью все что угодно. Последний, самый сложный был нод.
Принцип простой: забираешь права на чтение EXE файла и убивает процесс - в итоге никто его не может заного запустить: отказано в доступе.


 
Ketmar ©   (2006-09-13 01:59) [42]

> [41] vidiv ©   (13.09.06 01:52)
понятно, что пристрелить можно любого. %-) вопрос в сложности сего действа.
в принципе, обладая правами администратора, можно даже в ring0 пролезть (правда, неясно зачем %-). тут вопрос в количестве гемороя -- если хватать "все-все" апи, то задолбёшься писать. и всё равно дырку найдут. %-)


 
Сергей Н.   (2006-09-13 10:08) [43]

Добрый день,
у меня похожая проблема - есть сервис (управление, типа "остановить", "пауза" запрещено), но процесс этого сервиса отображается в диспетчере задач и может быть легко от туда снят :(. Тут писали про антивирусы, но для меня так и осталось непонятным - как процесс сервиса "kavsvc" (антивирус Касперского) не даёт себя убить? Или фаервол Outpost - его процесс тоже просто не снять, сразу выдаётся ошибка "Отказано в доступе"! Скорее всего это обходится (методами описанными выше), но тем не менее непосвящённых это отпугнёт. Как реализовать подобное?


 
xShadow ©   (2006-09-13 10:49) [44]


> Сергей Н.

Для того чтобы обламать большенство менеджеров задач достаточно перехватить OpenProcess только грамотно нужно обрабатывать в своей программе.


 
Сергей Н.   (2006-09-13 11:22) [45]

> xShadow

Подскажите где можно просмотреть пример?


 
Elen ©   (2006-09-13 11:26) [46]


> Сергей Н.

статьи о перехвате функций на лету (Автор MS REM ) в hook_full.chm


 
DeadMeat ©   (2006-09-13 12:33) [47]

А как часто юзеры ставят у себя софт? Может все таки открывать на это время им машину или самому это делать, а потом в зад? ИМХО надежней варианта с правами я не вижу.


 
Ketmar ©   (2006-09-13 13:50) [48]

есть ещё туторы от HolyFather"а, где он в 10 примерах показывает написание драйвера, перехватывающего (в том числе и) ZwTerminateThread(). драйвер даже умеет общаться с user-mode запускалкой. просто, дёшево и сердито.
или, как вариант -- внедрять свою DLL в каждый процесс, где и перехватывать API открытия процесса/завершения процесса (благо, сервис работает с системного аккаунта, и права такие имеет).

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


 
Nemec ©   (2006-09-13 18:07) [49]

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


 
Nemec ©   (2006-09-14 12:17) [50]

>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" (он всегда запущен на компе) ни в какую! Подскажите, если сможете!
Заранее спасибо!


 
Elen ©   (2006-09-14 12:55) [51]


> Nemec ©

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


 
xShadow ©   (2006-09-14 17:15) [52]


> Nemec ©

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


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

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


 
Ketmar ©   (2006-09-14 17:32) [53]

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


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


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


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


 
Nemec ©   (2006-09-15 08:36) [55]

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

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

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


 
Nemec ©   (2006-09-15 08:41) [56]

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


 
xShadow ©   (2006-09-15 09:34) [57]


> Nemec ©

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


 
Elen ©   (2006-09-15 11:35) [58]


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

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


 
Nemec ©   (2006-09-15 11:39) [59]

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


 
Nemec ©   (2006-09-15 11:44) [60]

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


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


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


Отобрать


 
Nemec ©   (2006-09-15 12:43) [62]

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


 
Nemec ©   (2006-09-15 20:09) [63]

>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.<>


 
Ketmar ©   (2006-09-15 20:36) [64]

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


 
Ketmar ©   (2006-09-15 20:37) [65]

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


 
Eraser ©   (2006-09-15 21:52) [66]

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

вот наваял небольшой пример, как можно осуществить сабж с использованием 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, которая есть на Королевстве Делфи.


 
Eraser ©   (2006-09-15 21:54) [67]

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


 
Nemec ©   (2006-09-15 22:57) [68]

>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.


 
Nemec ©   (2006-09-15 23:02) [69]

>Eraser
Блин, я только что разобрал, о чем идет речь, когда говорят "руткит" и то не до конца, а тут объекты ActiveX. ПОЧИТАЮ.

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


 
Eraser ©   (2006-09-15 23:07) [70]

> [69] Nemec ©   (15.09.06 23:02)

чтобы дать хоть какую-то гарантию того, что это не снимается (обходится), нужно, как минимум, выполнить [61].


 
Nemec ©   (2006-09-15 23:07) [71]

Остается проблема. Не во все процессы, можно внедрить код, я откинул системные процессы, все равно на некоторых вылазит ошибка. ВОПРОС: в принципе, как нибудь можно определить можно или нельзя внедрять код.


 
Nemec ©   (2006-09-15 23:09) [72]

>Eraser
Код выполняется, при попытке закрыть "Notepad.exe". Без перезагрузки у меня не получилось снять, но я не специалист.


 
Eraser ©   (2006-09-15 23:10) [73]

> [71] Nemec ©   (15.09.06 23:07)

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


 
Ketmar ©   (2006-09-15 23:11) [74]

> [69] Nemec ©   (15.09.06 23:02)
а я не мастер, у меня штаны не того цвета. %-)

пока у юзеров есть права локальных админов, ни о каких "проблемах" говорить нельзя. у админов нет проблем, есть только кривые руки. %-) см. [70].

> [71] Nemec ©   (15.09.06 23:07)
ошибка, как всегда, в 17-й строке.
а сообщение написано по-китайски, и потому его привести никак не возможно. понимаю...


 
Ketmar ©   (2006-09-15 23:12) [75]

> [73] Eraser ©   (15.09.06 23:10)
если KMD, тогда и внедрять ничего не надо. перехватываем native API (который int 2Eh/SYSENTER) -- и всё. %-)


 
Eraser ©   (2006-09-15 23:15) [76]

> [75] Ketmar ©   (15.09.06 23:12)

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


 
Eraser ©   (2006-09-15 23:17) [77]

что касается user-mode (т.к. сомневаюсь что у автор все таки полезет на низкий уровень) я бы все таки посоветовал WMI, возможности которого иногда просто поражают.


 
Nemec ©   (2006-09-15 23:18) [78]

>Ketmar
Ты имеешь ввиду If Process=0, но в билиотеке MS-REMa эта функция возвращает 0, если не обнаруживается процесс с указанным именем,
насчет сообщения, на деле на экран вообще ничего не будет выводится, сообщение будет отправляться на сервер, а комп клиента выключаться
а я не мастер, у меня штаны не того цвета. %-)
Я только несколько дней как начал заниматься этой проблемой, поэтому любой совет ВАЖЕН.


 
Nemec ©   (2006-09-15 23:21) [79]

>Eraser
По WMI ничего не скажу, надо почитать литературу.


 
Ketmar ©   (2006-09-16 00:01) [80]

> [76] Eraser ©   (15.09.06 23:15)
так негламурненько.

> [78] Nemec ©   (15.09.06 23:18)
я лично имею в виду: "а как определили, что не внедрилось, или что ошибка"?



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2007.04.01;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.063 c
3-1168392288
NovaC
2007-01-10 04:24
2007.04.01
dBaseIV &amp; password


3-1168292568
allrussia
2007-01-09 00:42
2007.04.01
Не открываются базы из Delphi, содержащие символ ";" (semicolon)


11-1140886672
ECM
2006-02-25 19:57
2007.04.01
Новости сайта kolnmck.ru


3-1168271803
makaronX
2007-01-08 18:56
2007.04.01
вставка даты в Access


1-1170675164
Leff
2007-02-05 14:32
2007.04.01
некорректный ClipRect при resize TCustomControl а