Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.045 c
2-1173697825
Magedon
2007-03-12 14:10
2007.04.01
Как определить координаты моей иконки в системном трее?


2-1173828969
Fantasy
2007-03-14 02:36
2007.04.01
Странно но факт. помогите понять


15-1172928103
Sergius P
2007-03-03 16:21
2007.04.01
Подсчет трафика


2-1173581119
eXPell
2007-03-11 05:45
2007.04.01
Опять картинки...


6-1160740746
ISP
2006-10-13 15:59
2007.04.01
Пересылка variant массива по T*Socket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский