![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие процесса [D7, WinXP]
Alex870 © (2005-06-21 13:46:00)Подскажите пожалуйста, можно ли перехватить закрытие процесса моего приложения, выполнить какие-либо действия, а потом завершить процесс. Приложение у меня без формы:
program MyProg;
uses
Windows, messages;
var
M : tagMSG;
begin
while GetMessage( M, HInstance, 0, 0) do
begin
TranslateMessage(M);
DispatchMessage(M);
end;
end.
Если нет, подскажите, может создание формы поможет? Спасибо
alpet (2005-06-22 15:40:00) [41]Игорь Шевченко © (22.06.05 15:20) [49]
Почему повторный запуск? Если у процессов общая секция данных с структурой в которой сформированны некоторые данные, то непредвиденное завершение одно процесса, приведет к тому что второй записав в лог данные также завершится самостоятельно. Другое дело, что это решение не самое лучшее для таких случаев по сравнению с службами.
Alex870 (2005-06-22 15:32:00) [42]
> [35] тебе не поможет, в твоем случае, так как все, что гарантирует
> этот способ - это повторный запуск, а вовсе не перехват
> завершения и выполнение некоторых действий перед завершением
Я же писал, что мне нужно оставить запись в логе при закрытии процесса (время, кем, инфа о трафике). Как ведет логи Kerio Winroute я не знаю, но там это реализовано (хотя winroute это служба).
Игорь Шевченко (2005-06-22 15:20:00) [43]
> Наверно [35] это единственный правильный подход к решению
> проблемы
[35] тебе не поможет, в твоем случае, так как все, что гарантирует этот способ - это повторный запуск, а вовсе не перехват завершения и выполнение некоторых действий перед завершением.
Alex870 (2005-06-22 15:14:00) [44]Спасибо всем!
Наверно [35] это единственный правильный подход к решению проблемы. Я думаю что на этом обсуждение можно закрыть, а то это скоро перейдет в категорию "потрепаться". Еще раз всем спасибо!
BiN (2005-06-22 14:07:00) [45]Alex870 (21.06.05 13:46)
Единственно верный ответ тебе уже дали в [33]. Остальное - от лукавого.
kaZaNoVa (2005-06-22 14:01:00) [46]Игорь Шевченко © (22.06.05 10:50) [39]
> Например, Process Explorer, показывающий много всего
> увлекательного без драйверов.
я когда-то запускал Process Explorer без прав админа, он намного меньше информации показывал:(
(например вкладка Perfomance процесса - вообще нет инфы), имхо вывод - Process Explorer может нормально работать и выдавать всю информацию только с правами админа..
alpet (2005-06-22 13:57:00) [47]А чем вариант в [35] не устраивает? Или мульти-процессный подход сложным кажется? Помоему там единственная сложность - правильная отработка после завершения убитого процесса, которую к тому-же можно упростить, расшарив между процессами регион памяти. Во всяком случае второй процесс в этом случае сможет скинуть в файл данные которые не успел обработать второй процесс и записать в лог о не нормальном завершении.
Игорь Шевченко (2005-06-22 13:50:00) [48]MS-MEN © (22.06.05 11:32) [42]
> Я ещё раз говорю применение драйверов это означает что
> Что над программой работали профессионалы.
Пальцы не гни, ладно ?
А то пишешь слова с ошибками, а пальцы гнешь.
KosilkA © (22.06.05 11:10) [40]
А ты не от администратора запусти. Удивись.
MS-MEN (2005-06-22 11:39:00) [49]> Alex870
> Дело в том, что я бы все-таки хотел отлавливать завершение
> процесса и позволять его завершать, т.е. не делать явную защиту,
> а просто контролировать закрытие программы для ведения лога.
Извини, наверное, не так понял :( Я думал ты собираешься
защитить от завершение.
Тогда можно просто создать маленьки на ASM или API
монитор вот и все.
:) Мозги Игорь Шевченко заморочил тоже мой извинение.
MS-MEN (2005-06-22 11:32:00) [50]> Игорь Шевченко
Это можно и без системных вызовов решить просто надо знать ф-ций.
Например NativeAPI в них 80% ф-ций которые можно использовать
как в третям кольце, так и в нулевом это лишь для WinNT платформ.
А что ты хочешь предложить вместо перехвата? Как ты собираешься
узнать, что процесс завершается методом Terminate Process? А если
на уровне нулевого кольца грохну? То даже перехват Win / Native –API
не помогут.
В - общем, другим способом решить это не возможно.
Я ещё раз говорю применение драйверов это означает что
Что над программой работали профессионалы. (Если это
касается системы) А применение WinAPI или коротко API
это только для третьего кольца.
> kaZaNoVa © (22.06.05 01:22) [28]
> DEBUG не помогла:(
Во-общем последние, что я могу предложить это включить
системною привилигию DEBUFG вот маленький код
который завершает любой процесс с помощью сис. Debug.
{ убивание процесса отладочным методом }
Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then Exit;
//подключаемся к системе отладки и получаем DebugObject
if DbgUiConnectToDbg() <> STATUS_SUCCESS then Exit;
pHandle := OpenProcessEx(ProcessId);
//включаем отладку процесса
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then Exit;
//надо найти полученный DebugObject
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
if (HandlesInfo^.Information[r].ProcessId = myPID) and
(HandlesInfo^.Information[r].ObjectTypeNumber = $8) //DebugObject
then begin
//закрываем DebugObject, что приводит к уничтожению отлаживаемого процесса
CloseHandle(HandlesInfo^.Information[r].Handle);
Result := true;
break;
end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;
Alex870 (2005-06-22 11:29:00) [51]
> Перехватывай ф-ций ядра, таким образом, не кто (ламер) не
> сможет
> снять процесс, а также если есть опыт по защите то и профилю
>
> будет лень :)
Дело в том, что я бы все-таки хотел отлавливать завершение процесса и позволять его завершать, т.е. не делать явную защиту, а просто контролировать закрытие программы для ведения лога.
KosilkA (2005-06-22 11:10:00) [52]
> Например, Process Explorer, показывающий много всего увлекательного
> без драйверов.
Это от SysInternals который? Если зайти в диспетчер устройств>Вид>Показывать скрытые устройства то можно увидеть "PROCEXP", интересно что это? И с regmon'ом такая-же история=)
Игорь Шевченко (2005-06-22 10:50:00) [53]MS-MEN © (22.06.05 10:30) [36]
> Например, что именно?
Например, Process Explorer, показывающий много всего увлекательного без драйверов.
Еще раз - для решения большинства нужных задач ни драйверы, не перехват описанный тобой, нафиг не сдались. Все эти горе-драйверописатели неснимаемых/невидимых процессов занимаются либо полной ерундой для гнутия пальцев, либо откровенным вредительством.
Ни то, ни другое на этом форуме не приветствуется, равно как и рекомендации вырезать гланды через неподходящее для этого процесса отверстие.
MS-MEN (2005-06-22 10:42:00) [54]Alex870
Лучший способ это перехватить ф-ций иначе ты даже не сможешь
узнать, что за узер хотел завершить твой процесс.
Перехватывай ф-ций ядра, таким образом, не кто (ламер) не сможет
снять процесс, а также если есть опыт по защите то и профилю
будет лень :)
Это лучший совет (Другого не найдешь)
Alex870 (2005-06-22 10:35:00) [55]
> тогда простой смертный юзер не сможет его остановить
А как же перезагрузка? Мне нужно чтобы данные о подсчете трафика сохранялись всегда, а при перезагрузке они обнуляются. Пример - Kerio Winroute он пишет в лог время остановки своей службы и кем она была остановлена.
alpet (2005-06-22 10:30:00) [56]Вообще перевод процесса в отряд системных с помощью кода ориентированного на 0-кольцо, мало чего даст - его все равно можно будет уничтожить (в самом крайнем случае через Reset). Имхо для отслеживания вызовов TerminateProcess и других способов срочной терминации процесса, лучше использовать дополнительный сторожевой процесс, который ничем другим и не будет заниматься только ждать завершение первого:
WaitForSingleObject (hFirstProcess, INFINITE);
OnFirstProcessKilled;
В свою очередь из первого надо будет проверять целостность сторожевого процесса.
MS-MEN (2005-06-22 10:30:00) [57]> А вот Руссинович с Когсуэллом без них обходятся как-то :)
> С чего бы ?
Например, что именно?
Хотя можно если внедрить в системный процесс свой процесс
Но опять также надо иметь привилиги Debug.
Есть много способов, но во всех способах есть минусы.
Игорь Шевченко (2005-06-22 10:18:00) [58]MS-MEN © (21.06.05 19:52) [18]
Может эта...прежде чем глючные поделки выкладывать, русский язык подучить ? Слегка так...А то читать не очень удобно.
> Ну, во-первых, все, что относится к системе, если считать
> низкокого уровня программирование то везде надо иметь
> Админовские привилигие иначе не как.
А вот Руссинович с Когсуэллом без них обходятся как-то :)
С чего бы ?
Digitman (2005-06-22 10:12:00) [59]
> написал свою программу
сист.сервис надо было писать
и стартовать его с правами системы, а не конкр.юзера
тогда простой смертный юзер не сможет его остановить
Alex870 (2005-06-22 10:00:00) [60]
> а не проще ли написать свою собственную программу (сервис)
> для мониторинга траффика и ведения статистики ? не такое
> уж и сложное это дело
Именно об этом я и говорю, может выразился не корректно. Я написал свою программу для подсчета трафика, но мне нужно чтобы она записывала событие в файл, когда её пытаются остановить, кто это делает и в какое время, а так же лог по перезагрузкам и сменам аккаунта, т.е. когда программу останавливает система.