Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отследить запуск нового процесса? 
:(
    Опции темы
COOLHack
Дата 2.5.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



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

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

Дак каким образом можно отследить запуск процесса, как можно быстрее, чтоб процесс неуспел ничего сделать?  

Это сообщение отредактировал(а) COOLHack - 2.5.2009, 15:07
PM MAIL   Вверх
MetalFan
Дата 2.5.2009, 16:17 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



самое надежное - писать драйвер. остальное - игрушки. имхо

Это сообщение отредактировал(а) MetalFan - 2.5.2009, 16:17


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bartram
Дата 2.5.2009, 19:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



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


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
COOLHack
Дата 2.5.2009, 19:42 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



А где можно найти информацию о том, как написать этот самый драйвер?
PM MAIL   Вверх
COOLHack
Дата 2.5.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



или возможно есть готовые решения данной проблемы? Я поискал - не нашел
PM MAIL   Вверх
bartram
Дата 3.5.2009, 09:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



Цитата(COOLHack @  2.5.2009,  21:42 Найти цитируемый пост)
А где можно найти информацию о том, как написать этот самый драйвер? 

Драйвера Windows режима ядра


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
COOLHack
Дата 4.5.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



Вот руководствуясь статьей я сделал драйвер который ещё ничего полезного не умеет делать.  

Как сделать чтоб он узновал о появлении нового процесса и сообщал моей программе?

Это сообщение отредактировал(а) COOLHack - 4.5.2009, 23:05
PM MAIL   Вверх
Riply
Дата 5.5.2009, 01:15 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(COOLHack @  4.5.2009,  22:55 Найти цитируемый пост)
Вот руководствуясь статьей я сделал драйвер который ещё ничего полезного не умеет делать.  


В смысле скомпилировал код, который прилагается ?

Цитата(COOLHack @  4.5.2009,  22:55 Найти цитируемый пост)
Как сделать чтоб он узновал о появлении нового процесса и сообщал моей программе?


Например, можно использовать PsSetCreateProcessNotifyRoutine
PM MAIL   Вверх
COOLHack
Дата 5.5.2009, 15:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



А пример использования можете показать? 
PM MAIL   Вверх
Riply
Дата 5.5.2009, 21:13 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(COOLHack @  5.5.2009,  15:09 Найти цитируемый пост)
А пример использования можете показать?  

Я не от "нечего делать" задала вопрос
Цитата(Riply @  5.5.2009,  01:15 Найти цитируемый пост)
В смысле скомпилировал код, который прилагается ?

но ты его проигнорировал.
Это была не насмешка. Дело в том, что это в Delphi можно
легко привести пример кода, ибо исходно у всех одинаковое "окружение".
При разработке драйвера под Delphi, это не совсем так.
Например, у одного одни System и SysInit, у другого - другие.
А с переводом DDK, тут вообще жуть, ибо у каждого свой собственнолапный.
Может, конечно и есть "универсальный, единый для всех" но я его не видела.
А те что встречала, мне, мягко говоря, не очень понравились smile
Соответственно, код, работающий у меня, у тебя может приводить к BSOD.

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

Ну да ладно. Это была так, прелюдия smile
Перейдем к делу:
1. Открываем MSDN и находим:

NTSTATUS  PsSetCreateProcessNotifyRoutine(
    IN PCREATE_PROCESS_NOTIFY_ROUTINE  NotifyRoutine,   IN BOOLEAN  Remove);
Parameters
NotifyRoutine 
Specifies the entry point of a caller-supplied process-creation callback routine. 
Remove 
Indicates whether the routine specified by NotifyRoutine should be added to or removed from the system's 
list of notification routines. If FALSE, the specified routine is added to the list. If TRUE, 
the specified routine is removed from the list.


2. Со вторым параметром все ясно. Смотрим определение PCREATE_PROCESS_NOTIFY_ROUTINE:

Highest-level drivers can call PsSetCreateProcessNotifyRoutine to set up their process-creation notify routines, 
declared as follows:
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE) (
    IN HANDLE  ParentId,   IN HANDLE  ProcessId,  IN BOOLEAN  Create);


Далее там идет подробное описание параметров. Я его уж не буду сюда копи-пастить. Хорошо ? smile

3. Глядя на все это, пишем свою реализацию (например, что-то такого типа):
Код

procedure CreateProcessNotyfy(const ParentId: THANDLE; const ProcessId: THANDLE; IsCreate: BOOLEAN); stdcall;
var
 RetStatus: NTSTATUS;
begin
 if IsCreate then
  begin
   RetStatus := Наша_Реакция_На Создание_Процесса(ParentId, ProcessId);
   Log_WriteW('CreateProcessNotyfy', 'CreateProcess', RetStatus, ParentId, ProcessId);
  end
 else Log_WriteW('CreateProcessNotyfy', 'RemoveProcess', STATUS_SUCCESS, ParentId, ProcessId);
