Перехват создания программы...
От: Stig  
Дата: 02.09.04 14:50
Оценка:
Я уже задавал этот вопрос, но никто конкретного ничего не написал.
Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук),
хочу перед созданием приложения подключать свою DLL с перехватом CreateFile.
DLL уже готова, для отдельно взятой программы могу подключить, все работает,
но нужно для всех!!!!!!!!!!!
Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего
другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват
создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм.
или ссылку на статью с таким вопросом.
Re: Перехват создания программы...
От: Esperar  
Дата: 02.09.04 15:23
Оценка:
Здравствуйте, Stig, Вы писали:

S>Я уже задавал этот вопрос, но никто конкретного ничего не написал.

S>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук),
S>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile.
S>DLL уже готова, для отдельно взятой программы могу подключить, все работает,
S>но нужно для всех!!!!!!!!!!!
S> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего
S>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват
S>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм.
S>или ссылку на статью с таким вопросом.
Что мешает создать CBT хук
обработчик в первом приближении:

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
if(nCode == HCBT_CREATEWND)
{
CHAR szClassName[256]={0};
int nRet = GetClassName(reinterpret_cast<HWND>(wParam), szClassName, 255);
CHAR szBuf[255]={0};
wsprintf(szBuf, "создалось %s", szClassName);
MessageBox(0, szBuf, "!!!", 0);
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
Re: Перехват создания программы...
От: Геннадий Майко США  
Дата: 02.09.04 19:31
Оценка: 1 (1)
Здравствуйте, Stig, Вы писали:

S>Я уже задавал этот вопрос, но никто конкретного ничего не написал.

S>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук),
S>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile.
S>DLL уже готова, для отдельно взятой программы могу подключить, все работает,
S>но нужно для всех!!!!!!!!!!!
S> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего
S>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват
S>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм.
S>или ссылку на статью с таким вопросом.
--
Можно попробовать использовать kernel-mode функции PsSetLoadImageNotifyRoutine или PsSetCreateProcessNotifyRoutine.

C уважением,
Геннадий Майко.
Re: Перехват создания программы...
От: rus blood Россия  
Дата: 03.09.04 06:53
Оценка: 2 (1)
Здравствуйте, Stig, Вы писали:

S>Я уже задавал этот вопрос, но никто конкретного ничего не написал.

S>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук),
S>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile.
S>DLL уже готова, для отдельно взятой программы могу подключить, все работает,
S>но нужно для всех!!!!!!!!!!!
S> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего
S>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват
S>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм.
S>или ссылку на статью с таким вопросом.

[msdn]
The easiest (and most brutal) approach is to add a dynamic-link library (DLL) name to the following key in the registry:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\ CurrentVersion\Windows\APPINIT_DLLS

This key causes Windows to add your DLL to every process in the system.
[/msdn]
Имею скафандр — готов путешествовать!
Re[2]: Перехват создания программы...
От: Valerio Россия linkedin.com/in/boronin
Дата: 05.09.04 06:44
Оценка:
RB>[msdn]
RB>The easiest (and most brutal) approach is to add a dynamic-link library (DLL) name to the following key in the registry:

RB>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\ CurrentVersion\Windows\APPINIT_DLLS


RB>This key causes Windows to add your DLL to every process in the system.

RB>[/msdn]
И что будете делать с консольными приложениями без user32.dll?
а, вот кстати ссылка по теме
Автор: alexandrov_alex
Дата: 18.08.03
... << RSDN@Home 1.1.4 @@subversion >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: Перехват создания программы...
От: Аноним  
Дата: 06.09.04 01:37
Оценка:
Здравствуйте, Esperar, Вы писали:

E>LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)

E>{
E> if(nCode < 0)
E> return CallNextHookEx(g_hHook, nCode, wParam, lParam);
E> if(nCode == HCBT_CREATEWND)
E> {
E> CHAR szClassName[256]={0};
E> int nRet = GetClassName(reinterpret_cast<HWND>(wParam), szClassName, 255);
E> CHAR szBuf[255]={0};
E> wsprintf(szBuf, "создалось %s", szClassName);
E> MessageBox(0, szBuf, "!!!", 0);
E> }
E> return CallNextHookEx(g_hHook, nCode, wParam, lParam);
E>}

спасибо вам огромное за код.
По этому поводу есть еще пара вопросов, подскажите кто знает...
1)почему я не могу убрать из этого кода вызов MessageBox, как только это делаю
программа начинает ругаться: 'Access violation at address 00000000. Read of address
00000000'
2)как перехватывать открытие только главного окна, не трогая дочерних!!!!!!!!
3)как получить имя EXE'шника(и путь тоже было бы не плохо), есть хендл и имя класса
окна,почему то не могу достать caption, использую GetWindowText//возвращает пустую
строку, вот код:
p.s.:Путь и имя запущеной программы нужны для того что бы, после того как я ее
убью, запустить ее еще раз подгрузив свою DLL

LRESULT CALLBACK CreateWindowHook(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
return CallNextHookEx(CurrentHook, nCode, wParam, lParam);

if(nCode == HCBT_CREATEWND)
{
char WindowClass[128];
char WindowCaption[128];
WindowHandle = reinterpret_cast<HWND>(wParam);
GetClassName(WindowHandle, WindowClass, 128);
GetWindowText(WindowHandle, WindowCaption, 128);

...

CHAR szBuf[255]={0};
wsprintf(szBuf, "CreateWindow is hooked: %s", WindowClass);
MessageBox(0, szBuf, "!!!", 0);

}
return CallNextHookEx(CurrentHook, nCode, wParam, lParam);
}
Re: Перехват создания программы...
От: spanasik  
Дата: 06.09.04 06:04
Оценка:
Привет !

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

