Страница: 1 |
Страница: 1 |
Вопрос: Subclassing - опять проблема
Добавлено: 01.02.05 12:38
Автор вопроса: Demon | Web-сайт:
Известен хэндл окна чужой программы. Мне нужно в своей программе отловить WM_KILLFOCUS чужой программы. Покажите пожалуйста пример.
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 01.02.05 13:00
По моему субклассинг тебе не поможет. Только через ловушки.
Номер ответа: 2
Автор ответа:
Demon
ICQ: 7026585
Вопросов: 18
Ответов: 96
Web-сайт:
Профиль | | #2
Добавлено: 01.02.05 13:21
Можешь пояснить конкретно примером?
Номер ответа: 3
Автор ответа:
freeloader
ICQ: 50804884
Вопросов: 72
Ответов: 642
Web-сайт:
Профиль | | #3
Добавлено: 01.02.05 14:44
Windows Хуки, подробно написано
http://wasm.ru/article.php?article=1001024
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 01.02.05 19:36
1. Ты можешь внедрить свой код в адресное пр-во процесса и там уже все это отлавливать...
2. Ты можешь использовать глобальные хуки
Номер ответа: 5
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #5
Добавлено: 02.02.05 11:28
Ловушки тоже выполняются в адресном пространстве процесса-цели.
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 02.02.05 12:09
А то как же, просто метод внедрения будет различен, и при целенаправленном подключении библиотеки к процессу, мы загружаемся только 1 процесс, а глобальным хуком - тормозим систему
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 02.02.05 12:21
По поводу 1. Cresta показывал какие ключи нужно использовать при компиляции в MASM32. А програмно как это сделать есть код?
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 02.02.05 22:45
Это ты про что, CyRax, я что-то немножко не въезжаю... какие ключи и для чего...
Номер ответа: 9
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #9
Добавлено: 03.02.05 10:16
Насколько я знаю, можно сабклассить и другой процесс, только это нужно делать обычной dll, прописав её в реестре. Это не хук.
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 03.02.05 10:20
Subclassing is allowed only within a process. An application cannot subclass a window or class that belongs to another process.
The reason for this rule is simple: Win32 processes have separate address spaces. A window procedure has an address in a particular process. In a different process, that address does not contain the same window procedure. As a result, substituting an address from one process with an address from another process does not provide the desired result, so the 32-bit versions of Windows do not allow this substitution (that is, subclassing from a different process) to take place. The SetWindowLong and SetClassLong functions prevent this type of subclassing. You cannot subclass a window or class that is in another process. End of story.
However, there are ways you can add subclassing functionality to every process. Once you get a function inside the address space of a process, you can subclass anything in that process. There are a few ways to do this. 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. Your DLL would need some way to wake up after every event that the DLL would want to subclass after. A WH_CBT hook usually does the trick. The DLL can watch for the HCBT_CREATEWND event, then subclass the desired windows. The CTL3D sample application uses the WH_CBT hook to do its subclassing, although it does not contain the registry entry that makes subclassing a part of every process. Applications that want CTL3D can link it into their process.
Another way to add your subclassing code to every process is to use a systemwide hook. When a systemwide hook is called from the context of another process, the system loads the DLL containing the hook into the process. The CTL3D code will work for a systemwide WH_CBT hook in the same way that it works for the current thread's local WH_CBT hook.
The third way to add subclassing code into another process is much more complicated: It involves using the OpenProcess, WriteProcessMemory, and CreateRemoteThread functions to inject code into the other process. I don't recommend this method and won't go into any details on how to do it. For developers who insist on using this method, Jeffrey Richter tells me that he is planning to describe the technique in one of his upcoming Win32 Q&A columns in the Microsoft Systems Journal.
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 03.02.05 10:32
Ну там в пакете MASM32 чтобы внедрить прогу в адресное пространство другого процесса нужно компилировать с определёнными ключами. Спроси у crest'ы.
Номер ответа: 12
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #12
Добавлено: 03.02.05 10:35
LamerOnLine,
А примеры тебе случайно не попадались?
Номер ответа: 13
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #13
Добавлено: 03.02.05 11:11
Честно говоря ничего про это не слышал И успешно все внедрял
Теперь про то что говорит LamerOnLine, ты погляди Рихтера, ты видать про него уже и забыл, там оно написано, но, имхо, это плохой вариант!