Я уже задавал этот вопрос, но никто конкретного ничего не написал.
Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук),
хочу перед созданием приложения подключать свою DLL с перехватом CreateFile.
DLL уже готова, для отдельно взятой программы могу подключить, все работает,
но нужно для всех!!!!!!!!!!!
Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего
другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват
создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм.
или ссылку на статью с таким вопросом.
Здравствуйте, Stig, Вы писали:
S>Я уже задавал этот вопрос, но никто конкретного ничего не написал. S>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук), S>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile. S>DLL уже готова, для отдельно взятой программы могу подключить, все работает, S>но нужно для всех!!!!!!!!!!! S> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего S>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват S>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм. S>или ссылку на статью с таким вопросом.
Что мешает создать CBT хук
обработчик в первом приближении:
Здравствуйте, Stig, Вы писали:
S>Я уже задавал этот вопрос, но никто конкретного ничего не написал. S>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук), S>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile. S>DLL уже готова, для отдельно взятой программы могу подключить, все работает, S>но нужно для всех!!!!!!!!!!! S> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего S>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват S>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм. S>или ссылку на статью с таким вопросом.
--
Можно попробовать использовать kernel-mode функции PsSetLoadImageNotifyRoutine или PsSetCreateProcessNotifyRoutine.
Здравствуйте, 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:
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?
а, вот кстати ссылка по теме
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.
спасибо вам огромное за код.
По этому поводу есть еще пара вопросов, подскажите кто знает...
1)почему я не могу убрать из этого кода вызов MessageBox, как только это делаю
программа начинает ругаться: 'Access violation at address 00000000. Read of address
00000000'
2)как перехватывать открытие только главного окна, не трогая дочерних!!!!!!!!
3)как получить имя EXE'шника(и путь тоже было бы не плохо), есть хендл и имя класса
окна,почему то не могу достать caption, использую GetWindowText//возвращает пустую
строку, вот код:
p.s.:Путь и имя запущеной программы нужны для того что бы, после того как я ее
убью, запустить ее еще раз подгрузив свою DLL
Здравствуйте, Геннадий Майко, Вы писали:
ГМ>Здравствуйте, Stig, Вы писали:
S>>Я уже задавал этот вопрос, но никто конкретного ничего не написал. S>>Мне надо перехватить запуск программ(всех!!!, любых!!!, нужен глобальный хук), S>>хочу перед созданием приложения подключать свою DLL с перехватом CreateFile. S>>DLL уже готова, для отдельно взятой программы могу подключить, все работает, S>>но нужно для всех!!!!!!!!!!! S>> Не посылайте на статьи RSDN(уже все есть), Рихтера тоже читал, и много всего S>>другого... Не знаю может что то пропустил. Помогите, очень надо — имменно перехват S>>создания приложений. Если кто разбирался подкинте кусок кода или хотябы алгорритм. S>>или ссылку на статью с таким вопросом. ГМ>-- ГМ>Можно попробовать использовать kernel-mode функции PsSetLoadImageNotifyRoutine или PsSetCreateProcessNotifyRoutine.
ГМ>C уважением, ГМ>Геннадий Майко.
Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .
[]
TC>Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .
Да как обычно, с тем и связано. Написали в свое время что-то вроде:
Здравствуйте, Flamer, Вы писали:
F>Здравствуйте, TarasCo, Вы писали:
F>[]
TC>>Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .
Не я только напомню — что для этого надо писать драйвер
F>Да как обычно, с тем и связано. Написали в свое время что-то вроде:
F>
Наверное задумка была очень проста — если дать всем свободный инструмент для перехвата создания процессов, то это модет очень плохо сказаться на производительности системы . По этому и ввели ограничение ... радикальный и очень эффективный метод.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Здравствуйте, Злость, Вы писали:
TC>>>Тут должен был прийти Злость и в очередной раз напомнить нам всем, что можно установить не более 8 хуков типа PsSetXXX (интересно, с чем это связано?). .
З>Наверное задумка была очень проста — если дать всем свободный инструмент для перехвата создания процессов, то это модет очень плохо сказаться на производительности системы . По этому и ввели ограничение ... радикальный и очень эффективный метод.
--
На моем компьютере, судя по приборам, установлен только один хук.
Интересно было бы узнать, сколько таких хуков установлено на компьютерах уважаемых коллег?
То, что такое ограничение документировано, позоволяет корректно обрабатывать ситуацию, когда места для новых хуков уже нет. По большому счету, это не отличается от случая, скажем, нехватки памяти при динамическом ее выделении.
[skip]
ГМ>На моем компьютере, судя по приборам, установлен только один хук.
Какой именно — если PsSetCreateThreadNotifyRoutine уже много , так как его уже не снять до следующей перезагрузки, это относится и к PsSetLoadImageNotifyRoutine.
ГМ>Интересно было бы узнать, сколько таких хуков установлено на компьютерах уважаемых коллег?
ГМ>То, что такое ограничение документировано, позоволяет корректно обрабатывать ситуацию, когда места для новых хуков уже нет. По большому счету, это не отличается от случая, скажем, нехватки памяти при динамическом ее выделении.
Интересный это ресурс получается, который можно захватить... а вот обратно выпустить уже нельзя.
С PsSetCreateProcessNotifyRoutine славо богу все легче ... его можно и освободить. Но все равно как говорится:
МалавоТО!!! Будет!!! малаваТо!
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Хотелось бы поддержать товарища <Аноним> в его желаниях:
А> По этому поводу есть еще пара вопросов, подскажите кто знает... А>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 и ....., а нужен сам файл.