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

Вниз

Закрытие процесса   Найти похожие ветки 

 
Alex870   (2005-06-21 13:46) [0]

Подскажите пожалуйста, можно ли перехватить закрытие процесса моего приложения, выполнить какие-либо действия, а потом завершить процесс. Приложение у меня без формы:
program MyProg;
uses
Windows, messages;

var
M : tagMSG;

begin
while GetMessage( M, HInstance, 0, 0) do
   begin
    TranslateMessage(M);
    DispatchMessage(M);
   end;
end.

Если нет, подскажите, может создание формы поможет? Спасибо


 
kaZaNoVa ©   (2005-06-21 13:51) [1]

если закрывают методом TerminateProcess   или внедрением + Halt() то никак:(


 
kaZaNoVa ©   (2005-06-21 13:52) [2]

хотя ..  я не понял, он у тя с окном?


 
Игорь Шевченко ©   (2005-06-21 14:01) [3]


> можно ли перехватить закрытие процесса моего приложения,
> выполнить какие-либо действия, а потом завершить процесс


Если приложение с окном, то Task Manager при снятии приложения посылает окну WM_CLOSE, иначе никак.


 
Alex870   (2005-06-21 14:14) [4]

Окно создать не проблема, если это нужно для решения данной задачи, только оно должно быть невидимым. Я написал так
program ati2evxx;

uses
Windows, messages;

var
M : tagMSG;
wc : WndClass;
wndMain : HWND;

function WindowProc(wnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT; stdcall;
begin
case msg of
WM_CLOSE : beep(100,100);
WM_DESTROY :
 begin
   postquitmessage(0);
   Result:=0;
   exit;
 end; else Result:=DefWindowProc(wnd,msg,wParam,lParam);
end;
end;

begin
wc.style:=CS_HREDRAW or CS_VREDRAW;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,IDI_APPLICATION);
wc.hCursor:=LoadCursor(0,IDC_ARROW);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="Main";
RegisterClass(wc);
wndMain:=CreateWindow("Main","",ws_overlappedwindow,10,10,100,100,0,0,hInstance,nil);
while GetMessage( M, 0, 0, 0) do
   begin
    TranslateMessage(M);
    DispatchMessage(M);
   end;
end.

Но результатов (положительных) не получил.


 
kaZaNoVa ©   (2005-06-21 14:58) [5]

Удалено модератором
Примечание: Offtopic


 
MS-REM   (2005-06-21 15:16) [6]

Есть решение.

Если ID процесса перевести в нуль или ниже нуля.


 
Игорь Шевченко ©   (2005-06-21 15:18) [7]

MS-REM   (21.06.05 15:16) [6]


> Если ID процесса перевести в нуль или ниже нуля.


С этого места подробнее, про секретный прибор, о котором не знали физики.


 
Alex870   (2005-06-21 15:24) [8]


> MS-REM


> Если ID процесса перевести в нуль или ниже нуля.

Не могли бы пояснить, что значит ID процесса перевести в нуль, и что это даст.

> kaZaNoVa ©   (21.06.05 14:58) [5]

Мысль хорошая, но как запасной вариант, если не найду, как реализовать в одном приложении, однако большое спасибо!


 
MS-REM   (2005-06-21 15:32) [9]

Игорь Шевченко ©   (21.06.05 15:18) [7]
С этого места подробнее, про секретный прибор,
о котором не знали физики.

http://wasm.ru/article.php?article=apihook_3

Причем здесь физики.


 
kaZaNoVa ©   (2005-06-21 15:33) [10]

MS-REM   (21.06.05 15:16) [6]
ID процесса не может быть равно 0 .. возможно Вы намекаете на "подмену" ID ? имхо это неприемлимо в норимальных задачах :)


 
Игорь Шевченко ©   (2005-06-21 15:41) [11]

MS-REM   (21.06.05 15:32) [9]

Эта...долго читал, нифига не понял, где там слово "подмена ID процесса на 0 или меньше нуля"...А главное, зачем эта подмена нужна.

"Народ требует разъяснений"


 
MS-REM   (2005-06-21 15:56) [12]

Прилагаются примеры на DELPHI (Снизу статьй)
там есть пример.


 
Игорь Шевченко ©   (2005-06-21 16:03) [13]

MS-REM   (21.06.05 15:56) [12]

А...я понял. Дети Ивана Кулибина вышли на волю.

Мой совет - вместо того, чтобы заниматься различного рода ерундой, аналогичной рассмотренной в указанной статье и примерам к ней, лучше что-нибудь дельное напиши.

А от таких скрывальщиков процессов существует раскрывальщик и не один.


 
MS-REM   (2005-06-21 16:20) [14]

> Игорь Шевченко

Прочти внимательнно.


 
Игорь Шевченко ©   (2005-06-21 16:35) [15]

MS-REM   (21.06.05 16:20) [14]

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


 
Alex870   (2005-06-21 16:55) [16]


> А...я понял. Дети Ивана Кулибина вышли на волю.

