Мне нужно загрузить DLL сразу во все процессы (кроме совсем недоступных системных), для этого использую глобальный хук, только тут возникает проблема - инжект происходит не сразу и не во все процессы. Пробовал хук на WH_CBT, WH_MOUSE - DLL загружается только когда пользователь активирует окно, а для некоторых процессов - вообще никогда, например explorer.exe и некоторые другие, что очень важно. Если же использовать CreateRemoteThread, то DLL загружается без проблем в данные процессы. Почему хуки работают не для всех процессов, и как это исправить не используя загрузку в каждый процесс по отдельности? Мне нужно чтобы DLL загружалась и во вновь запускаемые процессы, поэтому вариант с вызовом CreateRemoteThread для каждого выполняемого процесса отпадает... Операционная система - Vista 64bit, может быть что-то не так именно в висте? Если нужена какая-нибудь часть кода хуков - могу выложить.
Конечно не во все, а ты думал? На процессы, исполняемые на другом десктопе - глобальный хук не распространяется
Smarts, в случае инжэкта через хук, для висты почитайте про Integrity Level. потому и невовсе грузится. ну и десктопы само собой
Если я правильно понимаю, различные десктопы используются в случае нескольких залогиненных юзеров. Если же есть только один юзер, то мой процесс с хуками должен запуститься на десктопе с остальными процессами, которые видны в его диспетчере задач? Почему тогда инжект происходит всего в несколько процессов? Какой метод используют антивирусы и прочие защитные программы в своей user-mode части для поддержки длл загруженной во все процессы вне зависимости от десктопов и прочих факторов?
Smarts сервисы например на отдельном десктопе запускаются. неа, там различные window stations и +1 к предложению WIN32
Недавно видел прикольный способ инжекта во все процессы: 1. При запуске - енумерация всех процессов + CreateRemoteThread. 2. Внутри процесса хукаем CreateRemoteThread 3. CreateRemoteThread вызывается при создании дочернего процесса (CreateProcess), в хуке CreateRemoteThread аллокируем память в новом процессе и передаем туда управление. Таким образом будут "заражены" все существующие процессы + все новые.
WIN32 Можно так пройтись по всем процессам, но мне нужно чтобы DLL загружалась и в новые процессы, иначе достаточно выгрузить инжектнутый процесс и загрузить снова - DLL в нем уже не будет. katrus Спасибо за совет, может быть так и сделаю. Кстати, какой метод обычно используют антивирусы и различный защитный софт для поддержки своего user-mode компонента во всех процессах? Например, Outpost Firewall имеет драйверные хуки и DLL, у Касперского вроде также.
...а есть еще HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs примитивный до безобразия способ... любая прописанная тут длл автоматом загружается во все запускаемые процессы. Или почти во все.
Smarts Извини конечно, но ты определись что ты хочешь, в начале ты написал Мне нужно загрузить DLL сразу во все процессы (кроме совсем недоступных системных), для этого использую глобальный хук, только тут возникает проблема - инжект происходит не сразу и не во все процессы.. делай так как я сказал, в своей DLL будеш хукать создание новых процессов и в недряй туда свою DLL.
Если тебе нужно инжектить свою dll во все процессы в т.ч. при загрузке, можно сделать так: откл. WFP, пропатчить секцию импорта например kernel32.dll вписав туда DllMain из своей dll и все. Патчер можно прописать в своей dll или в отдельной проге. Метод палевный, т.к. его сразу обнаружит даже то же Outpost но о скрытности и своей конкретной цели ты не писал. Если хуками, то хукай shell при загрузке: SetWindowsHookEx(WH_GETMESSAGE,HookProc,(HINSTANCE)hm,GetWindowThreadProcessId(GetShellWindow(),NULL));