end;

4. Где-то, например при загрузке драйвера, вызываем
   PsSetCreateProcessNotifyRoutine(CreateProcessNotyfy, False),
   соответственно при выгрузке PsSetCreateProcessNotifyRoutine(CreateProcessNotyfy, True);

А теперь, скажи мне на милость, какой из этих пунктов, ты не сумел сделать, как не старался ?
Посмотреть в MSDN ? Т.е. не царское это дело, за тебя другие сделают ?
Или написать несколько простейших строчек кода ? 
Тогда может ты рановато приступил к работе с драйверами ?

Мое IHMO, что "задавание вопросов на форуме", подразумевает совместную работу в поиске решения
спрашивающего и отвечающего, а совсем не выполнение работы одним за другого.


Это сообщение отредактировал(а) Riply - 5.5.2009, 21:20
PM MAIL   Вверх
COOLHack
Дата 5.5.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



Цитата

А теперь, скажи мне на милость, какой из этих пунктов, ты не сумел сделать, как не старался ?
Посмотреть в MSDN ? Т.е. не царское это дело, за тебя другие сделают ?
Или написать несколько простейших строчек кода ? 
Тогда может ты рановато приступил к работе с драйверами ?

По большому счёту я не знал что делать

Цитата

Мое IHMO, что "задавание вопросов на форуме", подразумевает совместную работу в поиске решения
спрашивающего и отвечающего, а совсем не выполнение работы одним за другого.

Полностью согласен с тобой



В место "Наша_Реакция_На Создание_Процесса" нужно вписать имя какой-то функции? 
Когда я вставляю в код 
Код

procedure CreateProcessNotyfy(const ParentId: THANDLE; const ProcessId: THANDLE; IsCreate: BOOLEAN); stdcall;
var
 RetStatus: NTSTATUS;
begin
 if IsCreate then
  begin
   RetStatus := Наша_Реакция_На Создание_Процесса(ParentId, ProcessId);
   Log_WriteW('CreateProcessNotyfy', 'CreateProcess', RetStatus, ParentId, ProcessId);
  end
 else Log_WriteW('CreateProcessNotyfy', 'RemoveProcess', STATUS_SUCCESS, ParentId, ProcessId);
end;

то у меня даже не компилируется. Строку 
RetStatus := Наша_Реакция_На Создание_Процесса(ParentId, ProcessId); 
пробывал коментировать.
PM MAIL   Вверх
Riply
Дата 6.5.2009, 00:04 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(COOLHack @  5.5.2009,  22:41 Найти цитируемый пост)
то у меня даже не компилируется. Строку 
RetStatus := Наша_Реакция_На Создание_Процесса(ParentId, ProcessId); 


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

P.S.
 Log_WriteW тоже "не проскочит". Я не помню как называется функция логирования у ama_kid`а.

P.P.S.
 Позволю себе, дать тебе дружеский совет:
 бросай работу с драйвером, и садись за хорошие книжки по программированию и основам программирования.
 Попробуй написать какую-нибудь программу сам (а не скопи-пастить код).
 Например, по обмену информацией между процессами.
 Потом можно будет и продолжить разговор, но уже на другом уровне.
 
PM MAIL   Вверх
COOLHack
Дата 6.5.2009, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



Цитата

И не скомпилится. Вместо нее должна быть твоя функция,

знаю, коментировал строку. 

А вот на Log_WriteW  внимания не обратил

Это сообщение отредактировал(а) COOLHack - 6.5.2009, 00:25
PM MAIL   Вверх
Riply
Дата 6.5.2009, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(Riply @  6.5.2009,  00:04 Найти цитируемый пост)
Попробуй написать какую-нибудь программу сам (а не скопи-пастить код).
 Например, по обмену информацией между процессами.


Кстати, у Рихтера хорошо описана технология перехвата API ф-ий.
С ее помощю можно отслеживать создание новых процессов.
PM MAIL   Вверх
COOLHack
Дата 6.5.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 281
Регистрация: 8.2.2008

Репутация: -1
Всего: 0



а если оставить только это: 

Код

procedure CreateProcessNotyfy(const ParentId: THANDLE; const ProcessId: THANDLE; IsCreate: BOOLEAN); stdcall;
var
 RetStatus: NTSTATUS;
begin
 if IsCreate then
  begin

  end
 else begin

end;
end;

то нормально компилируется.

но допустим теперь необходимо заморозить процесс, из обычного приложения я делал это так: 
http://forum.vingrad.ru/topic-43506.html 

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




Это сообщение отредактировал(а) COOLHack - 6.5.2009, 00:48
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.