10 баллов! (не за красоту, а за смысл). Однако мне лично статья показалась познавательной, так как мои знания еще далеки до MS-REM"a и до Ваших, однако применять такие вещи мне кажется  опасным, что подтверждает и автор статьи, хотя и не всегда явно. Одно я понял наверняка - кроме перехвата TerminateProcess выхода другого нет, ну или то, что предложил kaZaNoVa © в [5]. Всем огромное спасибо! Если у кого есть еще решения - буду очень признателен.


 
Игорь Шевченко ©   (2005-06-21 17:34) [17]

Alex870   (21.06.05 16:55) [16]

Вот если не секрет, какой смысл при завершении процесса выполнять некоторые действия ? Может, какой другой способ есть решить задачу ?

"Не все прямые дороги ведут к цели, то, что нельзя сделать шилом, можно штопором".


 
MS-MEN ©   (2005-06-21 19:52) [18]

Ну, во-первых, все, что относится к системе, если считать
низкокого уровня программирование то везде надо иметь
Админовские привилигие иначе не как.

Во - вторых там есть модуль, который также может работать
с нулевым кольцом (Без драйвера) и кстати тоже надо иметь
привилигие Админа, но этот вопрос уже решен.

Вот маленький переделанный код.

program Protection;

{$APPTYPE CONSOLE}

uses
 Windows,
 Ring0;

Var
MyPid:THandle; //  Текущий процесс.

begin
 InitialzeRing0Library(CALL_GATE); //  Переходим в  нулевое кольцо (Без драйвера)
 MyPid := GetCurrentProcessId(); // Берем текущий PID
 ChangeProcessName(MyPid, "System");  // Переименуем как системный
 ChangeProcessId(MyPid,0); // Также и PID укажем системный
 FreeRing0Library(); // Выгружаемся из нулевого кольца
end.

А  теперь попробуй удалить его из системы

Не помишает также скрыть сам файл или даже папку
это тоже возможно с помощью перехвата.

Пойщю может скину код для скрытия файлов/папок.


 
MS-MEN ©   (2005-06-21 19:55) [19]

Я запутался измените эту строку
ChangeProcessId(MyPid,0); // Также и PID укажем системный
на эту
ChangeProcessId(MyPid,4); // Также и PID укажем системный


 
kaZaNoVa ©   (2005-06-21 20:00) [20]

MS-MEN ©   (21.06.05 19:55) [19]
фантастика ... :)))
сейчас попробую:)


 
MS-MEN ©   (2005-06-21 20:02) [21]

Вообще надо иметь привилигие системы но к сожалению это возможно
только с помощью Драйвера, хотя и из нулевого кольца тоже возможно

Что я показал, не обращайте сильного внимание, так как это
и - за не правильного обращение к системному процессу может
вызвать BSOD (Синие окно).


 
kaZaNoVa ©   (2005-06-21 20:06) [22]

MS-MEN ©   (21.06.05 20:02) [21]
у меня вылетает на CallRing0, права админа...


 
MS-MEN ©   (2005-06-21 20:09) [23]

Например

