![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват процесса.
Igor © (2003-04-03 09:58:00)Задача такая: необходимо ограничить пользователей на число запусков одного процесса, т.е если процесс с таким именем существует выдавать сообщение об этом и пресекать попытку загрузить 2-ой.
Igor (2003-04-03 16:19:00) [1]tnx
Digitman (2003-04-03 14:06:00) [2]
> Igor
Неправильно понял. Ты пишешь приложение, которое при старте внедряет во все существующие процессы код, осуществляющий перехват обращений этих процессов к упомянутой функции.
Когда некий процесс A обратится к упомянутой ф-ции c целью попытки создания процесса B, код, который ты внедрил в этот процесс А, получит управление, если старт B нежелателен, вернет отказ; иначе - вызовет оригинальную (перехваченную) ф-цию, дождется успешного старта процесса и внедрит в него копию кода перехвата.
внедрение кода - см. ф-ции VirtualQueryEx, VirtualProtectEx, WriteProcessMemory и т.д.
старт внедренного кода - см. CreateRemoteThread
перехват экспортируемых/импортируемых Win32API-вызовов в теле внедренного кода - см. описание формата PE-модулей
Igor (2003-04-03 12:59:00) [3]>digitman
Если я правильно понял,то: я пишу некое приложение, которое при старте внедряет во все уже сущестующие процессы упомянутую тобой функцию, затем при возникновении нового процесса: если плохой, то отрубать если хороший, то внедрять функцию.
Вопрос: как внедрить? (Пример кода)
Digitman (2003-04-03 12:31:00) [4]>Igor
В подавляющем большинстве случаев новый процесс создается вызовом неким процессом (например, процессом Explorer"a) ф-ции kernel32.CreateProcess[Ex]. Вполне достаточно будет внедрить во все контролируемые (существующие и вновь стартуемые) процессы код перехвата обращения (со стороны этих процессов) к ф-ции CreateProcess[Ex] из kernel32.dll и возвращать отказ, если происходит попытка запуска некоего нежелательного процесса.
Внедрение кода перехвата можно возложить на некое "свое" сервисное приложение, автоматически стартуемое при старте системы.
Igor (2003-04-03 12:08:00) [5]>digitman Можно поподробней?
Digitman (2003-04-03 12:02:00) [6]>Igor
реализуй службу, которая будет (глобально в системе, для всех существующих и потенциально стартуемых) перехватывать все вызовы kernel32.CreateProcess[Ex]
Joisy (2003-04-03 11:54:00) [7]Izvinite za oshibku (vishe).
Ya dumayu chto eto mojno sdelat sled obrazom - periodicheski zapuskay api func EnumWindows, v perviy raz zapomni handle i imya nujnogo okna FindWindow(inHWND, TitleTxt) i elsi obnarujitsya chto poyavilos eshe odno okno s takim je imene posilay yemu SendMessage(HWND, WM_CLOSE, 0, 0)
poeksperemeniruy koroche
a (2003-04-03 11:49:00) [8]Удалено модератором
Примечание: Offtopic
Igor (2003-04-03 10:26:00) [9]имя процесса я задаю (не моя программа)
caesar (2003-04-03 10:19:00) [10]твоего приложения или вообще любого процесса?
Если твоего, то:
if FindWindow("TForm1","Form1")<>0 then Applicatin.Terminate;
перед CreateForm
{подключи модуль Windows}