Стас
... << RSDN@Home 1.1.4 @@subversion >>
Re[2]: Перехват создания программы...
От: TarasCo  
Дата: 06.09.04 06:27
Оценка: :))
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, Stig, Вы писали:


S>>Я уже задавал этот вопрос, но никто конкретного ничего не написал.

S>>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук),
S>>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile.
S>>DLL уже готова, для отдельно взятой программы могу подключить, все работает,
S>>но нужно для всех!!!!!!!!!!!
S>> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего
S>>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват
S>>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм.
S>>или ссылку на статью с таким вопросом.
ГМ>--
ГМ>Можно попробовать использовать kernel-mode функции PsSetLoadImageNotifyRoutine или PsSetCreateProcessNotifyRoutine.

ГМ>C уважением,

ГМ>Геннадий Майко.

Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .
Да пребудет с тобою сила
Re[3]: Перехват создания программы...
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 06.09.04 06:30
Оценка:
Здравствуйте, TarasCo, Вы писали:

[]

TC>Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .


Да как обычно, с тем и связано. Написали в свое время что-то вроде:

typedef void (WINAPI *PsSetCallbackFunc)(...);

PsSetCallbackFunc psSetHooks[8];

и крутись тут как хочешь теперь
... << RSDN@Home 1.1.3 stable >>
Re[4]: Перехват создания программы...
От: Злость Россия  
Дата: 06.09.04 06:55
Оценка: +1
Здравствуйте, Flamer, Вы писали:

F>Здравствуйте, TarasCo, Вы писали:


F>[]


TC>>Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .


Не я только напомню — что для этого надо писать драйвер

F>Да как обычно, с тем и связано. Написали в свое время что-то вроде:


F>
F>typedef void (WINAPI *PsSetCallbackFunc)(...);

F>PsSetCallbackFunc psSetHooks[8];  
F>

F>и крутись тут как хочешь теперь

Наверное задумка была очень проста — если дать всем свободный инструмент для перехвата создания процессов, то это модет очень плохо сказаться на производительности системы . По этому и ввели ограничение ... радикальный и очень эффективный метод.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[5]: Перехват создания программы...
От: Геннадий Майко США  
Дата: 06.09.04 12:40
Оценка:
Здравствуйте, Злость, Вы писали:

TC>>>Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .


З>Наверное задумка была очень проста — если дать всем свободный инструмент для перехвата создания процессов, то это модет очень плохо сказаться на производительности системы . По этому и ввели ограничение ... радикальный и очень эффективный метод.

--
На моем компьютере, судя по приборам, установлен только один хук.
Интересно было бы узнать, сколько таких хуков установлено на компьютерах уважаемых коллег?

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

C уважением,
Геннадий Майко.
Re[6]: Перехват создания программы...
От: Злость Россия  
Дата: 06.09.04 13:09
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

[skip]

ГМ>На моем компьютере, судя по приборам, установлен только один хук.


Какой именно — если PsSetCreateThreadNotifyRoutine уже много , так как его уже не снять до следующей перезагрузки, это относится и к PsSetLoadImageNotifyRoutine.

ГМ>Интересно было бы узнать, сколько таких хуков установлено на компьютерах уважаемых коллег?


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


Интересный это ресурс получается, который можно захватить... а вот обратно выпустить уже нельзя.


С PsSetCreateProcessNotifyRoutine славо богу все легче ... его можно и освободить. Но все равно как говорится:

МалавоТО!!! Будет!!! малаваТо!
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[7]: Перехват создания программы...
От: TarasCo  
Дата: 06.09.04 13:31
Оценка:
Здравствуйте, Злость, Вы писали:

З>МалавоТО!!! Будет!!! малаваТо!


Поддерживаю
Да пребудет с тобою сила
Re[3]: Перехват создания программы...
От: Stig  
Дата: 06.09.04 15:49
Оценка:
Здравствуйте, Esperar, Вы писали:

Хотелось бы поддержать товарища <Аноним> в его желаниях:

А> По этому поводу есть еще пара вопросов, подскажите кто знает...

А>1)почему я не могу убрать из этого кода вызов MessageBox, как только это делаю
А> программа начинает ругаться: 'Access violation at address 00000000. Read of address
А> 00000000'
А>2)как перехватывать открытие только главного окна, не трогая дочерних!!!!!!!!
А>3)как получить имя EXE'шника(и путь тоже было бы не плохо), есть хендл и имя класса
А> окна,почему то не могу достать caption, использую GetWindowText//возвращает пустую
А> строку, вот код:
А> p.s.:Путь и имя запущеной программы нужны для того что бы, после того как я ее
А> убью, запустить ее еще раз подгрузив свою DLL

А>LRESULT CALLBACK CreateWindowHook(int nCode, WPARAM wParam, LPARAM lParam)

А>{
А> if(nCode < 0)
А> return CallNextHookEx(CurrentHook, nCode, wParam, lParam);

А> if(nCode == HCBT_CREATEWND)

А> {
А> char WindowClass[128];
А> char WindowCaption[128];
А> WindowHandle = reinterpret_cast<HWND>(wParam);
А> GetClassName(WindowHandle, WindowClass, 128);
А> GetWindowText(WindowHandle, WindowCaption, 128);

А> ...


А> CHAR szBuf[255]={0};

А> wsprintf(szBuf, "CreateWindow is hooked: %s", WindowClass);
А> MessageBox(0, szBuf, "!!!", 0);

А> }

А> return CallNextHookEx(CurrentHook, nCode, wParam, lParam);
А>}
Но лучше было бы получить строку запуска т. к. EXE может быть WORD, EXCEL и ....., а нужен сам файл.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.