Если в конце поставить Readln то процесс будет в бездействий  это будет, отложатся не только в диспетчере задач, а также во всей системе а если вы установите, например Repeat Until … то система пойдет в BSOD также отразится во всей системе, так как REPEAT и UNTIL используют ф-ций API, так как в драйвере запрещается использовать ф-ций WinAPI только NativeAPI (Их также можно использовать и в в третем кольце.


 
MS-MEN ©   (2005-06-21 20:14) [24]

>kaZaNoVa
 >у меня вылетает на CallRing0, права админа...

Это говорит о том что у тебя SP2 или 2003 попробуй получить  привилигию DEBUG
если не поможет тебе надо использовать системною привилигию DEBUG.


 
kaZaNoVa ©   (2005-06-21 20:15) [25]

MS-MEN ©   (21.06.05 20:09) [23]
проблема в данных типа:

case Version.dwBuildNumber of
2195 : begin // Windows 2000
        UndocData.ActivePsListOffset := $0A0;
        UndocData.PidOffset          := $09C;
        UndocData.NameOffset         := $1FC;
        UndocData.ppIdOffset         := $1C8;
        UndocData.ImgNameOffset      := $000;
       end;


для Windows 2003 Server - не подскажите что туда вписать?


 
kaZaNoVa ©   (2005-06-21 20:25) [26]

в Windows 2000 SP4, запущенной на VMware программа [18] тоже вылетает:( (Runtime Error 216)


 
kaZaNoVa ©   (2005-06-21 20:26) [27]

но иногда вылетает BSOD   :(


 
kaZaNoVa ©   (2005-06-22 01:22) [28]

MS-MEN ©   (21.06.05 20:14) [24]
DEBUG не помогла:(


 
MS-MEN ©   (2005-06-22 09:10) [29]

С драйвером?
Вместо CALL_GATE поставь DRIVER_GATE


 
Alex870   (2005-06-22 09:41) [30]


> Игорь Шевченко
>
> Вот если не секрет, какой смысл при завершении процесса
> выполнять некоторые действия ? Может, какой другой способ
> есть решить задачу ?


Конечно не секрет, извиняюсь, что сразу не описал. Моя программа должна следить за трафиком на определенной машине (НЕ сервере). Есть конечно много готовых (DUMeter, TMeter...), но они меня не устраивают, ведь после перезагрузки или смены пользователя они начинают считать трафик заново, а моя прога именно этот случай и должна отлавливать, и сохранять в файл время и значения in,out трафика на это время, а так же аккаунт (user name) пользователя.


 
Digitman ©   (2005-06-22 09:48) [31]


> Alex870   (22.06.05 09:41) [30]


а не проще ли написать свою собственную программу (сервис) для мониторинга траффика и ведения статистики ? не такое уж и сложное это дело


 
Alex870   (2005-06-22 10:00) [32]


> а не проще ли написать свою собственную программу (сервис)
> для мониторинга траффика и ведения статистики ? не такое
> уж и сложное это дело

Именно об этом я и говорю, может выразился не корректно. Я написал свою программу для подсчета трафика, но мне нужно чтобы она записывала событие в файл, когда её пытаются остановить, кто это делает и в какое время, а так же лог по перезагрузкам и сменам аккаунта, т.е. когда программу останавливает система.


 
Digitman ©   (2005-06-22 10:12) [33]


> написал свою программу


сист.сервис надо было писать
и стартовать его с правами системы, а не конкр.юзера
тогда простой смертный юзер не сможет его остановить


 
Игорь Шевченко ©   (2005-06-22 10:18) [34]

MS-MEN ©   (21.06.05 19:52) [18]

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


> Ну, во-первых, все, что относится к системе, если считать
> низкокого уровня программирование то везде надо иметь
> Админовские привилигие иначе не как.


А вот Руссинович с Когсуэллом без них обходятся как-то :)
С чего бы ?


 
alpet ©   (2005-06-22 10:30) [35]

Вообще перевод процесса в отряд системных с помощью кода ориентированного на 0-кольцо, мало чего даст - его все равно можно будет уничтожить (в самом крайнем случае через Reset). Имхо для отслеживания вызовов TerminateProcess и других способов срочной терминации процесса, лучше использовать дополнительный сторожевой процесс, который ничем другим и не будет заниматься только ждать завершение первого:

WaitForSingleObject (hFirstProcess, INFINITE);
OnFirstProcessKilled;

В свою очередь из первого надо будет проверять целостность сторожевого процесса.


 
MS-MEN ©   (2005-06-22 10:30) [36]

> А вот Руссинович с Когсуэллом без них обходятся как-то :)
> С чего бы ?

Например, что именно?
Хотя можно если внедрить в системный процесс свой процесс
Но опять также надо иметь привилиги Debug.

Есть много способов, но во всех способах есть минусы.


 
Alex870   (2005-06-22 10:35) [37]


> тогда простой смертный юзер не сможет его остановить

А как же перезагрузка? Мне нужно чтобы данные о подсчете трафика сохранялись всегда, а при перезагрузке они обнуляются. Пример - Kerio Winroute он пишет в лог время остановки своей службы и кем она была остановлена.


 
MS-MEN ©   (2005-06-22 10:42) [38]

Alex870
Лучший способ это перехватить ф-ций иначе ты даже не сможешь
узнать, что за узер хотел завершить твой процесс.

Перехватывай ф-ций ядра, таким образом, не кто (ламер) не сможет
снять процесс, а также если есть опыт по защите то и профилю
будет лень :)

Это лучший совет (Другого не найдешь)


 
Игорь Шевченко ©   (2005-06-22 10:50) [39]

MS-MEN ©   (22.06.05 10:30) [36]


> Например, что именно?


Например, Process Explorer, показывающий много всего увлекательного без драйверов.

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


 
KosilkA ©   (2005-06-22 11:10) [40]


> Например, Process Explorer, показывающий много всего увлекательного
> без драйверов.

Это от SysInternals который? Если зайти в диспетчер устройств>Вид>Показывать скрытые устройства то можно увидеть "PROCEXP", интересно что это? И с regmon"ом такая-же история=)



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

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

Наверх





Память: 0.57 MB
Время: 0.049 c
11-1104391392
Lars
2004-12-30 10:23
2005.11.20
Pstream.Save2File


2-1130188759
zaN0za
2005-10-25 01:19
2005.11.20
Требуется ваш совет


14-1130596651
raiks
2005-10-29 18:37
2005.11.20
Статическое связывание *.exe, написанного на С++, и DLL, написанн


14-1130307967
stone
2005-10-26 10:26
2005.11.20
Всех москвичей с первым снегом!


3-1129054896
denissoft
2005-10-11 22:21
2005.11.20
Вопрос по написанию компонента, с двумя DataField-ыми





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский